制作日記: MODOのヒートバインディングについて

スキニングでつまづく

由水桂さんのアニメーションチュートリアルを始めました。まだ最初の数十分しか進めてませんが、進むテンポや解説の粒度が初心者の自分にもわかりやすい感じがあります。

現在最初のスケルトン作成を終えスキニングの作業に入ったところです。作業にはオリジナルモデルを使用しているのですが、ジオメトリがまずいみたいで、ヒートでのバインド時にエラーが出てうまくいかず作業が止まりました。

エラー内容はこちら。

メッシュトポロジエラー: エッジは2つ以上のポリゴンからは共有できません。

……?

1つのエッジが2つのポリゴンと接続することが異常なはずがないので、おそらく"over 2 polygons"か"more than 2 polygons"を"2つ以上"と誤訳されたか、原因が別にあるのでしょう。

マニュアルの確認

公式のマニュアルを確認してみます。マニュアルを見るとヒートにはいくつかの制約があることがわかりました。以下はマニュアルの引用です。

引用: バインドとセットアップモード - MODO ONLINE HELP

• Heat (ヒート) - メッシュアイテムのトポロジとジョイントの相対関係を考慮したバインド方法です。バインドするメッシュアイテムが以下の条件を満たしている場合、これがもっとも優れたバインド方法になります。
• メッシュアイテムがひとつの塊であること。ただし眼窩のような穴があっても構いません。
• メッシュアイテムがポリゴンのみで形成されていること。どのポリゴンにもつながっていない頂点やエッジやカーブが残っていると、うまくいきません。
• 頂点、エッジ、ポリゴンを複数のコンポーネントが共有していないこと (多様体モデルであること)。
• すべてのジョイントがメッシュアイテムの内部に埋もれていること。
ヒート で バインド を行ったときにエラーが発生すると、ポップアップにエラーメッセージが表示されます。それが意図しないメッシュ上の不具合であれば、ほとんどの問題は Mesh Cleanup (メッシュクリーンアップ) コマンドで解決できます。エラー箇所は、このコマンドを終了したときにハイライトされるので、その部分を修復してください。もうひとつ、Solver Error (ソルバーエラー) と表示されるエラーがあります。これは、同じメッシュアイテムレイヤーに複数のメッシュが含まれている場合、とくに、それらが重なっているときに発生します。
わかりやすい例としては、2 つのプリミティブ球体が同じレイヤー内で重なっている場合です。このようなソルバーエラーは、メインのメッシュにだけウェイトを与えることで解決できます。たとえばキャラクタの場合なら、目や髪の毛や衣服といった他の要素はすべて別のレイヤーに移して、皮膚アイテムだけをバインドするようにします。

相対関係というのは、原文ではrelative positionとなっていたので、絶対位置の距離だけを考慮するのではなくメッシュの形状を考慮してジョイント間がどれぐらい離れているかを計算するということでしょう。その下に条件が列挙してあります。

  • メッシュアイテムがひとつの塊であること
    • 塊、つまり、体積がない板ポリのような形状は想定されていないようです。
  • メッシュアイテムがポリゴンのみで形成されていること。どのポリゴンにもつながっていない頂点やエッジやカーブが残っていると、うまくいきません。
    • ところで原文ではpolygonalという単語が使われていました。一般にn-gonはpolygonalに含まれるんでしょうか。
  • 頂点、エッジ、ポリゴンを複数のコンポーネントが共有していないこと (多様体モデルであること)。

    • 最初のエラーメッセージはこの制約に引っかかったことを示すエラーでしょう。
    • 多様体ジオメトリには以下のようなものがあるようです。
      • 閉じた形状になっていない
      • 隣接するポリゴンの法線が逆方向
      • 複数のコンポーネントが頂点やエッジのみで接続されている
        • たとえば2つのキューブが1つの頂点または1つのエッジだけでくっついているような形状
        • 接続部に体積がないので一つ目の条件も満たしません。
      • 1本のエッジに3つ以上のポリゴンが接続されている
        • 最初に書いたエラーメッセージはこれのことですね
        • 調べ方: 3つ以上のポリゴンで共有されているエッジの数はこちらで確認できます。 「状態 > エッジ > ポリゴンで」を開き、3以上を確認 https://i.gyazo.com/5a6812dc9d2e6acddbed45488889ffb6.png
  • すべてのジョイントがメッシュアイテムの内部に埋もれていること。

自分がバインドを試したメッシュは、エラーメッセージにあるような不正なジオメトリは確認できませんでしたが、髪に板ポリを使用していたので確かにヒートの要件を満たしていませんでした。

また、その下に注意書きがありますが、同じレイヤーにプリミティブ球体を2つ重ねるだけでソルバーエラーが起こるそうです。

要件の検証

いくつか気になるパターンを確かめてみました。

条件に合わなくてもエラーにならなかったり、エラーメッセージが不適切なように見受けられるケースがありました。

今回エラーにならなかったパターンももっと複雑になってくるとエラーになったりするのかもしれないことにご注意ください。

n-gonが存在する場合

https://i.gyazo.com/320a8b916d9b6212e8549f0e14da8aed.png

  • エラーなし

1本のエッジに3つ以上のポリゴンが接続されている場合

https://i.gyazo.com/772edf0414c29fc0c01dd8451c3f0cc4.png

  • エラーあり
    • メッシュトポロジエラー: エッジは2つ以上のポリゴンからは共有できません。

確かに3つのポリゴンと接続しているエッジが存在することを確認できました。

https://i.gyazo.com/a15c9f4cc228b62a4dc4e4d961c82b6f.png

それならばと1枚ポリゴンを削除して無理矢理2つのポリゴンと接続する形に変更してみました。

https://i.gyazo.com/19b9d9540f95202571c17c89fe64ca16.png

3つ以上のポリゴンと接続するエッジは0と表示されています。

閉じてない形状が不正である判定されることを期待しましたが、同じエラーメッセージが出ました。

開いた形状の場合

https://i.gyazo.com/184425a226be6b5cccc154c73f7d1141.png

  • エラーなし

同じレイヤーにプリミティブ球体が2個重なって存在する場合

https://i.gyazo.com/2cdd8cb73625f5f979979bbc05ee9ece.png

  • エラーなし

ソルバーエラーを期待しましたが出ませんでした。複雑に重ねると出るのかもしれません。

浮遊頂点が存在する場合

画像省略。

  • エラーあり
    • メッシュトポロジのエラーを検出しました。ウェイトをつける前に「メッシュクリーンナップ」コマンドを実行してみてください。

隣接するポリゴンの法線が逆方向を向いてる場合

ポリゴンを2枚反転してみました。

https://i.gyazo.com/531321e074069a478216069379b9dc46.png

  • エラーあり
    • メッシュトポロジエラー: エッジは2つ以上のポリゴンからは共有できません。

ジョイントがはみだしている場合

https://i.gyazo.com/88f7a54478aa557ad69a2012c791bb24.png

  • エラーなし

結論

条件を満たしていなくてもエラーにならなかったり、エラーメッセージが合っていなかったり、よくわからないケースがいくつか見られました。

複雑なコンポーネント群をまとめてバインド!といった使い方ではなくて、連続した1つの閉じた塊のコンポーネントごとにレイヤーを分けてバインドする、みたいに細かく限定的に使用していくのが無難なように思いました。