<< TOP



XSI ICE活用 頂点座標
:01 頂点アニメーション
このドキュメントは


  • XSIはそこそこ触れる
  • ICEというものがどういうものか大体わかる
  • ICEが気になっているのだけど、どこから入ったら良いかわからない
    といったアーティスト、デザイナさん向けに作られています。



頂点座標をアニメーション編
今回は期間も開いたことですし、スタンダードなICEの使い方の一つである頂点座標のアニメーションを試してみようと思いま す。

 1.データの準備
まずは頂点データを簡単な波にしたいので見やすいように GridをGetします。
  001
次にAlt+9で起動したICE Treeビュー内でGridにICETreeを設定して、「Set Data」で「grid.PointPosition」を設定すると、
あら不思議。シーン内からGridが消えてしまいます。
 iceva_image02.jpg
何回もICEを触っている人はもうお分かりかもしれませんが、これは
「Set Data」で「grid.PointPosition」に与えているデータがXYZすべて0となっているからです。
なのでGrid自体が持つ頂点座標(
grid.PointPosition)をいったんそ のまま「Get Data」で取得し、「Set Data」に渡すことで、元の形状が保たれます。
 iceva_image03.jpg
以上で今回の準備は完了です。

 2.波を作る
波といってもちゃんとした波ではありません。
最初なので簡単な正弦波とよばれるサイン波(コサインでも良いけど・・・)でやってみましょう。
サイン波をグラフにすると以下のような形になります。
 iceva_image04.jpg
この図にあるように、フレーム数(時間)を頂点のX座標に足したものを、頂点のY座標にサインで置き換えて行きます。

まずはいったん固い絆で繋がれた(?)GetDataとSetDataノードをはずします。
 iceva_image05.jpg
Conversion > 3D Vector to ScalarとData Access > Current Timeを取り出します。
そして、頂点座標をXYZそれぞれに分けるために、「3D Vector to Scalar」 にGetDataのValueを繋ぎます。
「Current Time」はいったんそこにおいておきます。
Current Timeノードはシーン内の現在の時間をリアルタイムに返すノードです。
 (値は画面下部「PlayBack>再生オプション>フレームレート」の設定を元に時間に変換したものです。)

 iceva_image06.jpg
次にXの値に連続する数値変化を与えるために、
3D Vector to ScalarとCurrent TimeをMath > Basic > Addを使用して足し合わせます。
 iceva_image07.jpg
その足した結果を、Math > Basic > Trigonometry > sinにつなぎ、
Conversion > Scalar to 3D VectorのY値に繋ぎます。
XとZは
3D Vector to Scalarで分解したものを再度Scalar to 3D Vectorのそれぞれにつなぎ、VectorにまとまったものをSetDataのPointPositionに返します。
これで一旦、目的としているツリー自体は出来ました。
 iceva_image08.jpg
再生ボタンで再生してみてください。
ものすごくゆ~っくりグリッドが盛り上がってきます。
 iceva_image13.jpg
これはSinに対して与えている数値が小さすぎるので結果が小さい値になってしまっているためです。
↓こんな感じ
iceva_image09.jpg
これを早い波にするにはどうしたら良いか?
答え:Sinに与える数値をすごく大きくしてしまうのが一番簡単です。
 iceva_image10.jpg
というわけで、Math > Basic > MultiplyをAddとSinの間に挟みます。
 iceva_image11.jpg
ここで小技紹介。
リスト上からノードをドラッグするときに、すでに接続されたカーブ上へマウスカーソルが乗るようにドラッグアンドドロップすると、
そのカーブ上にインサートされる形でノードが繋がります。
目印は、ラインの右半分へ白くグラデーションがかかる、という少々わかりづらいものです。

 iceva_image12.jpg
Multiplyノードをダブルクリックで開いたプロパティに200程(ここは適当で)入力してみてください。
 iceva_image14.jpg
ペコッと波が形作られると思います。
あ、でも初期形態のGridだと分割数が少ないので、ただの「やまおり、たにおり」の図になってしまいますね。
Gridに一回もフリーズをかけなかった場合、Getした当時のGeometryプロパティが残っていると思います。
このプロパティを開き、Uの値に128と大目の値を入れると、きれいなサイン波になりました。
 iceva_image15.jpg

フレームを再生してみてください。
滑らかなサイン波がGrid上を流れていきます。
<gifアニメダウン ロード>

現状では、頂点のX座標とフレームのSin結果を頂点のY座標に直に入れているので、念のため現在の頂点Y座標に計算結果を足すという形にしておきます。
 iceva_image18.jpg

これでベースの部分は出来ました。

 iceva_image17.jpg

次は、XYZすべての方向に波打つように、改良していきます。

 3.改良してコンパウンドにまとめ る
目的としているコンパウンドの内容を先にリストアップし ておきます。
忘れないようにと・・・

①XYZそれぞれ波打つかどうかを ON/OFFできるようにする
②それぞれの波の横幅を調整できるようにする
③それぞれの波の高さを調整できるようにする

これくらいでしょうか・・・。

上のGridをそのまま使いましょう。
UだけでなくVのサブディビジョンも128くらいにしておくと良いかと思います。
 ceva_image21.jpg

それではまず、①を実現するために上で作ったツリーの「Scalar to 3D Vector」の入力を一旦外し、Execution > If ノードをXYZそれぞれの入力ポートに繋ぎます。
チェックボックスがOFFの時は波打たないで、元の頂点座標を使いたいので、If Falseのポートには3D Vector to ScalarのXYZを合わせて繋ぎます。
 iceva_image19.jpg
それぞれのチェックボックスはとりあえずOFFにしておけば、ただのグリッドですのでとりあえずこの状態にしておきます。。
 iceva_image20.jpg

Yの波はそのままYのIfノードのTrueへと繋ぎます。
Zの波も直行している座標なのでXを使いますが波の幅を個々に調整したい(②の条件)ので、
Multiply、Sin、Addノードを複製して、X座標と時間のSinと頂点Z座標に足して、ZのIfノードのTrueへ挿します。
 iceva_image22.jpg

X座標への波はXに対して直行するのはZ軸なので頂点Z座標に現在の時間を足したものをSinで渡し、元のX座標に足します。
これでXYZそれぞれの波が出来ました。
※それぞれのIfノードのConditionの値をONにすると確認できますが、XとZだけのONだと頂点が交差しまくって気持ち悪いですw
 iceva_image23.jpg

さて、波と波の間隔は繋がっているMultiplyノードで調整できるので問題ないですね。
次は波自体の高さ、(揺れ幅)の調整(③の条件)をします。
揺れ幅はSinの結果に掛け合わせれば出来るので、繋げるのはここ。
 iceva_image24.jpg
Sinノードの直後です。
Math > Basic > Multiplyをドラッグでそれぞれのノード間につなげて行きましょう。
 iceva_image25.jpg

現時点でIfを全部ONにして確認してみましょう。
 iceva_image26.jpg
なんやらよくわからない気持ち悪いものですね。
ツリーは↓このようになっています。
これをまとめてコンパウンドにしてしまいます。
GetDataからSetDataを選択して、ICE Treeビューのコンパウンド>コンパウンドの作成でまとめてしまいます。
 iceva_image27.jpg

すっきりしました。
 iceva_image28.jpg

出力パラメータは以下の順番にしました。
 iceva_image30.jpg
※このコンパウンドでまだやりたいことがあるのでバージョンは0.5にしたいと思います。

fmt_sinPoitnsWave v0.5 ダウンロード
ためしに頂点カラーを各座標のwidthに入力して、影響率を渡したりして遊んでみてください。
 iceva_image31.jpg
 iceva_image32.jpg

 4.Self.について
そういえばいまさら気づきました。
GetData、SetDataのSelfについての説明が足りませんでしたね・・・。
ご存知の方も多いかと思うので、そういう方は読み飛ばしていただければと思います。
※マニュアルにも書いてありますし・・・。

ここまでのドキュメント内のGetData、SetDataのパラメータ名がオブジェクト名だったり、Selfだったりしていたと思います。
 iceva_image33.jpg iceva_image34.jpg
この場合Gridのままだとコンパウンド化して他のオブジェクトに適用したときに、データアクセスが正しく行われません。
それをこのノードが繋がっているオブジェクト自身、「self」とすることでコンパウンドを使いまわすことが出来ます。
ICE Treeビューの上部メニューの、ユーザーツール>「オブジェクト名を Self. で置換(ネスとしたコンパウンド)」で
ツリー内のDataアクセスノード名が、ツリーの親オブジェクトだった場合にSelfに書き換わります。

コンパウンドを公開するときはこれに気をつけておくと良いと思います。
都度変換をするのをクセ付けておいたほうが楽ですね・・・。

<前 へ
次>