|
Expressionとの違い
データ取得例;距離 = カスタムパラメーター従来からあるシーン内のデータを得る方法として最も良く利用されるのがエクスプレッションです。 例えば、2個のオブジェクト立方体と球の距離を求めるのであれば、このように設定する↓と出来ました。(コレも参考になる?) 立方体を選択した状態で、 Animateモジュール > 作成 > パラメーター > 新規カスタムパラメータセットで[C]カスタムパラメーターを作成します。 Animateモジュール > 作成 > 新規カスタムパラメータでDistance とか任意の名前を作成します。 そこにエクスプレッションでctr_dist( cube.kine.global.pos, sphere.kine.global )を定義します。 PPGはダブルクリックすればどこにでも表示出来ます。 ![]() 画面に表示され、尚且つスライダーで値を変更できるようになるのをご存知でしょうか? ![]() これとは比べるべくもなく便利で簡単に設定でき、 尚且つ、得た情報をもっと色々と他に有効利用できるというのを、次にお見せします。 データ取得例;距離 = ICE 同じ、2個のオブジェクト立方体と球のシーンとします。 立方体にICEを設定します。立方体を選択した状態から、Alt+9キー > 作成 > CEツリーです。 2つのオブジェクトのグローバル値をD&DでGetDataし、Matrix to SRT で移動値を分離し、GetDistanceBeteen ノードに2つをつなぎます。 それをSetDataでself.distance という新しい任意のパラメーターを作成して接続します。それをICETreeのPort1につないで完成です。 あとは途中のGetDistanceBeteenから出ている接続線上にて値を表示するということをするとシーン上に数値が表示されます。 ![]() いかに簡単で、どんどんと加工しやすくて、アニメーションに有効利用出来そう・・・ ということか理解できるかと思います。 では、ここから発展させて色々と付加価値をつけてみましょう。 Subtract(減算)というノードを取り出し、立方体の Translation を Second に、球の Translation を First に接続して、 それをSetDataでself.dist_vector という新しい任意のパラメーターを作成して接続します。 すると、どうでしょう。簡単に立方体から見た球の相対的な移動値(ローカル値)が得られますね。 ![]() 同じ風にしてSubtract(減算)というノードを取り出し、立方体の Rotation を Second に、球の Rotation を First に接続して、 それをSetDataでself.rot_vector という新しい任意のパラメーターを作成して接続します。 すると、簡単に立方体から見た球の相対的な回転値(ローカル値)が得られますね。 ![]() Increment Rotation with 2 Vectors というノードを取り出しておきます。 立方体からのグローバルの回転値を新しい Matrix to SRT から得て、Rotation をRotation につなぎます。 そして、さっき位置のSubtract(減算)から得た球の相対的な位置のデータをTo Vectorに接続します。 それをSetDataでself.dir_rot という新しい任意のパラメーターを作成して接続します。 簡単に立方体から見た球の方向の角度が得られますね。 ![]() こんな風に1個にまとめることが出来ます。この状態でコンパウンドの書き出しで共有ディレクトリーに保存してしまいます。 ![]() 左側の入り口部分と右側の出口部分に名前をちゃんと入れて解りやすくしておきます。あ、コンパウンド名とカテゴリー名 も入れましょう。 左側黒い点線で接続部がreferenceに接続しておけば、ノードをダブルクリックするとオブジェクトをピック選択できるPPGになります。 ![]() |
値の取得について
回転値の注意今更、ここで書くのか??って感じですが、回転値の設定についてちょっと注意して欲しい点を書きます。 スケール値(Scale)と移動値(Translate)は足し算・引き算・掛け算など単独の軸X,Y,Z毎に計算させるなどして良いものですが、 回転値(Rotation)その軸だけの計算では駄目です。必ずX,Y,Z全部を計算させる(Matrix)を使ってください。 もう1つ、下の例のようにグローバルの回転値を自分から得て、それを自分に設定するとループが生じてしまいます。 設定する値がどんどんと計算されてグルグルと回ることになること、注目してください。 そこで、自分から得る回転値を自分に設定したい場合は、その初期値を使うことによりループを回避し、 その初期値こそStatic_KineState(静止キネマティクス状態)を利用する理由なんです。(取得 > プロパティー > 静止キネマティクス状態) ただし、この値はグローバル値であると認識してください。エンベロープを設定するとここにグローバル値が代入されます。 グローバル値からローカル値の取得 今更、ここで書くのか??第2弾です。
親子構造になっている子のローカル値をグローバル値から得るには、逆行列(inverse matrix)に設定して求めます。 (高等学校数学C) 既に上記で一旦説明している部分↑(Subtract)は親に回転値が無い場合です。 親に回転値が付くことを考えてきちんとローカル値を得るにはこのように設定します。 |
SetDataはグローバル値(2011からの仕様変更)
ローカル座標値の設定プラグイン大公開!!さて、このチュートリアルのメインディッシュでございます。 より実践に近い例でしょう。 そもそもこんな場面に遭遇しない、設定しない方には何の事やら、となるぐらいの話なんですがね。
そこで、ここで紹介する内容は、現在のバージョンに対応すべく、皆さん、お気付きでしょうか?実は大きな仕様変更が2011にあります。 それは、これまた制限があるのですが、大体のローカル値はGetDataで取得できるのですが (なんと曖昧な表現)、 SetDataを使ってローカル値を設定出来なくなっています。 特に困るのは、キャラクターアニメーション用の関数がローカル座標値設定だったりすると、 2011にてそういうシーンを開くとICEが真っ赤で動かなくなっていたりするはずです。なんで~・・・??? (2010では、ICEでサポート外ながらもローカル値が設定できていました。 fmtさんのチュートリアル「XSI ICE活用 キネマティクス:01 タイヤエクスプレッション」を参照) ”計算結果のローカル値を、設定したいローカル値になるようにグローバル値から設定する” というICEノードを組み上げ、コンパウンド化して利用できるものをご紹介します。 また、その時考えられる構造としては、
話がどんどんと複雑になりますと・・・最後には、もっと嫌な例で、
さて、初期設定値をローカル値から設定したいと思ったので、プラグインを作成してもらいました。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ノードの間に値の表示をしておきます。 この値が球のローカル値に設定したい値になります。 ![]() 面倒ですが、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ノードで使う時に回転値が行くように設定します。 ![]() ![]() ローカル値から計算した回転値を、設定したいオブジェクトにローカル値として設定できるという風になります。 ![]() ICE組み上げ、コンパウンド その2 コンパウンド大公開!! 今度は、また少し複雑です。軸毎に値の代入をOn/Offしたり、軸毎に値を設定したい場合です。 こんな感じでコンパウンドとしてまとめてみました。 ![]() X軸の値をZ軸にする・・など、組み替えをすれば個別対応できるはずです。 これが完成したコンパウンドです。 >> LocalROTMultply_from_xsicompound.zip 使い勝手が自分好みでない場合は、カスタマイズすれば良いだけです。 |
という訳で、またICEのキネマティクスをより実践に近いかたちで紹介できました。 お次は何?キャラ?? 乞う、ご期待!!
|