ハリウッド映画をはじめとするVFX制作業務で培ったノウハウを基に、プライベートではHoudiniワークショップを精力的に開催する杉村昌哉氏。有機系背景モデリングを題材に、自動生成のしくみをプロシージャルに構築する手法を、全2回に分けて披露してもらう。
※本記事は月刊「CGWORLD + digital video」vol. 240(2018年8月号)からの一部転載となります
TEXT_杉村昌哉 / Masaya Sugimura
EDIT_沼倉有人 / Arihito Numakura(CGWORLD)、山田桃子 / Momoko Yamada
-
杉村昌哉
2014年にカナダ モントリオールのFramestoreへ。現在はCinesiteでSenior FX TDとして活躍中。
@sugiggy
sugi-iggy.blogspot.jp
VFXの高度化、複雑化、そして多様化。プロシージャルによる「自動化」が鍵となる
私は現在、モントリオールにあるCinesite 実写VFX部門のシニアFX TDとして、アートとテクニカル両面からエフェクト制作に携わっています。Houdiniをメインツールに、劇場映画プロジェクトに参加することが多いのですが、今後はNetflixを主とした配信系映像コンテンツ、VR/ARコンテンツ、ビデオゲーム等々、あらゆるデジタルコンテンツにおいて3DCGの需要が増えていくことが予想されます。そうした中、制作する側はいかに作業を自動化し、ハイクオリティなCG・VFXを安定して量産できるのかが、ますます重要になってくるはずです。これまでもスクリプトやプラグイン、パイプライン等によって様々な自動化が行われてきましたが、ツールやプラグインの制限、複数のデパートメントをまたぐパイプライン等の存在があるがゆえに、工程が途切れ途切れになってしまいがちでした。それに対して、Houdiniでは完全なプロシージャルを実現できるソフトウェア設計プラスWrangle(VEX)によるマルチスレッド動作の超高速なノードの搭載により、今までにないレベルで量産自動化かつアートディレクタブルなしくみが構成可能です。ことクライアントワークにおいては、フィードバックに応えるためフレキシブルでアートティレクタブルなしくみであることが大切です。
今回は「モニュメント・バレー」、「デフォーマでは実現が難しい角ばった岩石」という2つの作例を解説します。前者は、ディテール。後者は、バリエーションの自動生成がコンセプト。完全な自動生成のしくみを構築するのは、かえって非実用的になりがちですが、プロシージャルの用途を明確にすることで確かな恩恵が得られることがお伝えできれば嬉しいです。
TIPS 1:モニュメント・バレー
「モニュメント・バレー」は、アメリカ合衆国南西部のユタ州南部からアリゾナ州北部にかけて広がる地域の呼称です。テーブル形の台地と浸食が進んだ岩山によって構成される景観が独創的ですが、こうした有機的な背景(森、山、荒野など)ではフィジカルベースのルールを組み込むことで説得力のある仕上がりになります。
STEP 1:上部を構成するオブジェクトの作成
まずは上側部分の説明です。こちらはVDBを活用し形状を作成していきます。最初に形を崩したBoxを複数並べます。これが全体のシルエットを決めます。
【1】今回のしくみでは、バリエーションをシンプルに量産する目的でScatterで並べていますが、シンプルなジオメトリを組み合わせて、自分の好きなデザインにすることも可能です。その際、複数ジオメトリを交差させても問題ありません。後でVolumeに変換するため、閉じたジオメトリを使用した方が安定性が増します。
【2】次にPoly Reduce SOPを使って、岩らしい角ばった形状が出るまでポリゴン数を落とします。ここで作られる角張った形状が岩の特徴を表現しています。この例では20%まで減らしました。
【3】VDB From Polygonを実行し、Volumeデータに変換します。ここでVolumeデータに変換することには、下記3つの利点があります。
1.交差をなくした1メッシュの綺麗なメッシュを生成可能
2.デフォーマでディテールを加えやすい均一なポリゴン
3.VDBの特性を活かし、一体形成でのスムースなど様々な編集が容易
【4-1】VDB変換後ネットワークは2つに分かれます。
【4-2】図・左側は、ディテールを加えるための均一なポリゴンの1メッシュです。Convet VDBでポリゴンに戻します。一方、図・右側はVDB Smoothを使用して形状を滑らかに変更し、角張った部分はディスプレイスメントにより交差破綻しやすく、Mountain SOPの変形は通常のディスプレイスメント同様、法線方向に行われるので滑らかにしたNアトリビュートをAttribute Transferで左側に転送後Mountainでデフォームを行うことで破綻のないディテール追加が行えます。
【4-3】まずは大きなWorleyノイズを使用し、大きなガタガタのディテールを追加します。
[[SplitPage]]STEP 2:風化による浸食の表現
続けて、上部を構成するオブジェクトに対して、長年にわたる風化によって浸食されたようなノイズ処理を施すことで質感を高めます。
【1】雨でなどで浸食されような縦長のノイズを適用します。ノード「moutain_slit」にて、根本部分に上からの重みによって崩れたような細かいノイズをWrangleで追加します。
【2】手順【1】のノードツリー中にある「noise_terrasse_bottom」でBoundingBoxをマスクに使用することにより、全体の形状が変化しても根本部分に常に同様のディテールが加えられます。
【3】さらにノイズのサイズとタイプちがいのMountain SOPを2回使用して、ディテールを追加します。
【4-1】全てのMountain SOPの前にAttribute Transferで先ほど作成したスムースな法線を転送しています。
【4-2】最後のpointvop(ノード「pointvop_worleyNoise」)により、worleyを追加します。ノイズが全体に均一に当たらないよう、Worleyノイズを別のノイズで強度をコントロールしています。以上で、上部の完成です。
STEP 3:土台の作成
土台部分を作成します。大きくは「土台のサーフェス」と「表面に散らす小岩」という2つのしくみを構築していきます。
【1】土台部分を表現するノードツリーです。大きくは以下の2つのしくみで構成されています。
1.土台のサーフェス。地形制作に向いた新機能HeightFieldを使用
2.表面に散らばせた小さな岩。1を作成した際にできたアトリビュートを利用
【2】まずは土台のベースとなる部分を円柱から作成します。上側部分のみRay SOPで一番最初に作成したシルエットを決めるジオメトリに貼り付けます。こうすることで上部の形状が変わっても土台の部分も自動的に変更されます。
【3】ノード「heightfield_project1」にて、HeightField Project SOPで空のHeightFieldをこの土台と同様の形状に作成できます。その上でHeight Field Distortでディテールを加えます。
【4】さらにHeightField Noiseで大きなうねりを加えます。
【5】HeightFieldの特別な機能として、時間経過による高速なErodeシミュレーション「HeightField Erode」が実装されています。これにより雨などで地形が浸食されていく様子をリアルに再現できます。5フレーム目で良い結果が得られたので、ノード「timeshift1」で止めます。これで土台のベースとなる部分は完成です。HeightFieldをConvert HeightFieldでPolygon Soupに変換します。
[[SplitPage]]STEP 4:地表に岩を配置する
<STEP 3>で作成した土台のサーフェスに岩を配置します。HeightField Erodeは、形状を作る以外にも様々なアトリビュートが作られます。STEP 3・手順【5】に載せたパラメータ中に表示されているのは「flow」という名のアトリビュートです。これと、地形の傾き具合を利用し、より凹んだところと面が平らな所に対して、より多くの岩が配置されるように「density」アトリビュートを作成します。こうすることで物理的に説得力のある岩の配置が行えます。
【1】地形の傾き具合は、上向きのベクトル{0,1,0}と法線の内積を取ることで取得できます。その値とflowアトリビュートを混ぜ、さらにRampで制御できるようにすることでアートディレクタブルなコントロールが可能です。
【2】スキャッタでポイントを配置します「Density Attribute」にチェックを入れることで、深度(Density)アトリビュートの強度を分布に使用できます。
【3】このポイントにcopy to pointsで岩を配置します。ポイントに大きさpscaleと回転orientの値をもたせておきます。STEP 3・手順【1】に載せたノードツリー中にある「pscale1」にて、以下の値を設定します。
@pscale = fit01(pow(rand(@ptnum),10),0.4,1) * 4;
【4】本来はヒーロー的な岩をいくつか用意し、バラバラにStampで配置するのが望ましいのですが、今回はカメラからの距離を考慮し、すでに物理的に説得力のある分布ができているので全て同じ形状の岩【画像上段】をサイズと回転をランダムにするだけで十分な結果が得られました【画像下段2枚】。これで土台部分の完成です。レンダリングを実行する際は、1.上側部分、2.土台のサーフェス、3.Scatterされた小さな岩という3つの構成要素をMergeせずに別々にBgeoで書き出した方が何かと効率的です。全てMergeしてしまうと、1つのネットワークの変更があった場合にすでに完成した部分をその都度Mergeするという、非効率なつくりになってしまうからです。冒頭に載せた4枚のイメージは、一番最初のシルエットを決める形状を配置したScatterのシード値を変えただけで自動的にバリエーションが作成されています。
「アートディレクタブルなアセット制御のしくみをプロジーシャルに構築する<2> ~岩石の多様化~」につづく
info.