![]() |
プロローグ 続けて書く予定だった、ICE考察のアニメ編が遅れてしまいました。 Softimageにはまだまだ開拓すべきアニメーション加工方法がたくさんあり、 アニメ的な表現にも生かせる事もいっぱいあるはずです。 ![]() ICEを使ったコマ抜きアニメが出来ないか実験してみました。 どれか1つでも参考になれば!!と考えます。 > 通常アニメーション > AnimationMixer > ICE考察1 > Modulo > ICE考察2 > 値の代入 > ICE考察3 > Array化 > ICE実践1 > キャタピラ > ICE考察4 > パーティクル;キャッシュ > ICE考察5 > パーティクル;シミュレーション パソコンのスペックWindowsXP SP3、Intel Core2Duo 3G、RAM; 3G、NVIDIA Quadro FX1700 |
ICE考察1
Moduloさて、ICEの方なんですが、今までScriptやExpressionで動いていた関数をそのままICEで実現する って考え方は案外あてはまらないと考えた方が良いです。 ICEならではの作り方があり、発想の転換が良い方向にいきます。 そこでまずは実験から始めましょう。 以前の記事からも紹介しています通り、面白いICEノードとしてModuloを理解しましょう。 このModuloは、数値(Value)を指定した数(Modulo by) 未満の剰余値を繰り返す結果を出します。 例えば、入って来る数値をCurrentFrameにし、指定数に3と入れると、0.1.2を繰り返します。 ![]() って書いただけです。(下のtestはModuloの結果値を見たいだけです) これだと、Moduloの結果が0と1だった場合が書いてないので、ワールドの中心値に戻ってしまう動きになります。 もう少し考察します。では、ワールドの中心値に戻るんではなくて、前のフレームの値を代入できればいいのか、 と、こんな風に作ったとします。 ![]() Modulo の結果が2だったらSphereからのグローバル値をSphere2のグローバル値にし、 それ以外は以前のフレーム値(GetData At PreviousFrame)を、としました。 2コマ抜きならOKです。ですが、3コマ抜きの時は、はい。困ります。 元のSphereは毎フレーム動いている訳ですから、2フレーム前の値じゃないと動いてしまうフレームがありますよね。 うーん、と。 |
ICE考察2
値の代入で、こんな感じで対応を考えてみました。 ![]() どうでしょうか?これなら何コマ落ちでも平気です。コマ落ち数までアニメーションできます。 注意は、この時のICETree ノードの置き場所がSimulation コンストラクションモード以下に置いてあることです。 これで対応が出来そうなことが解ったので、 今度はもっと多くのもの、つまりキャラクターRigのように骨の数だけあるようなものにも対応すべく考えてみます。 |
ICE考察3
Array化それは、いままででも紹介している高速化の為のArray(配列)を使った方法になります。(今回、もっとも単純な方法で・・・) すると2段階設定のICEになります。 まずはデータをArray(配列)化し、その後でオブジェクト個別毎にデータを引きだして位置データとする、という仕組みです。 ![]() 元のアニメーションがたくさんのオブジェクトがあることを想定してGetDataをGroup(Groupという名前)から得ます。
Softimageは1からフレームが始まるので=1にしました。 Array化した値の入る箱の名前は、良く使うBoneTransformsとし、その前計算として代入値をPreBoneTransformsとしました。 個別のオブジェクトに付けるICEはコンパウンド化(BoneTransform2GL)しておきます。 そして、このコンパウンドBoneTransform2GLの中身は ![]() 最初のGetDataはReferenceとしてつないでおいて、 コンパウンドをダブルクリックした時のPPG(プロパティーページ;設定画面)で、 ICEのついているPointcloudを[ピック]出来る画面にしておきます。 Indexの番号はGroupから得たオブジェクトの上からの順番で、これは0から始まります。 今は1個しか入ってないので0です。 BoneTransform2GLというコンパウンドをたくさんのオブジェクトに一気に接続してしまうにはスクリプトが便利です。 BoneTransform2GLコンパウンドは事前にユーザーのワークグループにでも書き出しを行っておきます。 そして、こう書いたスクリプトを用意します。(違う名前のコンパウンドを同様に接続したい場合は、コンパウンド名前部分を変えるだけです)
をツールバーのボタン(例;BoneTransform2GL )にしておけば、いつでも使えます。 ![]() 使い方はICETreeを付けたい複数のポリゴンオブジェクトを選択した状態でボタン(例;BoneTransforms2GL)を押します。
Pointcloud名とおのおののIndex番号を指定してあげます(例;ココでは1つなので0)。 ![]() これでどんなにたくさんあっても、コマ抜きが2コマでも3コマでも自由にアニメーションをつけて 設定した数のコマ抜き動きなってくれます。 では、この方法でもっと複雑な動きのもので、コマ落ちアニメーションが出来るのか実践してみましょう。 |
ICE実践1
キャタピラ戦車のキャラピラのICE版です。この動きを2コマ落ちのアニメーションにしてみます。 キャラピラの車輪の動き(回転と移動)からしてキーフレームアニメーションではなく、すべてICEで制御された動きです。 唯一あるのは、矢印型のカーブが、ココからココへこの方向で行け、というのが Fcurveです。 ![]() やったことは上述の考察2の値の代入だけです。位置のデータを何コマ毎に更新するか、だけです。 これさえ理解できれば、複雑なロボットの動きも、モーションキャプチャーの人体アニメーションも、すべてコマ落ちアニメーションに出来ます。 |
ICE考察4
パーティクル;キャッシュでは、今度はパーティクルのようにICEのSimulationで発生するような動きもコマ抜けアニメが出来るのか実験してみます。 まずは、無難にキャッシュしたものを考えてみました。 するとどうでしょう、意外にも簡単にできます。 ![]() そのデータを読むノードはCacheOnFileTake1 というノードになり、file Mode がRead Cacheになってます。 ![]() そのノードに入力するFrame 数が値の代入self.KomaFrameにつなげて、 受け取ったフレーム数のCacheだけを表示するってなってます。 ここでは参考としてModuloが6なので、61218・・・フレームの結果が表示されていきます。 |
ICE考察5
パーティクル;シミュレーションでは、今度はパーティクルでキャッシュしてない、シミュレーションのものはどう扱えるのか考察してみます。 ![]() Moduloから来る値が= Oで Trueの時だけ実行するってしてみた結果です。 この方法は次の= Oが来るまで実行しない、というものなので、フレーム数は伸びる感じになります。 コマを抜いたのとは違う感じはするのですが、動かないフレームを用意できる方法として紹介しておきます。 |
という訳で、どこか参考になるところありましたら幸いです。 まだまだICEが続きますかね。 乞う、ご期待!!
|