CG・コンテンツ制作
  1. CG・コンテンツ制作トップ
  2. DAIKIN CG Channel
  3. UsersNotes
  4. ICE
  5. ICE を使ったコマ抜きアニメ;Making limitted animation with ICE
SUITE USERS NOTES
ICE を使ったコマ抜きアニメ
Making limitted animation with ICE
(アニメ向き)
ice_koma_01
SUNdan_ml

プロローグ
続けて書く予定だった、ICE考察のアニメ編が遅れてしまいました。
Softimageにはまだまだ開拓すべきアニメーション加工方法がたくさんあり、
アニメ的な表現にも生かせる事もいっぱいあるはずです。
ice_koma_02
そこで、今回はコマ抜き的な動きについて調べると共に、
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



通常アニメーション
AnimationMixer
まずは、通常のアニメーションからコマ抜きアニメーションを実現するには、どういった技法があるのか見てみました。
プリミティブな球に適当な動きをキーフレームから作成すれば、滑らかな FCurveが作成できますね。
ice_koma_03
で、FCurveに加工を施せば、コマが飛んだアニメーションになります。
カーブの処理にて時間ステップを3とかにして既存キーは保持してリサンプルスムーズでも実行すれば
階段状のFCurve になります。うーん、とてもベタな方法でベター(Better)じゃない。
ice_koma_04
そこで考えます。2コマ、3コマ抜きにしたい時はそういう FCurve を全部作るの?って
で、Exressionが登場します。しかもClipに使うのです。下図を見てください。
なんということでしょう!!コマ抜きの動きをしているのにFCurveはそのままですし、ClipにはWeight値しかありません、さて・・・。
ice_koma_05
答えはソースにあり。
ice_koma_06
己の各ローカルの軸移動の値に対してこのような処理をさせています。

at_frame( floor( Fc / 2) * 2, sphere1.kine.local.posx )

つまり、ここの数値がならコマ抜きになります。
ならば、Clipを並べて無効/有効で2コマClip、3コマClipと動きが選べるようになりますね。
ice_koma_07
でもでも、まだ困ります。
上の3項目で移動値だけだから、スケール値回転値があるとそれも書くだろうし、
sphere1って書かれているので、個別のものに対してすべてファイル名を付け直さないといけないだろうし。
また、Expressionは毎フレーム計算するスクリプトみたいなものですので、大量にあった場合レスポンスが悪くなることが想定されます。)

そこで、ICEを使ってなんとかならんのとなる訳です。



ICE考察1
Modulo
さて、ICEの方なんですが、今までScriptやExpressionで動いていた関数をそのままICEで実現する
って考え方は案外あてはまらないと考えた方が良いです。
ICEならではの作り方があり、発想の転換が良い方向にいきます。
そこでまずは実験から始めましょう。
以前の記事からも紹介しています通り、面白いICEノードとしてModuloを理解しましょう。
このModuloは、数値(Value)指定した数(Modulo by) 未満の剰余値を繰り返す結果を出します。
例えば、入って来る数値をCurrentFrameにし、指定数にと入れると、0.1.2を繰り返します。
ice_koma_08
上図はModuloの結果がだった場合、球から導いたグローバル値をConeのグローバル値にする、
って書いただけです。(下のtestはModuloの結果値を見たいだけです)
これだと、Moduloの結果が01だった場合が書いてないので、ワールドの中心値に戻ってしまう動きになります。

もう少し考察します。では、ワールドの中心値に戻るんではなくて、前のフレームの値を代入できればいいのか、
こんな風に作ったとします。
ice_koma_09
今度はRoundというICEノードが出て来ました。これはスカラー値を整数にします。便利です。
Modulo の結果が2だったらSphereからのグローバル値をSphere2のグローバル値にし、
それ以外は以前のフレーム値(GetData At PreviousFrame)を、としました。
2コマ抜きならOKです。ですが、3コマ抜きの時は、はい。困ります。
元のSphereは毎フレーム動いている訳ですから、2フレーム前の値じゃないと動いてしまうフレームがありますよね。
うーん、と。



ICE考察2
値の代入
で、こんな感じで対応を考えてみました。
ice_koma_10
一旦、任意の名前(例ではKomaTobiIchi ) に値を代入しておいて、その値から自分のグローバル位置を設定します。
どうでしょうか?これなら何コマ落ちでも平気です。コマ落ち数までアニメーションできます。
注意は、この時のICETree ノードの置き場所がSimulation コンストラクションモード以下に置いてあることです。

これで対応が出来そうなことが解ったので、
今度はもっと多くのもの、つまりキャラクターRigのように骨の数だけあるようなものにも対応すべく考えてみます。




ICE考察3
Array化
それは、いままででも紹介している高速化の為のArray(配列)を使った方法になります。(今回、もっとも単純な方法で・・・)
すると2段設定のICEになります。
まずはデータをArray(配列)化し、その後でオブジェクト個別毎にデータを引きだして位置データとする、という仕組みです。
ice_koma_11
元のアニメーションがたくさんのオブジェクトがあることを想定してGetDataをGroup(Groupという名前)から得ます。
Softimageは1からフレームが始まるので=1にしました。
Array化した値の入る箱の名前は、良く使うBoneTransformsとし、その前計算として代入値をPreBoneTransformsとしました。
個別のオブジェクトに付けるICEはコンパウンド化(BoneTransform2GL)しておきます。
そして、このコンパウンドBoneTransform2GLの中身は
ice_koma_012
となっています。
最初のGetDataはReferenceとしてつないでおいて、
コンパウンドをダブルクリックした時のPPG(プロパティーページ;設定画面)で、
ICEのついているPointcloudを[ピック]出来る画面にしておきます。
Indexの番号はGroupから得たオブジェクトの上からの順番で、これはから始まります。
今は1個しか入ってないので0です。

BoneTransform2GLというコンパウンドをたくさんのオブジェクトに一気に接続してしまうにはスクリプトが便利です。
BoneTransform2GLコンパウンドは事前にユーザーのワークグループにでも書き出しを行っておきます。
そして、こう書いたスクリプトを用意します。(違う名前のコンパウンドを同様に接続したい場合は、コンパウンド名前部分を変えるだけです)

sub BoneTransforms2GL( oObj )
   set compound = Dictionary.GetObject( oObj & ".null.ICETree.BoneTransforms2GL", false )
   if typename(compound) = "Nothing" then
     set iceOp = ApplyOp("ICETree", oObj, siNode, null, null, 0)
     AddICECompoundNode "BoneTransforms2GL", iceOp
   ConnectICENodes iceOp & ".port1", iceOp & ".BoneTransforms2GL.Execute"
   end if
end sub

sub BoneTransforms2GLData( obj )
   if typename( obj ) <> "Group" then
     logmessage "You must select Group."
     exit sub
    end if

   set oGrp = obj
   for i=0 to oGrp.Members.Count - 1
     set oObj = oGrp.Members.Item( i )
     BoneTransforms2GLoObj
   next
end sub

sub BoneTransforms2GLData( )
    for i=0 to Selection.Count - 1
     set oObj = Selection.Item( i )
     BoneTransforms2GLoObj
     next
end sub

BoneTransforms2GLData


をツールバーのボタン(例;BoneTransform2GL )にしておけば、いつでも使えます。
ice_koma_14
使い方はICETreeを付けたい複数のポリゴンオブジェクトを選択した状態でボタン(例;BoneTransforms2GL)を押します。
Pointcloud名とおのおののIndex番号を指定してあげます(例;ココでは1つなので0)。
ice_koma_13
これでどんなにたくさんあっても、コマ抜きが2コマでも3コマでも自由にアニメーションをつけて
設定した数のコマ抜き動きなってくれます。

では、この方法でもっと複雑な動きのもので、コマ落ちアニメーションが出来るのか実践してみましょう。



ICE実践1
キャタピラ
戦車のキャラピラのICE版です。この動きを2コマ落ちのアニメーションにしてみます。
キャラピラの車輪の動き(回転と移動)からしてキーフレームアニメーションではなく、すべてICEで制御された動きです。
唯一あるのは、矢印型のカーブが、ココからココへこの方向で行け、というのが Fcurveです。
ice_koma_15
えらいこっちゃーのように見える2つのICE、下のは回転と31個のキャタピラの動き計算、上のは計算された位置データをArray化しています。
やったことは上述の考察2の値の代入だけです。位置のデータを何コマ毎に更新するか、だけです。

これさえ理解できれば、複雑なロボットの動きも、モーションキャプチャーの人体アニメーションも、すべてコマ落ちアニメーションに出来ます。



ICE考察4
パーティクル;キャッシュ
では、今度はパーティクルのようにICEのSimulationで発生するような動きもコマ抜けアニメが出来るのか実験してみます。
まずは、無難にキャッシュしたものを考えてみました。
するとどうでしょう、意外にも簡単にできます。
ice_koma_16
通常発生するパーティクルは、キャッシュするとミキサオペレータにAnimationMixerとして配置されます。
そのデータを読むノードはCacheOnFileTake1 というノードになり、file Mode がRead Cacheになってます。

ice_koma_17

そのノードに入力するFrame 数が値の代入self.KomaFrameにつなげて、
受け取ったフレーム数のCacheだけを表示するってなってます。
ここでは参考としてModuloがなので、61218・・・フレームの結果が表示されていきます。



ICE考察5
パーティクル;シミュレーション
では、今度はパーティクルでキャッシュしてない、シミュレーションのものはどう扱えるのか考察してみます。
ice_koma_18
これは、そんな感じになった程度なんですが、SimulationRoot につながる Execute や Simulation に
Moduloから来る値が= OTrueの時だけ実行するってしてみた結果です。
この方法は次の= Oが来るまで実行しない、というものなので、フレーム数は伸びる感じになります。
コマを抜いたのとは違う感じはするのですが、動かないフレームを用意できる方法として紹介しておきます。

という訳で、どこか参考になるところありましたら幸いです。
まだまだICEが続きますかね。
乞う、ご期待!!
戻る

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

Daikin CG News お申し込み

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

Twitter

ページの先頭へ