TVここまでジョイントとスキニングの基本知識、実際に効率的にスキニングする方法を見てきました。ゲームのキャラモデルを良い感じにスキニングできそうでしょうか?今回と次回はスケルトンとスキニングにまつわる、ちょっと説明していなかったお残りを紹介してみたいと思います。前に、ゲームの話を増やそうということで、まずゲーム制作でのジョイントとスキニングにまつわる話をひとつ。ゲームではデータの使い回しが多いですし、使い回しの多い方が作業自体の効率も、リアルタイム処理での効率も良くなりますのでとにかくそれを考えながらデータの作成を始めます。一つのスケルトンの名前ルール、ジョイント位置、ジョイント数などの仕様を決めたら、あらゆる所で使いまわします。ゲームはバージョンアップしながら何年も続けてリリースすることもあるので、映像以上にデータの再利用率が高く、なかなかデータの構造を変えることができません。うっかり変えてしまうと、バグとして問題を起こすこともあります。始めに決めたスケルトンの仕様が延々と残り続けて、最後には「負の遺産」と言われる有り様になることもよくあります。その「負」たる理由は様々ですが、やっぱり「謎の構造」があると良くないですね。すべてのジョイントがメッシュを変形するために用意してあれば良いのですが、不要な親子構造、プログラマとのやり取りの中で追加された謎のルール、その時は必要だったけどのちのMayaのバージョンアップや、プログラムの最適化で必要なくなった何か、そういったものが「負」になり得ます。何年経っても必ず言えるのは「変形に使用するジョイント」は絶対にスケルトンに必要ということです。これまで見てきた通り、メッシュの変形に最低限必要なジョイントでスケルトンを作ることが大切です。すれば処理のスピードだけでなく、将来のメンテナンス性も良くなります。将来もっと複雑なアニメーションをさせたりするのは「リグ」がやってくれます。スケルトンをシンプルにすることで、リグのバリエーションを増やしやすくなります。この話は結構、いや、かなりややこしいのでまた今度特集したいと思います。残りの話に行きましょう。決める作業があります。このうち特に面倒なのが「方向」です。Orientで回転させるという手順。ジョイントの進行方向が+Xになるようにするという決め事。いった仕様が作業を難しくします。「位置」「数」から始めてみましょう。最初に適当でいいので位置だけ決めるためにジョイントを作ります。ジョイントの方向を気にしなくていいのなら、好きにジョイントを足したり捨てたり移動したりできます。コレを自由にできることが品質向上につながります。このスケルトンは一時的なものとして「捨てる」ことを前提に作ります。ジョイントの名前も気にしなくて大丈夫です。Jointで左右対称方向に複製します。適当にバインドして、変形がうまく行きそうか確認します。スキンウェイトは適当で大丈夫です。全体的な変形の傾向だけ見ます。脇のあたりとか、ジョイントがもうちょっとあったほうがいいかなとか思えば追加してみます。頭の中で想像するだけでは難しいですが、こうして変形してみるとどこにジョイントが必要そうかすぐに分かるのでやって見ることが大切です。最後にスナップの機能を使いながらジョイントをルートから作り直します。Mayaは作成しているジョイントの方向を見て、自動的にジョイントの角度を設定してくれます。下の左図でハイライトされているジョイントは仮ジョイントにスナップして作り直したジョイントです。右図はそのジョイントの位置をずらしてみたものです。軸の方向が微妙にひっくり返ったりしてますが...。少なくともTranslateX以外のYZ値、Rotate値は0のままなので、ずいぶんとデータはキレイです。Orientに180とか値が入っていると思いますので、これを0にします。Xに180が入っています。180を0にすれば当然子供のジョイントも回転してしまって位置が変わってしまいます。子供をUnparentします。Orientを変更できます。これならジョイントの位置を保ったまま軸の値をきれいにできます。Constraintを使ってジョイントの方向を設定することもできます。Orient値にコンバートされるのできれいなデータになります。そんな感じで微調整していきます。モデリングやアニメーションと同じで、こうしてラフなデータから整形したデータを作るアプローチを忘れないようにすると、他のことでも効率的に作業出来ると思います。恐怖!スキンウェイトが消えるMayaの怪談話、時々聞く恐ろしげな話があります。あるのがバインドしたメッシュでの話です。Toolでスーっとスキンウェイトを設定する。2)ガタッと音がした方にジョイントを動かす。3)ペイントをもう一度しようとすると...いないんです。さっきまでそこに白いモノがあったのに、黒くなっているんです。Editorを見ていると、無いんです。値が無いんです!設定したはずのスキンウェイトが無くなっているんです。うむ、震え上がりそうな話です。Historyを実行すれば直ります。何が原因かまでしつこく問い詰めるのがこの連載のニクいところなので、しっかり説明いたします。PolygonやSmoothなど「頂点数が増える」編集をした場合にこの問題が起きます。ヒストリを見てみるとよくわかります。先ほどのキューブのヒストリはこういう感じになっています。Clusterノードはバインドするとできるヒストリでスキンウェイトを記録しています。Polygonのヒストリです。Polygonを実行していたのです。ヒストリの各ノードでの頂点数を示すと、こうなります。「あぁ...」と気づかれた方もいるかもしれませんね。Clusterは8頂点分のスキンウェイトしか保存していません。Polygonで増えた頂点分のウェイト情報を記録できないのです。Editorでは値がない状態になっていたのです。論理的には正しいですね。Toolではペイントできてしまうのか。それは、頑張っているんです。ペイントが頑張っているのです。ウェイトを記録する場所が無いので、ペイントをやめたら値はどこかへ行ってしまいます。内部にキャッシュを持っていて、それを表示しているのではないかと想像しますが。Faceをした時です。Faceしてジョイントを動かすと空間に切れ目が残り続けます。変形したあとに切っているわけです。Clusterに保存されるようになりますので、直ります。Historyをしなければ、細分割した分の頂点にスキンウェイトを割り当てなくてすむわけで、編集の手間が省け、データも軽くなるのでそれはそれで利点があります。まとめ今回紹介したことは、これまでやってきたことの応用です。効率的に作業をするためには、やることを単純にして段取りを分けるのが大切です。問題が起きたらヒストリを見てみて、Mayaが何をしているか論理的に考えることも重要です。バグっているように思えますが、実際にはとても論理的に処理されています。それが論理的すぎてユーザーにとっての思惑と異なりバグに見えるわけですが...。Mayaに歩み寄って、解ってあげる、ことも大切ですね。逆にテクニカルな側面から見ますと、Mayaはそういう部分まできちんと探れるように、とてもオープンな仕組みで作られているので、どんな問題が起きても追跡可能なわけです。これは大きな組織で作業する場合、確実に問題をつぶしながら安定してプロジェクトを進めるために重要なことです。小さなプロジェクトであっても、問題究明が迅速に行われることは良いことですから、そういう面でもMayaを見てみると面白いと思います。次回は、これも悩みどころなスキンウェイトのコピー、保存の方法を見ていきたいと思います。読んで触ってよくわかる!Mayaを使いこなす為のAtoZ第26回:スキンウェイトのコピーと保存2012.04.09キャラを作った、骨を作った、バインドもした。30日間無償で体験できます。30日間無償で体験できます。製品のご購入に関してご連絡を希望される場合は、こちらからお問い合わせください。