<< TOP



は・じ・め・て・の  ICE Kinematics もう一回 (その4)
 (My First ICE Kinematics Again)
                

 プロローグ





コンパウンドの置き場所
 ワークグループ
     独自に作成したICEノードはコンパウンドとして1つにまとめることができるので、
    コンパウンドの書き出し で保存するその保存先は 製作チーム全員が共有設定しているような ワークグループにするのが便利です。
    個人作成の場合でも、Softimageのマイナーバージョンアップに対応して、立ち上げれば直ぐに使えるように出来る
    という意味で ワークグループに書き出ししましょう。



     新しく作成した ICEコンパウンドにも、きちんと 名前 や カテゴリー名 タスク名 を記述しておくと、指定した場所に登録され、
    ノードの表示に ”W” とワークグループのものであると解るようになりますので、整理整頓しておきましょう。
    バージョン管理も出来ますので、1.0~番号を上げていき、過去番号に戻って使用することも出来ます。



     コンパウンドの置き場所とその役割が解りましたら スタートです。
     



Expressionとの違い
 データ取得例;距離 = カスタムパラメーター
     従来からあるシーン内のデータを得る方法として最も良く利用されるのが エクスプレッション です。
    例えば、2個のオブジェクト 立方体 と 球 の距離を求めるのであれば、このように設定する↓と出来ました。 (コレも参考になる?)
       
      立方体を選択した状態で、
      Animateモジュール>作成>パラメーター>新規カスタムパラメータセット で [C]カスタムパラメーターを作成します。
      Animateモジュール>作成>新規カスタムパラメータ で Distance とか任意の名前を作成します。
      そこにエクスプレッション で ctr_dist( cube.kine.global.pos, sphere.kine.global ) を定義します。
      PPGはダブルクリックすればどこにでも表示出来ます。



     また、カスタムパラメーターの名前に DisplayInfo と書くと、カメラのカスタム情報で 表示を ON にしておくと
    画面に表示され、尚且つスライダーで値を変更できるようになるのを ご存知でしょうか?



       これだけでも便利そうなのですが、やはり ICE を知ってしまうと、
      これとは比べるべくもなく便利で簡単に設定でき、
      尚且つ、得た情報をもっと色々と他に有効利用できるというのを次にお見せします。



 データ取得例;距離 = ICE
     同じ、2個のオブジェクト 立方体 と 球 のシーンとします。
    立方体 に ICE を設定します。 立方体 を選択した状態から、Alt+9キー>作成>ICEツリー です。
     2つのオブジェクトのグローバル値をD&DでGetDataし、Matrix to SRT で移動値を分離し、GetDistanceBeteen ノードに2つをつなぎます。
    それを SetDataで self.distance という新しい任意のパラメーターを作成して接続します。それをICETreeのPort1につないで完成です。
    あとは途中の GetDistanceBeteen から出ている接続線上にて 値を表示する ということをすると シーン上に数値が表示されます。



     これを見ると、ICEはデータ取得方法が
    いかに簡単で、どんどんと加工しやすくて、アニメーションに有効利用出来そう・・・
    ということか理解できるかと思います。
      では、ここから発展させて色々と付加価値をつけてみましょう。

     Subtract(減算)というノードを取り出し、立方体の Translation を Second に、球の Translation を First に接続して、
    それを SetDataで self.dist_vector という新しい任意のパラメーターを作成して接続します。
    すると、どうでしょう。簡単に 立方体から見た 球の相対的な移動値(ローカル値)が得られますね。



     では、回転値での例にしてみます。
    同じ風にして Subtract(減算)というノードを取り出し、立方体の Rotation を Second に、球の Rotation を First に接続して、
    それを SetDataで self.rot_vector という新しい任意のパラメーターを作成して接続します。
    すると、簡単に 立方体から見た 球の相対的な回転値(ローカル値)が得られますね。



     次は少し工夫が必要なもの、2点間から得る回転値を使って、立方体から見た球の角度を求めます。
    Increment Rotation with 2 Vectors というノードを取り出しておきます。
    立方体からのグローバルの回転値を 新しい Matrix to SRT から得て、Rotation を Rotation につなぎます。
    そして、さっき 位置のSubtract(減算) から得た球の相対的な位置のデータを To Vector に接続します。
    それを SetDataで self.dir_rot という新しい任意のパラメーターを作成して接続します。
    簡単に 立方体から見た 球の方向の角度が得られますね。



     こうして得られるデータ群を良く使うのであれば コンパウンド として用意してしまいましょう。
    こんな風に1個にまとめることが出来ます。この状態で コンパウンドの書き出し で共有ディレクトリーに保存してしまいます。


     中身はさっき作った通りのものです。
    左側の入り口 部分 と 右側の出口部分 に名前をちゃんと入れて解りやすくしておきます。あ、コンパウンド名 と カテゴリー名 も入れましょう。
    左側黒い点線で接続部が reference に接続しておけば、ノードをダブルクリックすると オブジェクトをピック選択できるPPGになります。



    これが完成したコンパウンドです。>> GetRot_Trasbetween2Objects_xsicompound.zip



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

    そして弧度法では 2π(rad) =360゜ となっています。

    角度030456090180360
    ラジアン0π/6π/4π/3π/2π

    つまり、 ラジアン = 角度 * π/ 180 あるいは 角度 = ラジアン * 180 / π ってなります。
     ICEで実験してみましょう、半径4のポリゴン円を Uのサブディビジョンを360 とする円盤を作成します。
    範囲(角度)で U方向開始 0 が 時計で 3時の場所(X軸のプラス側)から始まって、U方向終端が360 で一周になるようにしました。
    その 円盤ポリゴンにICEを設定します。
     下図のように、π180で割って、入って来る 角度 と掛け算すれば良いですね。この Deg To Rad ノードが Conversion の中にあります。



     で、検証したいのは、”1ラジアンは度数法で測ると約57.29578度に相当する”、って書いてあるので、角度にこの数値を入れてみます。
    お見事、ラジアンは1を示しています。当たり前か・・
    おまけに、角度の値を U方向終端値 self.polymsh.geom.enduangle に SetData 出来るので、ここでは角度を入力すると円がぐるっと描かれていきます。
    ちなみに、角度360°の時は、ラジアンは 6.2832 と表示されます。つまり です。





 Tan(タンジェント)ノードの検証
     サイン(Sin)・コサイン(Cos)・タンジェント(Tan) の話です。
    タンジェントって覚えていますでしょうか?(中2~高1だそうです) ICEでは Tan というノードがあります。

    で、タンジェントの角度 と 距離 が解っていると 高さ が求められるって話なんです。

    良くある例題で、

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

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

    プログラミングの世界ではラジアン角を使うのですが、ICE の Tanノード ではどうなのか見てみますと、あらま、通常の角度を使うようです。



    ちょっとした実験でした。
     キャラクターの建物とかの対比に役立つかも?? です。
     



値の取得について
 回転値の注意
     今更、ここで書くのか?? って感じですが、回転値の設定についてちょっと注意して欲しい点を書きます。
    スケール値(Scale)と移動値(Translate)は足し算・引き算・掛け算など単独の軸 X,Y,Z毎に計算させるなどして良いものですが、
    回転値(Rotation)はその軸だけの計算では駄目です。必ずX,Y,Z全部を計算させる(Matrix)を使ってください。
     もう1つ、下の例のようにグローバルの回転値を自分から得て、それを自分に設定するとループが生じてしまいます。
    設定する値がどんどんと計算されてグルグルと回ることになること、注目してください。



     そこで、自分から得る回転値を自分に設定したい場合は、その初期値を使うことにより ループを回避し、
    その初期値こそ Static_KineState (静止キネマティクス状態) を利用する理由なんです。 ( 取得>プロパティー>静止キネマティクス状態 )
    ただし、この値は グローバル値である と認識してください。エンベロープを設定するとここにグローバル値が代入されます。

    球にエンベロープを付けると Static_KineState にはグローバル値が代入される


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



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



    親の立方体 と 子の球 も共に回転した状態は、このようになることが 想定 されます。





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

     まずは、球に ICEを設定します。Alt+9 キー にて ICETree画面を表示させ、作成>Iceツリー です。
    そして、影響を与えるローカルの回転値を円柱から取って来ます。(エクスプローラーから ドラッグ&ドロップ するだけ)
    それを Scalar to 3D Vector につなぎ、その Vector を Eular to Rotation に変換しています。
     Scalar to 3D Vector と Eular to Rotationノードの間に 値の表示 をしておきます。
    この値が 球のローカル値に設定したい値になります。



     次は、自分である球の初期値(ローカル値)を Static_KineState_Local から得ます。
    面倒ですが、9個の値を取得します。(一括で取れない)
    3つの組を Scalar to 3D Vector につなぎ、回転値だけ Vector を Eular to Rotation で変換して、先の回転値と Multiply で結合します。
     Get sphere - GetaData - と分けてデータを取得しているのは、ここでコンパウンドを作成することを想定しているからです。



    それらを SRT to Matrix にまとめます。
     次は、親である 立方体のグローバル値を取得します。 ローカル値というのは、親からの相対値だからですね。
    親のグローバル値(絶対値)が解れば、その子供のグローバル値(絶対値)がローカル値から得られます。
    Matrixのまま、上でまとめたMartixとMultiplyで結合して、球のグローバル値として設定します。



     もうひと工夫します。
    もしこの ローカル値を設定したい球に ニュートラルポーズが設定されていた場合のことです。
    球のニュートラスポーズの回転値を接続できるように SRT to Matirx の間に 更に Multiply で挟み込み
    IFノードで 使う時に 回転値が行くように設定します。



     そうしたら、ここまでをコンパウンドにまとめると、こんな感じになります。  ↓



     皆さんが個別に使用している 関数や変数はここ ↓ に設置すれば、
    ローカル値から計算した回転値を、設定したいオブジェクトにローカル値として設定できる という風になります。



    これが完成したコンパウンドです。>> Input_XYZ_2LocaROT.2.0.xsicompound.zip



 ICE組み上げ、コンパウンド その2 コンパウンド大公開!!
     今度は、また少し複雑です。軸毎に値の代入をOn/Offしたり、軸毎に値を設定したい場合です。
    こんな感じでコンパウンドとしてまとめてみました。



     そんな中身はこんな感じですが、各軸毎に分解して計算して、IF文を挟んで、また元に戻しているだけです。
    X軸の値をZ軸にする・・など、組み替えをすれば個別対応できるはずです。



    これが完成したコンパウンドです。>> LocalROTMultply_from_xsicompound.zip

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



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