CG・コンテンツ制作
  1. CG・コンテンツ制作トップ
  2. DAIKIN CG Channel
  3. UsersNotes
  4. ICE
  5. はじめての ICE Kinematics もう一回(その4);My First ICE Kinematics Again (No4) 
SUITE USERS NOTES
は・じ・め・て・の ICE Kinematics もう一回(その4)
(My First ICE Kinematics Again)
ICE_kine_01ritaro_ml

プロローグ

今回は、"もう一回" ICE Kinematics です。
ICEの基本的な機能についてと、 Softimage 2011 での取り扱いが少し変化したところへの対応とします。
この"もう一回"編 ICE ノードを使って基本的な情報を得たり設定できたりする便利ツールの作成を中心にしてみましょう。
ここに紹介しているものは直ぐに使えるはずですよ。

さー、もう一回 基礎から挑戦してみましょう。

0)コンパウンドの置き場所
 >共有ワークグループ

1)Expressionとの違い
 >データ取得例;距離 = カスタムパラメーターデータ取得例;距離 = ICE
 >データ取得例;距離 = ICE

2)三角関数
 >角度とラジアン
 >Tan(タンジェント)ノードの検証

3)値の取得について
 >回転値の注意
 >グローバル値からローカル値の取得

4)SetDataはグローバル値 (2011からの仕様変更)
 >ローカル座標値の設定 プラグイン大公開!!
 >ICE組み上げ、コンパウンド化 その1 コンパウンド大公開!!
 >ICE組み上げ、コンパウンド化 その2 コンパウンド大公開!!

パソコンのスペック WindowsXP SP3、Intel Core2Duo 3G、RAM; 3G、NVIDIA Quadro FX1700



コンパウンドの置き場所
ワークグループ
独自に作成したICEノードはコンパウンドとして1つにまとめることができるので、
コンパウンドの書き出しで保存するその保存先は製作チーム全員が共有設定しているようなワークグループにするのが便利です。
個人作成の場合でも、Softimageのマイナーバージョンアップに対応して、立ち上げれば直ぐに使えるように出来る
という意味でワークグループに書き出ししましょう。
ICE_kine_400
新しく作成した ICEコンパウンドにも、きちんと名前カテゴリー名タスク名を記述しておくと、指定した場所に登録され、
ノードの表示に”W”とワークグループのものであると解るようになりますので、整理整頓しておきましょう。
バージョン管理も出来ますので、1.0~番号を上げていき、過去番号に戻って使用することも出来ます。
ICE_kine_401
コンパウンドの置き場所とその役割が解りましたらスタートです。



Expressionとの違い
データ取得例;距離 = カスタムパラメーター
従来からあるシーン内のデータを得る方法として最も良く利用されるのがエクスプレッションです。
例えば、2個のオブジェクト立方体と球の距離を求めるのであれば、このように設定する↓と出来ました。(コレも参考になる?)

立方体を選択した状態で、
Animateモジュール > 作成 > パラメーター > 新規カスタムパラメータセット[C]カスタムパラメーターを作成します。
Animateモジュール > 作成 > 新規カスタムパラメータDistance とか任意の名前を作成します。
そこにエクスプレッションでctr_dist( cube.kine.global.pos, sphere.kine.global )を定義します。
PPGはダブルクリックすればどこにでも表示出来ます。
ICE_kine_402
また、カスタムパラメーターの名前にDisplayInfoと書くと、カメラのカスタム情報で表示をONにしておくと
画面に表示され、尚且つスライダーで値を変更できるようになるのをご存知でしょうか?
ICE_kine_403
これだけでも便利そうなのですが、やはりICEを知ってしまうと、
これとは比べるべくもなく便利で簡単に設定でき、
尚且つ、得た情報をもっと色々と他に有効利用できるというのを次にお見せします。



データ取得例;距離 = ICE
同じ、2個のオブジェクト立方体と球のシーンとします。
立方体にICEを設定します。立方体を選択した状態から、Alt+9キー > 作成 > CEツリーです。
2つのオブジェクトのグローバル値をD&DでGetDataし、Matrix to SRT で移動値を分離し、GetDistanceBeteen ノードに2つをつなぎます。
それをSetDataでself.distance という新しい任意のパラメーターを作成して接続します。それをICETreeのPort1につないで完成です。
あとは途中のGetDistanceBeteenから出ている接続線上にて値を表示するということをするとシーン上に数値が表示されます。
ICE_kine_404
これを見ると、ICEはデータ取得方法が
いかに簡単で、どんどんと加工しやすくて、アニメーションに有効利用出来そう・・・
ということか理解できるかと思います。
では、ここから発展させて色々と付加価値をつけてみましょう。

Subtract(減算)というノードを取り出し、立方体の Translation を Second に、球の Translation を First に接続して、
それをSetDataでself.dist_vector という新しい任意のパラメーターを作成して接続します。
すると、どうでしょう。簡単に立方体から見た球の相対的な移動値(ローカル値)が得られますね。
ICE_kine_405
では、回転値での例にしてみます。
同じ風にしてSubtract(減算)というノードを取り出し、立方体の Rotation を Second に、球の Rotation を First に接続して、
それをSetDataでself.rot_vector という新しい任意のパラメーターを作成して接続します。
すると、簡単に立方体から見た球の相対的な回転値(ローカル値)が得られますね。
ICE_kine_406
次は少し工夫が必要なもの、2点間から得る回転値を使って、立方体から見た球の角度を求めます。
Increment Rotation with 2 Vectors というノードを取り出しておきます。
立方体からのグローバルの回転値を新しい Matrix to SRT から得て、Rotation をRotation につなぎます。
そして、さっき位置のSubtract(減算)から得た球の相対的な位置のデータをTo Vectorに接続します。
それをSetDataでself.dir_rot という新しい任意のパラメーターを作成して接続します。
簡単に立方体から見た球の方向の角度が得られますね。
ICE_kine_407
こうして得られるデータ群を良く使うのであればコンパウンドとして用意してしまいましょう。
こんな風に1個にまとめることが出来ます。この状態でコンパウンドの書き出しで共有ディレクトリーに保存してしまいます。
ICE_kine_408
中身はさっき作った通りのものです。
左側の入り口部分と右側の出口部分に名前をちゃんと入れて解りやすくしておきます。あ、コンパウンド名カテゴリー名 も入れましょう。
左側黒い点線で接続部がreferenceに接続しておけば、ノードをダブルクリックするとオブジェクトをピック選択できるPPGになります。
ICE_kine_409
これが完成したコンパウンドです。 >> GetRot_Trasbetween2Objects_xsicompound.zip



三角関数
角度とラジアン
時々、算数が出て来るのかICEですね。
私からも1つ、三角関数に役立つかも知れないものを作成してみましょう。
角度からラジアンを作るものです。
半径とその同じ長さの外周になるような角度が 1rad(ラジアン)です。
ICE_kine_411
そして弧度法では2π(rad) =360゜となっています。

角度 0 30 45 60 90 180 360
ラジアン 0 π/6 π/4 π/3 π/2 π

つまり、ラジアン = 角度 * π/ 180あるいは角度 = ラジアン * 180 / πってなります。
ICEで実験してみましょう、半径4のポリゴン円をUのサブディビジョンを360とする円盤を作成します。
範囲(角度)でU方向開始0が時計で3時の場所(X軸のプラス側)から始まって、U方向終端が360で一周になるようにしました。
その円盤ポリゴンにICEを設定します。
下図のように、π180で割って、入って来る角度と掛け算すれば良いですね。このDeg To RadノードがConversionの中にあります。
ICE_kine_410
で、検証したいのは、”1ラジアンは度数法で測ると約57.29578度に相当する”、って書いてあるので、角度にこの数値を入れてみます。
お見事、ラジアンは1を示しています。当たり前か・・
おまけに、角度の値を U方向終端値 self.polymsh.geom.enduangle に SetData 出来るので、ここでは角度を入力すると円がぐるっと描かれていきます。
ちなみに、角度360°の時は、ラジアンは 6.2832 と表示されます。つまりです。
ICE_kine_412


Tan(タンジェント)ノードの検証
サイン(Sin)・コサイン(Cos)・タンジェント(Tan)の話です。
タンジェントって覚えていますでしょうか?(中2~高1だそうです)ICEではTanというノードがあります。
ICE_kine_414
で、タンジェントの角度距離が解っていると高さが求められるって話なんです。
ICE_kine_413
良くある例題で、

ICE_kine_415
”身長160cmの人が5m離れた位置から木を見上げた時に、その角度が 40度だった場合の木の高さを求めよ”

なんてのがあります。
答えは579.549cm(木の高さ=距離xTanθ+160cm)なんですが・・・。って、このキャラ160cmだったの・・・?ちぃっ・・

プログラミングの世界ではラジアン角を使うのですが、ICEのTanノードではどうなのか見てみますと、あらま、通常の角度を使うようです。
ICE_kine_416
ちょっとした実験でした。
キャラクターの建物とかの対比に役立つかも??です。



値の取得について
回転値の注意
今更、ここで書くのか??って感じですが、回転値の設定についてちょっと注意して欲しい点を書きます。
スケール値(Scale)と移動値(Translate)は足し算・引き算・掛け算など単独の軸X,Y,Z毎に計算させるなどして良いものですが、
回転値(Rotation)その軸だけの計算では駄目です。必ずX,Y,Z全部を計算させる(Matrix)を使ってください。
もう1つ、下の例のようにグローバルの回転値を自分から得て、それを自分に設定するとループが生じてしまいます。
設定する値がどんどんと計算されてグルグルと回ることになること、注目してください。
ICE_kine_423
そこで、自分から得る回転値を自分に設定したい場合は、その初期値を使うことによりループを回避し、
その初期値こそStatic_KineState(静止キネマティクス状態)を利用する理由なんです。(取得 > プロパティー > 静止キネマティクス状態)
ただし、この値はグローバル値であると認識してください。エンベロープを設定するとここにグローバル値が代入されます。
球にエンベロープを付けると Static_KineState にはグローバル値が代入される

ICE_kine_424

グローバル値からローカル値の取得
今更、ここで書くのか??第2弾です。
親子構造になっている子のローカル値をグローバル値から得るには、逆行列(inverse matrix)に設定して求めます。 (高等学校数学C)
既に上記で一旦説明している部分↑(Subtract)は親に回転値が無い場合です。
親に回転値が付くことを考えてきちんとローカル値を得るにはこのように設定します。
(Rotation to Euler とEular to RotationはXYZ回転値を表示する為だけのもの;通常不必要)

ICE_kine_431



SetDataはグローバル値(2011からの仕様変更)
ローカル座標値の設定プラグイン大公開!!
さて、このチュートリアルのメインディッシュでございます。
より実践に近い例でしょう。
そもそもこんな場面に遭遇しない、設定しない方には何の事やら、となるぐらいの話なんですがね。

皆さん、お気付きでしょうか?実は大きな仕様変更が2011にあります。
それは、これまた制限があるのですが、大体のローカル値はGetDataで取得できるのですが (なんと曖昧な表現)
SetDataを使ってローカル値を設定出来なくなっています。
特に困るのは、キャラクターアニメーション用の関数がローカル座標値設定だったりすると、
2011にてそういうシーンを開くとICEが真っ赤で動かなくなっていたりするはずです。なんで~・・・???
(2010では、ICEでサポート外ながらもローカル値が設定できていました。
fmtさんのチュートリアル「XSI ICE活用 キネマティクス:01 タイヤエクスプレッション」を参照)
そこで、ここで紹介する内容は、現在のバージョンに対応すべく、
計算結果のローカル値を、設定したいローカル値になるようにグローバル値から設定する
というICEノードを組み上げ、コンパウンド化して利用できるものをご紹介します。

また、その時考えられる構造としては、
  • ローカル値を得る”オブジェクトと”ローカル値を設定する”オブジェクトが違う階層構造(親が違う)である
という場合も想定されるし、
  • ローカル値を設定する”オブジェクトにニュートラスポーズの設定が施されている
という場合だってあるでしょう。

話がどんどんと複雑になりますと・・・最後には、もっと嫌な例で、
  • ローカル値を得る”オブジェクトの得る軸が、”ローカル値を設定する”オブジェクトの設定する軸が異なる!!
    (例えばローカルX軸回転値→ローカルY軸回転値)
ってことになると、もう個別対応になったりします。

さて、初期設定値をローカル値から設定したいと思ったので、プラグインを作成してもらいました。ISZさんThanQ
DefaultLocalTransformPlugin.vbsを共有しているようなワークグループ内のPluginディレクトリーにコピーします。
例C:\users\ritaro\Autodesk\Ritaro_Addons\Application\Plugins内
すると、取得 > プロパティー > DefaultLocalTransformというメニューが追加されます。
ローカル値を得たいオブジェクトを選択した状態で実行すると、そのオブジェクトのその時のローカル値を拾ったカスタムなPPGが作成されます。
便利そうでしょ。
ICEを設定してローカル値を設定したいオブジェクトにこのカスタムPPG;Static_KineState_Localが設定されているとして話が進みます。
ICE_kine_432


ICE組み上げ、コンパウンド化 その1 コンパウンド大公開!!
まずは想定している場面;シーンを作ってみます。
この例では親が同じですが、別でもかまいません。
ローカル値を得る”オブジェクトが黄色のCylinderのローカル回転値です。左端にある中心点で回転します。
ローカル値になるようにグローバル値から設定する”オブジェクトが赤色の球で
上部に表示している黄色い数値がローカルに設定したい数値です。
赤色の球の中心点は自分の所にありますが、その親の回転の影響も当然受けます。
ICE_kine_420
親の立方体と子の球も共に回転した状態は、このようになることが想定されます。
ICE_kine_421


では、スクラッチ(何も無い状態)から作成していきましょう。

まずは、球にICEを設定します。Alt+9キーにてICETree画面を表示させ、作成 > Iceツリーです。
そして、影響を与えるローカルの回転値を円柱から取って来ます。(エクスプローラーからドラッグ&ドロップするだけ)
それをScalar to 3D Vector につなぎ、そのVectorをEular to Rotation に変換しています。
Scalar to 3D VectorEular to Rotationノードの間に値の表示をしておきます。
この値が球のローカル値に設定したい値になります。
ICE_kine_433
次は、自分である球の初期値(ローカル値)をStatic_KineState_Localから得ます。
面倒ですが、9個の値を取得します。(一括で取れない)
3つの組をScalar to 3D Vector につなぎ、回転値だけVectorをEular to Rotation で変換して、先の回転値とMultiplyで結合します。
Get sphere-GetaData -と分けてデータを取得しているのは、ここでコンパウンドを作成することを想定しているからです。
ICE_kine_425
それらを SRT to Matrix にまとめます。
次は、親である立方体のグローバル値を取得します。ローカル値というのは、親からの相対値だからですね。
親のグローバル値(絶対値)が解れば、その子供のグローバル値(絶対値)がローカル値から得られます。
Matrixのまま、上でまとめたMartixとMultiplyで結合して、球のグローバル値として設定します。
ICE_kine_426
もうひと工夫します。
もしこのローカル値を設定したい球にニュートラルポーズが設定されていた場合のことです。
球のニュートラスポーズの回転値を接続できるように SRT to Matirx の間に更にMultiplyで挟み込み
IFノードで使う時に回転値が行くように設定します。
ICE_kine_427
そうしたら、ここまでをコンパウンドにまとめると、こんな感じになります。↓
ICE_kine_434
皆さんが個別に使用している関数や変数はここ ↓ に設置すれば、
ローカル値から計算した回転値を、設定したいオブジェクトにローカル値として設定できるという風になります。
ICE_kine_428
これが完成したコンパウンドです。 >>  Input_XYZ_2LocaROT.2.0.xsicompound.zip



ICE組み上げ、コンパウンド その2 コンパウンド大公開!!
今度は、また少し複雑です。軸毎に値の代入をOn/Offしたり、軸毎に値を設定したい場合です。
こんな感じでコンパウンドとしてまとめてみました。
ICE_kine_429
そんな中身はこんな感じですが、各軸毎に分解して計算して、IF文を挟んで、また元に戻しているだけです。
X軸の値をZ軸にする・・など、組み替えをすれば個別対応できるはずです。
ICE_kine_430
これが完成したコンパウンドです。 >>  LocalROTMultply_from_xsicompound.zip

使い勝手が自分好みでない場合は、カスタマイズすれば良いだけです。

という訳で、またICEのキネマティクスをより実践に近いかたちで紹介できました。
お次は何?キャラ??
乞う、ご期待!!
戻る 次へ

お気軽にお問い合わせください

Daikin CG News お申し込み

CGクリエイター向けのセミナー・イベントやキャンペーン、製品情報をメールマガジンでお届けします。(登録無料)

Twitter

ページの先頭へ