>   >  VFXアナトミー:映画『世界から猫が消えたなら』(VFX制作:リンダ)
映画『世界から猫が消えたなら』(VFX制作:リンダ)

映画『世界から猫が消えたなら』(VFX制作:リンダ)

02 手の中で砂状化するスマートフォンのワークフロー

アセットはAlembicで作成したものを使用

砂状化するスマートフォンは、ショットで使われているスマートフォンの形状と一致させないといけないため、形状を合わせたスマートフォンのCGモデルや手のCGモデルを使ったアニメーションをMayaで作成してAlembicで出力し、Alembic Archiveノードを作成して読み込んでいる。現在のHoudini 15ではもう少し単純なノード構成でAlembicをHoudiniに読み込むことができるというが、制作当時はまだ利用できなかったため、多くのノードを組み合わせる必要があったという。


▲スマートフォンモデル用のAlembicを読み込んだノードの例。各ノードはMayaのshapeノードに対応している


▲Alembic Archiveノードを展開した状態。図が小さいのでわかりにくいと思うが、青いノードはMayaのtransformノードで、灰色のノードはMayaのshapeノードだ


▲各shapeノードの中のセットアップ例。file1と書かれたノードはパーティクルに変換されたもの

Shapeをボリュームに変換する

砂状化されるスマートフォンのモデルは、内部の部品や厚みなどもモデリングされている。これは形状の表面だけのモデルだと、パーティクルを分散した際に形状の中に入らず外側だけになってしまうため、内部構造もある程度つくり込む必要があったのだという。内部形状を作成しておくことで、形状が砂となって崩れるというエフェクトもとてもリアリティをもって表現されている。Alembicで読み込まれたパーツは、まずボリュームに変換され、そのボリュームに対してパーティクルが発生するように設定された。砂のブロック感を出すにはブロックのセンターを決めないといけないため、生成されたパーティクルを結合することで、ジオメトリが変化してもプロシージャル的にブロックの大きさを設定することができるようになっている。


▲Mayaで作成されたスマートフォンのモデル。パーティクルの生成や砂状化の途中で内部構造が露呈することを考えて細かい内部パーツもモデリングされている



  • ▲ボリュームに変換された状態



  • ▲ボリュームからポイントに変換された状態


▲Shapeがボリュームに変換されるまでのノード構成。黄色の部分はAlembic Archiveからtransformアニメーションなしでジオメトリをまとめ、ネームアトリビュートを付加している。ピンクの部分ではSurfaceにポイントを配置し、元のジオメトリの法線情報とUV情報をもっているポイントを用意。青い部分のノードはShapeをボリュームに変換するノード。赤い部分でボリュームに対してポイントを配置し、オレンジのノードで法線とUVのアトリビュートをボリュームのポイントに適用している。最後に紫のノードで、各シェイプごとにポイントのデータを別ファイルにして保存する


▲ひとつ上の画像にある青い部分のノードforeach_2volumeノードの内容。赤い部分のノードはポリゴンモデルをボリュームに変換するノードで、黄色の部分のノードでもともとのネームアトリビュートとカラーアトリビュートをボリュームに移している

ポイントキャッシュの解像度もノードで対応

出力されたポイントのキャッシュは、transformのアニメーションが付いた状態でジオメトリに読み込まれ、シミュレーションが行われる。シミュレーションでは、テスト用や最終出力用など解像度を変更することができるようになっており、作業内容に応じた解像度ですぐに修正に対応することが可能だ。


▲出力されたポイントキャッシュを使ってシミュレーションを行うためのノード構成。黄色の部分のノードでtransformアニメーションの付いたポイントキャッシュを読み込み、ピンクの部分のノードでシミュレーションの解像度を変更してソースに渡している。ポイントキャッシュの内容は変更せずに解像度を変更してシミュレーションを行うことができるため、ポイントキャッシュを取り直す必要がない。解像度は作業の内容に応じて左側のTakeで切り替えることができる

Houdiniによるシミュレーションの様子

▲センターポイント表示

▲パーティクル表示

コリジョンを設定し、シミュレーションを行う

ポイントキャッシュを必要な解像度に変換したら、コリジョンとなる手のオブジェクトを設定してシミュレーションを開始する。Houdiniの基本的なシミュレーションはデータベースに格納されているため、ソルバを変更しながら、シミュレーションされたデータベース内のデータを使ってユーザーが必要なデータに加工することができる。他のツールならプラグインを書かないといけないような作業でも、Houdiniであればソルバの組み合わせで必要なパイプラインを作成することができるのだという。本作では、砂状化するスマートフォンを手で握るという演技があったため、VFX作業を統括しているVFXスタジオのジット(十十)が役者の手に合わせてMayaで手のCGモデルを作成し、アニメーションが付けられたAlembicデータをパーティクルのコリジョンとして利用している。モデルをコリジョンとして使用するにはサーフェスのままだとコリジョン判定の効率が悪いのでボリュームに変換された。ただ、手を握ってしまうとひとつのボリュームの塊になってしまい指の隙間などのシミュレーションが上手くいかないため、手のモデルを細かいパーツに分割して変換している。


▲手のコリジョン設定からシミュレーションにいたるまでのノードの構成。明るい黄色の部分は手のコリジョンオブジェクト。濃い黄色の部分は、粘度を設定しフレームごとに弱めるSOPソルバ。赤い部分のノードは、センターポイントを使用してブロック感を出すPOP VOP。紫色の部分はFLIPオブジェクトで、青い部分のノードがFLIPソルバ。緑の部分のノードはブロック感を出すためのセンターポイントをここでフレームごとに計算させるためのSOPソルバだ


▲センターポイントを計算するためのSOPソルバの構造。add1でパーティクルシステムのPrimitiveを追加し、fuse1で近い範囲のポイントをひとつにまとめる。CENTER_POINTSはもともとのポイントをfuseでまとめたポイント。上書きされないようにdisplay flagはdop_geometryのままだ


▲POP VOPのパラメータ


▲センターポイントを使用してブロック感をだすためのPOP VOPの構造。水色の部分は最も近いセンターポイントの番号を調べるノード。黄色い部分はセンターポイントの座標を得るノード。青い部分のノードは使ったセンターポイントの座標をパーティクルに保存する。赤い部分のノードはセンターポイントの周りのパーティクルの平均速度を計算するpoint cloudのノード

次ページ:
03 レンダリング用のノードを構築する

その他の連載