« なが~いの | トップページ | モチベーション »

2011年5月30日 (月)ICEを使ってみるテスト

おはようございます、本日の当番モーションデザイナーのY.Nです。

本日は、今のところ業務とは全く関係が無い事、Softimage ICE について書いてみます。

ICE が世に出てから随分経ちますが、業務にどう役立つかイマイチわからないのと、特になくても日々のタスクはこなせるので、ず~っと触らず最近まで放置しておりました。

ところがいつの間にやら、Full Body IK モーションキャプチャ、はたまた
モデリングまで ICE でできるようになっているじゃありませんか。
ICEを使ったツールが増えてきて、そのうちICEと関わらざるを得ない時がやってくるかもしれません。

こりゃちょっと触っといた方がいいかなという事で、ICE Kinematics が出たあたりからチョイチョイいじっておりましたが、中々面白いですねコレ。
そんなわけで、普段の業務にまだ使っているわけではないですが、
今回取り上げてみたいと思います。

ICE Tree の呼び出し方などの基礎については、ヘルプなどしっかりとした
資料がありますので端折ります。
ここでは、ざっくりと使い方などを説明できればと思っています。

全然実用的じゃねぇ!とか思っても、そこは黙って目を瞑っておいてください。
寛容的な気持ちでいる事が大切といえるでしょう。
ホウホウ、このICEノードはこんな風に使うんやね、程度に見ていただきますよう
お願いします。


今回は、
3ds MAX 2012 に新たに搭載されたスカルプティング&ペイント機能の
一部まねごととして、
ペイントで対象オブジェクトのメッシュ上にコンポーネントを沿わせる
といったことを、やっていきたいと思います。

結果は、こんな感じになります。
図では、球の上にあるグリッドにウェイトをペイントすることで、
ペイント範囲のグリッドのポイントが球の方に移動
しています。

2011_0527_01_4

ここで説明しようとしている事柄
・ICEノード Raycast
・ベクトルの計算



では、どんな感じで ICE を使うか見ていきましょう。

今回の例では ポリゴン球 と ポリゴングリッド を使って、
グリッド に ICE Tree を設定しています。
ICE Tree はこんな感じです。

2011_0527_02

球を取得して、DWMなんとかっていう濃い水色のICEノードに球の名前を入れて実行しています。
このDWMなんとかはICEカスタムノードです。
コンパウンドを展開するとこんな風になっています。

2011_0527_03_2

大雑把にいうと、以下の4段階の計算をしています。
1.グリッの頂点を取得
2.グリッド上の各点から球上の点までの距離を取得する
3.距離にウェイトマップの値を掛ける
4.3の距離だけグリッドの点を動かす


では一つずつ見ていきましょう。
■1.グリッド、球それぞれの頂点を取得

2011_0527_04

①のGet Data でコンパウンドに入力された 球の名前を取得、
Value でジオメトリを出力しています。

この出力結果が後で球上の頂点情報を出力するのに使われます。

もうひとつ、②のGet this.PointPosition で、
グリッド自身の頂点位置(ローカル座標)を取得しています。


で、その結果を Pass Through ってのに繋いでますが、これはタコ脚配線を
するためのノードで、ここで何か計算しているわけではありません。
ICE Tree 作成時の試行錯誤の手間を軽減するためのノードみたいなものです。

たとえば今回の例でいえば、②の値に対してグローバル座標に変換するなどの処置を施してからじゃないと使えないという事が、結構ツリーを組み上げてからわかったとします。

②からいきなり各計算処理に値を渡していた場合、変更が必要な出力結果が
複数にまたがっており操作が面倒になりますね。
出力先一本ずつ座標変換しないといけなくなります。

一方、②の値を Pass Through に繋げていた場合は、
②と Pass Through の間の単線部分で座標変換処理を加えると変更が完了。

ツリー構成もシンプルにできるし、使わない手は無いですね。


■2.グリッド上の各点から球上の点までの距離を取得する

2011_0527_05

2011_0527_06

Raycast を使います。
グリッドから Ray を 球に Cast(飛ば) して当たった所を取得する
という感じで使います。
このノードを使うときの入力データは次の3つです。

Geometry ← Raycast 先は何なのか。ジオメトリを入力。
Position ← Raycast 元はどこか。位置情報を入力。
Direction ← どの向きに Raycast するのか。ベクトルを入力。


出力結果は次の2つです。
Location ← Ray が当たった所はどんなのか
Hit ← Ray が当たったのか、外れたのか

Hit は 当たりかハズレか、どっちかの結果であるブーリアン値しか返しません。
一方 Location は当たった所がどんな所なのかという情報を全部返します。
その情報中に位置も含まれていますので、それを③で取り出しています。

では、入力の方を確認していきましょう。

Raycast 先のジオメトリとして、先ほど①で取得していた球のジオメトリを入力。
Raycast 元の位置情報として②で取得したグリッドの頂点情報を入力。
3次元座標なのでデータ形式は 3D Vector です。

で、どの向きに Raycast するのかですが、今回はとりあえず法線の向きに
動かすことにしましょうか。
どうやって法線ベクトルを調べるかですが、これは簡単に④のように
Get で取得できます。

これまで使ってきた②の位置情報を使わずに別経路で④を得るのは、
不安な感じもするのですが、大丈夫。
大変便利なことに、ちゃんと②に対応した法線を④で得る事ができます。
これで、法線を取ることができましたが、今グリッドは上向きなので
球に Ray が当たりません。
グリッドをひっくり返すのが筋ですが、ここではノードの紹介を優先して
negate を使ってます。
これは入力されたベクトルを反転するICEノードです。
この結果を Raycast の Direction に入力。

先述のとおり、Location 情報が出力されますので③で位置を取得します。
この位置情報はグリッド のローカル座標として出力されます。
あくまでグリッドのローカル座標であって、グリッド上の各点からのローカル座標ではありません。

後ほどウェイトマップを使って、移動具合を調節してやりたいので
元の点からどの向きにどれだけ動いたかという頂点の移動具合を表すベクトルが知りたいところです。
これがわかれば、ウェイトマップの値を使って点を移動した感じにすることができますね。

2011_0527_07

というわけで Subtract で③から②を引いて欲しいベクトルを導き出します。


■3.距離にウェイトマップの値を掛ける
2011_0527_08

ここでウェイトマップからウェイトの値を取得して、さっき取りだした頂点の移動具合を表すベクトルに掛けてます。
座標や向きを表すベクトルと、ウェイトマップのウェイト値のような単一の値であるスカラー値を掛け算する時は、
④Multiply by Scalar ってやつを使います。

これで先の図の赤い矢印にウェイトマップの影響を与えた結果を出す事ができました。

2011_0527_09

■4.3の距離だけグリッドの点を動かす

2011_0527_10

②に④を足すことで移動先に予定している頂点の座標が出てきます。
この値を Set Data でグリッドの頂点に返してやると、冒頭の図のような状態に
なるわけですね。


今回はひとまず、ここまでにしておきます。

次回、頂点を移動させる向きのオプションを一つ追加してみます。
カスタムICEノードにリストボックスを追加して、オプションを選べるようにしようと思っています。


まぁ、こんな感じで使い方のバリエーションを増やしていけば
そのうち何か役に立つことがあるかもしれないですね。
のんびり行きたいと思います。
それではまた。

follow us in feedly
result = encodeURIComponent( "http://www.accessgames-blog.com/blog/2011/05/post-9725-2.html" );document.write( "result = " , result );&media=https%3A%2F%2Ffarm8.staticflickr.com%2F7027%2F6851755809_df5b2051c9_z.jpg&description=Next%20stop%3A%20Pinterest">

| | コメント (0) | トラックバック (0)

« なが~いの | トップページ | モチベーション »

モーションデザイナー」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: ICEを使ってみるテスト:

« なが~いの | トップページ | モチベーション »