CG・コンテンツ制作
  1. CG・コンテンツ制作トップ
  2. DAIKIN CG Channel
  3. UsersNotes
  4. ICE
  5. XSI ICE活用 頂点座標 :01 頂点アニメーション
SUITE USERS NOTES
XSI ICE活用 頂点座標
:01 頂点アニメーション

このドキュメントは

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

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


1.データの準備

まずは頂点データを簡単な波にしたいので見やすいように Grid をGet します。

iceva_image01

次にAlt+9で起動したICE Treeビュー内でGridにICETreeを設定して、「Set Data」で「grid.PointPosition」を設定すると、
あら不思議。シーン内からGridが消えてしまいます。

iceva_image02

何回もICEを触っている人はもうお分かりかもしれませんが、これは「Set Data」で「grid.PointPosition」に与えているデータがXYZすべて0となっているからです。
なのでGrid自体が持つ頂点座標(grid.PointPosition)をいったんそのまま「Get Data」で取得し、「Set Data」に渡すことで、元の形状が保たれます。

iceva_image03

以上で今回の準備は完了です。


2.波を作る

波といってもちゃんとした波ではありません。
最初なので簡単な正弦波とよばれるサイン波(コサインでも良いけど・・・)でやってみましょう。
サイン波をグラフにすると以下のような形になります。

iceva_image04

この図にあるように、フレーム数(時間)を頂点のX座標に足したものを、頂点のY座標にサインで置き換えて行きます。

まずはいったん固い絆で繋がれた(?)GetDataとSetDataノードをはずします。

iceva_image05

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

iceva_image06

次にXの値に連続する数値変化を与えるために、3D Vector to Scalarと Current TimeをMath > Basic > Addを使用して足し合わせます。

iceva_image07

その足した結果を、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

再生ボタンで再生してみてください。
ものすごくゆ~っくりグリッドが盛り上がってきます。

iceva_image13

これはSinに対して与えている数値が小さすぎるので結果が小さい値になってしまっているためです。
↓こんな感じ

iceva_image09

これを早い波にするにはどうしたら良いか?
答え:Sinに与える数値をすごく大きくしてしまうのが一番簡単です。

iceva_image10

というわけで、Math > Basic > MultiplyをAddとSinの間に挟みます。

iceva_image11

ここで小技紹介。
リスト上からノードをドラッグするときに、すでに接続されたカーブ上へマウスカーソルが乗るようにドラッグアンドドロップすると、そのカーブ上にインサートされる形でノードが繋がります。
目印は、ラインの右半分へ白くグラデーションがかかる、という少々わかりづらいものです。

iceva_image12

Multiplyノードをダブルクリックで開いたプロパティに200程(ここは適当で)入力してみてください。

;iceva_image14

ペコッと波が形作られると思います。
あ、でも初期形態のGridだと分割数が少ないので、ただの「やまおり、たにおり」の図になってしまいますね。
Gridに一回もフリーズをかけなかった場合、Getした当時のGeometryプロパティが残っていると思います。
このプロパティを開き、Uの値に128と大目の値を入れると、きれいなサイン波になりました。

iceva_image15

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

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

iceva_image18

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

iceva_image17

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


3.改良してコンパウンドにまとめる

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

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


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

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

ceva_image21

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

iceva_image19

それぞれのチェックボックスはとりあえずOFFにしておけば、ただのグリッドですのでとりあえずこの状態にしておきます。。

iceva_image20

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

iceva_image22

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

iceva_image23

さて、波と波の間隔は繋がっているMultiplyノードで調整できるので問題ないですね。
次は波自体の高さ、(揺れ幅)の調整(③の条件)をします。
揺れ幅はSinの結果に掛け合わせれば出来るので、繋げるのはここ。

iceva_image24

Sinノードの直後です。
Math > Basic > Multiplyをドラッグでそれぞれのノード間につなげて行きましょう。

iceva_image25

現時点でIfを全部ONにして確認してみましょう。

iceva_image26

なんやらよくわからない気持ち悪いものですね。
ツリーは↓このようになっています。
これをまとめてコンパウンドにしてしまいます。
GetDataからSetDataを選択して、ICE Treeビューのコンパウンド > コンパウンドの作成でまとめてしまいます。

iceva_image27

すっきりしました。

iceva_image28

出力パラメータは以下の順番にしました。

iceva_image30

※このコンパウンドでまだやりたいことがあるのでバージョンは0.5にしたいと思います。

 < fmt_sinPoitnsWave v0.5 ダウンロード > 

ためしに頂点カラーを各座標のwidthに入力して、影響率を渡したりして遊んでみてください。

iceva_image31
iceva_image32

4.Self.について

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

ここまでのドキュメント内のGetData、SetDataのパラメータ名がオブジェクト名だったり、Selfだったりしていたと思います。

iceva_image33iceva_image34

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

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



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

Daikin CG News お申し込み

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

Twitter

ページの先頭へ