日本でハリウッドVFXを制作! 「経産省アイディアボックス」 結果:  
●まとめエントリはこちら ●FAQ ●お問い合わせは左のメールフォームから

2009年5月21日木曜日

エクササイズ: ロケータ位置を頂点としてポリゴンを作成する。 (1)

このエクササイズのお題は、知り合いの人に教えてもらいました。

複数のロケータを選択し、そのロケータの位置を頂点としたポリゴン面を作成する。
ロケータをアニメートしたときにポリゴンの頂点はそのロケーターについて動く(コンストレインのように)。

これを直接またはラップデフォーマーとして、より大きい面を動かすことで、皮膚表面などのストレッチする「面」をトラッキングできる。

わかりにくいですが、2D用で、3Dのオブジェクトトラッキングではありません。

たとえば、クローズアップのショットがあるとして、顔の頬に浮き出てくる血管などに使える。
ただし、顔の向きがショット内で大きくかわると使えないと思う。

まず、アニメーションテクスチャーをこのオブジェクトに貼って、レンダリングする。
それをコンポジットによって合成する。
そのときにソリッドなオブジェクトだと、あるポイントは皮膚上に張り付いて見えても、面としてみると
テクスチャーが皮膚表面をスライドすることがある。
それを防ぐために使うことができる。

映画などで使えるかどうかはわからないが、TV番組程度なら、VFX費用を抑えるためにカメラの動きも押さえてアングルも変わらないショットがよくあるので、たまに、使うことができるスクリプトだ。


--------------------
まず、おおざっぱなアルゴリズムを考えてみた。
0)ロケータを選択する。
1)ロケータの位置情報を得る。
2A)その位置がポリゴン頂点となるようにポリゴンを作成する。
2B)もしくは、同じ頂点数のポリゴンを作成してから、頂点をロケータ位置へ移動する。
3)ロケータの位置が移動したとき、ポリゴンの各頂点も更新されるようにする。


まず今回新しい手順である、ポリゴン作成だが、ヘルプでポリゴンの項目を見て探したところ、「polyCreateFacet」が使えそう。
なにより、バーテックスを特定の座標位置に作成できるので2Aにかなっている。
(後から「ポリゴン作成ツール」を使ってスクリプトエディターで確認したところ同じコマンドだった。)


次に、ポリゴン頂点をコンストレインする方法だが、
前もって確認したところ、エクスプレッションは使わない。と言われたのでexpressionコマンドは使えない。
しかしリアルタイムで行うにはエクスプレッション意外に方法がないような気がするのだが...。


しばらく考えてみて、いくつか思いついた。
●頂点一つにつき、一つのクラスタを作成し、そのクラスタをロケータへポイントコンストレインまたは、ペアレントする。 でも無駄が多いような気がする。

●connectAttrを使い、ロケータのtx,ty,tzの値をpolygon.vertex[n]のtx,ty,tzに接続する。


現時点で可能性としてよさそうなのは二番目の「connectAttr」を使う方法なので、これが本当に可能なのかどうか調べてみる。

まずバーテックスのアトリビュートに単体でtx,ty,tzもしくはそれに相当する物で接続可能アトリビュートが存在するのか?


--------------------
まずポリゴン作成ツールで三角形のサーフェイスを作成。
その一頂点を選択してスクリプトエディターから名前を得た。
polySurface1.vtx[0]

アトリビュート名を取得する為に「listAttr」を使ってみる。


コネクト可能なアトリビュートでないと意味が無いので、-c(-connectable)フラグを使用する。

得られたのは以下のアトリビュート
pnts[0]
pnts[0].pntx
pnts[0].pnty
pnts[0].pntz

おそらく左側が頂点番号。ようするにpnts[0]はvtx[0]のtranslateのことだろう。
で、右側がtranslateの座標軸を示していると思われる。


--------------------
これでなんとか、いけそうな気配なので、ロケータを作ってこのアトリビュートに接続してみる。

まずロケータを作り目的の頂点へスナップ移動する。

次に、コネクションエディターを使って、接続してみた。
最初、以下の点がわからず、少し迷ったが、結果としてはうまくいった。

ポリゴンサーフェイスを選択したときはTransformノードが選択されているのでこのままコネクションエディターに読み込んでも頂点情報は表示されない。

頂点はShapeノードの情報なので、コンポーネントモードで頂点を選択するかShapeノードを選択してからコネクションエディターに読み込む必要がある。

ポリゴン作成ツールで作成した場合できた頂点の座標はすべて「0 0 0」になっている。
ロケータを頂点へスナップした場合、ロケータの座標はたとえば「5 0 5」などの値になる。
そのためこの状態でコネクトした場合、頂点の一は現在の位置から「5 0 5」の場所になってしまう。

うまく接続するにはロケータをトランスフォームフリーズするとうまくいったが、実際に使う際にはトラッキングされてキーフレームのついたロケータが先に存在し、そこに頂点を作成することになる。
これをうまく補正する方法は二つ。
●コネクトする際に値を補正(+-)する。
●ポリゴン作成時に頂点をまず0 0 0へ作成し、その後ロケータ位置へ移動する。



続きは後ほど

 

0 件のコメント:

コメントを投稿