さて、上記で動いているので完成・・・・とも思えるのですが・・・・、
実はキャラクター一体分、それぞれの全部の骨に SetDataでGlobal値を設定すると・・・ 良いパフォーマンスが得られません。
ICEで期待される高速化を目指すのであれば、ちょっとした工夫を施します。
それは、一旦バッファーのように 位置データ (例は良く self.BoneTransforms という値名) を格納しておいて、
そのデータを元にArrayノードを使って配置する方法が取られます。
この方法を設定するには、またかなりの改造が必要です。 それではいきますよ・・・・。
まずは、データ格納の箱を作成します。
Math>Matrix>4x4Matrix と Array>BuildArrayfromConstant を用意してつなぎ、
それを SetDataで self.BoneTransforms と新しいパラメータを作成してICETreeの最初のPort1に接続します。
BuildArrayfromConstant
のSizeには、確保する配列のサイズを指定しますが、ここでは最低でも骨の数(つまり、2)を設定しておく必要があります。
実際には、今後の拡張に備え、人体全体に使われているであろう骨の数、例えば150とか設定しておくと良いでしょう。
ここで最初に宣言していますので、後はこのパラメータにそれ以下で計算される結果がどんどん代入されていきます。
<追加情報>
どんどんと複雑になっていってしまう場合、
・見た目の簡素化、修正のし易さ、
・計算部分とシミュレーション部分との分離
・計算/処理の順番を決めておく、
などの為、別々の ICETree ノードに分けて設定していくようになります。
例のとしては、こんな具合になります。
当然ですが、Softimageの処理順番に従い、コンストラクションモードの下から順番に処理されます。↑
|
さて、お次、Arrayで位置を特定させるには ID値が必要です。
この部分の説明は は・じ・め・て・の ICE Kinematics その2 の 位置情報の選択 で既に紹介しています。
そこでは、Index値(ID値)を変えると、コーンが置かれるArray上の位置が変化した あれです。
なので、ここでは各ボーンにユニークなID番号を設定する為に、カスタムのプロパティーセットを利用します。
第1ボーン LThigh を選択して 作成>パラメーター>新規カスタムパラメーターセット を実行します。
その名前を ICEBoneParams とし、BoneID と ParentID は整数として -1〜999 範囲にし
Length は 浮動小数値 として 0〜999 とします。
一度作成してしまえば、コピぺが出来るので、各骨に 異なる BoneID値 を入れておきます。
今はあとの2つの値はここでの説明に使用していません。
で、 スクリプトの提供です。(VBS) ありがたや!! >> ConfigureICEBoneParamsProperty.vbs
グループを作成して選択状態にしてから このスクリプトを実行してください。
ICEBoneParams というカスタムプロパティーが自動的に作成されます!!!
個々に異なるBoneID値にはしてくれるようですが、他の部分と合わせて自分で再度数値を記入していってください。
|
次は、一括でデータを取得しやすいように グループを作成します。
足2つ (LThigh, LShin) を LegBone1 というグループ を作成して入れ、それを Array に渡すようにします。
<追加情報>
キャラ全体のグループ、例えば ENV_MainBody というグループがあるのであれば、
初期設定用の別 ICETree ノード ( Init_ICE_Rig と命名) にて、ENV_MainBodyグループからID値を取得して、
全体のID(BonesIDs) を最初に設定しておくと良いでしょう。 下図; 一括初期設定例
|
さて、最大の山場です。
このようにノードを組み上げて行きます。(ただし、これだけでは動きまんよ。)
では始めます。(この作業中、Boneは下図のようにきちんとした位置に表示されません)
LegBone1 GroupノードをD&Dし、新しいGetDataノードつないで、ICEBoneParams 内の BoneID を取得します。
その値(Value)をArray > Set in Array の Indexにつなぎ、結果(Result) を SetDataの self.BoneTransforms に接続します。
それをIceTree の Port2 に接続します。この時点で、 Set in Array の前の部分を 「値の表示」 にて 数値にすると、
BoneIDの値がちゃんと取れてることを表示してくれます。
Array > Build Array を Set in Array の前に配置し、そのValueに接続します。
前述の試し動きの時にあったSetDataを削除して
Bone1の結果を Value1に、
Bone2 の結果を Value2 に 接続し、
3個目の Value3 には エフェクトの位置情報を 2BoneIK を挟んで Matrix to SRT → SRT to Matrix から得た Matrix の結果を接続します。
そして、GetDataで self.BoneTransforms を Set in Array の Array に接続します。
Build Array からArray出力を 「値の表示」にて Axes にすると その位置と方向が見れます。
そして最後の仕上げです。
実は最後に各ボーン毎にもICEを設定が存在します。どのボーンにもICETreeの内容は同じです。
己にカスタムパラメータで設定していた ID値 と 格納した BoneTransforms から自分の位置を SelectArrayで導き出し、
それを自分のグローバルの位置として SetData で設定しています。
全部のボーンに付けるものなので、簡単なコンパウンド化しておきます。(名前を統一しておきます。)
Bind Deformer to ICE Rig と名前を付け、 タスク を ICE Kinematics/Rig Binding にします。バージョンは 1.3 にしておいてください。
出来たら、コンパウンドの書き出し で保存しておきます。
で、 スクリプトの提供です。(VBS) ありがたや!! >> BindRigToICEData.vbs
グループを作成して選択状態にしてから > メンバの選択 にしておきます。(全部が白色選択状態)
そして、このスクリプトを実行します。
全部の選択ボーンに自動的に Bind Deformer to ICE Rig が ICETreeに接続されています。
良く使うスクリプトは ツールバー にまとめて、ワークグループに保存すれば直ぐにみんなの共有ツールに出来ますね。
|
はい、全ての設定が終了しました。 きちんと動くか遊んでみてください。
うまく動作しましたら、お疲れ様でした!! OKです。
最初はなんでこんなに・・、と思うところなんですが、
一回動いてしまい、事情が解ってしまうと、おお♪、となるといいな・・と言ったところでしょうか・・・。