2018/03/13
クラスターの軸を変えてみる
先日はセミナーへのご参加、ありがとうございました!
たくさんの方々とお会いできてとても刺激になりました。
後日、ボーンデジタルユーザーの方限定でセミナー動画が公開されるようです。
ご興味のある方は是非ご覧ください。
クラスターのメリット・デメリット
さて、今回はクラスターに関するテクニックをご紹介します。
私はこれまでクラスターを
・めり込み修正のコントローラ作成
・スプラインIK
などで使用していましたが、
ラティスやクラスターなどのデフォーマーはゲームエンジンへの出力が困難、
といった理由から、最近はジョイントで対応することが多くなりました。
クラスターには、良い点と悪い点がありますが、
良い点
- お手軽。
- スキンクラスターと共存できる。
- クラスターのウェイト値が個々に依存しない。
- Relativeアトリビュートで親の動きを相殺できる。など
悪い点
- World軸で作成されるので軸の変更が面倒くさい。
- FreezeTransformationsが実行された状態で作成される。
- ゲームエンジンへの出力が困難。
- 流用や移植が面倒。など
軸の変更ができないのはとても不便ではないでしょうか?
また、FreezeTransformationsされた状態で作成されるので、
matrixを取得する際にとても厄介です。
その他にも、
クラスターの格納場所を変更する度にデフォームが壊れる、
親に自動でトランスフォームノードが作られる、
など、なかなかの曲者です。
今回は、これらの問題の解決方法をチュートリアル形式でご紹介します。
クラスターの軸を変えてみる
① 任意の個所にクラスターを作成します。
クラスターのトランスフォームノード名をclusterHandle、
クラスターノード名をclusterHandleClusterに変更します。
トランスフォームノードであるclusterHandleのアトリビュート値を確認すると、
Translate、Rotateが0に設定されておりFreezeTransformationsが実行された状態です。
② 任意のコントローラを作成し名前をctrlに変更します。
PointConstraintを実行してコントローラをクラスターの位置に移動します。
③ コントローラを好きな角度に変更し、
親にトランスフォームノードを作成してコントローラの値を移植します。
親ノード名をctrl_spaceに変更します。
※セミナーでもご紹介しましたが弊社ではスペースノードと呼んでいます。
④ クラスターをドラッグ&ドロップでctrl_space内に格納します。
クラスターのウェイトを調整していた場合、デフォームが壊れますが無視してそのまま進めます。
⑤ clusterHandleのTranslate、Rotate値を0に変更します。
その後、clusterHandleにFreezeTransformationsを実行します。
クラスターのウェイトを調整していた場合、再度Translateに値が設定されるので0に変更します。
⑥ クラスターノード (clusterHandleCluster) にはbindPreMatrixというアトリビュートが存在します。
こちらのアトリビュートを使用して初期値をリセットします。
ctrl_spaceのinverseMatrixをclusterHandleClusterのbindPreMatrixに接続します。
⑦ デフォームが初期状態に戻りました。
この時点でbindPreMatrixへの接続は必要なくなったので、
接続は解除しておきましょう。
⑧ クラスターのピボットがコントローラの位置からずれています。
位置を合わせましょう。
clusterHandleのLocalRotatePivot、LocalScalePivotの値を全て0に変更します。
※下図は0に変更する前の状態です。
⑨ クラスターハンドルがコントローラの位置からずれています。
位置を合わせましょう。
clusterHandleShapeのOriginの値を全て0に変更します。
※下図は0に変更する前の状態です。
⑩ 最後にコントローラとクラスターのTranslate、Rotate、Scaleを接続して完成です!
まとめ
クラスターは工夫次第で色々と活用できます。
これを機にクラスターで色々と検証してみましょう!
次回はセミナーでご紹介したmatrixについてご紹介する予定です。
※免責事項※
本記事内で公開している全ての情報について、その完全性、正確性、適用性、有用性等いかなる保証も行っておりません。
これらの情報のご利用により、何らかの不都合や損害が発生したとしても、当社は何らの責任を負うものではありません。
自己責任でご使用ください。