最新のHoudini 16に新しく搭載された強力な地形作成機能「HeightField」。昨年上梓した自著のヒットも記憶に新しいトランジスタ・スタジオの平井豊和氏にこの機能を中心に用い、モニュメントバレーのような自然の景観を作成してもらった。

※本記事は月刊「CGWORLD + digital video」vol. 227(2017年7月号)からの転載記事になります

TEXT_平井豊和(トランジスタ・スタジオ
EDIT_藤井紀明 / Noriaki FUjii(CGWORLD)、山田桃子 / Momoko Yamada

Houdiniを用いた地形のモデリング

Houdiniの最新バージョンである16で新たに追加されたHeightField機能を使用して、アメリカ合衆国西南部にあるモニュメントバレーのような、岩山が点在する荒野の背景を制作しました。主にエフェクトの制作に使用されることが多いHoudiniですが、もともとモデリングの機能も非常に優れており、プロシージャルで柔軟なモデリングを自由に行うことができます。さらに新たに追加されたHeightFieldでは、複数のノイズパターンを組み合わせて単純な地形の隆起を表現するだけでなく、数百年や数千年にわたって侵食し変化する地形をシミュレーションによって表現できるため、非常に説得力のある地形を制作することができます。

  • 平井豊和(トランジスタ・スタジオ)
    テクニカルディレクター。著書『Houdiniではじめる3Dビジュアルエフェクト』発売中。今年の4月に入籍しました
    graberry.web.fc2.com

ここでは、HoudiniのHeightFieldを利用して地形を制作する際の全体的なながれを一例として提案したいと思います。新機能であるHeightFieldの概要や基本的なしくみの理解といった初歩的な事項から、台地などの特殊な地形をSOPの利点を活かしてモデリングする方法、単調に見えないような説得力のあるノイズの追加方法、最終的に細かいディテールをつける方法といった、地形を制作する上での手順や注意すべきポイントをひとつずつ順を追って記述します。また、Houdiniに関する深い知識はなくても十分に理解できる内容なので、Houdiniを始めたばかりという方もぜひとも地形を制作する上での参考にしてみてください。

制作する上での注意点として、二次元平面から高さ情報のみを変位させて形状をつくるというHeightFieldの性質上、絶壁や崖のような垂直にそびえるものに対してはディテールをつけることが難しいため、細かいディテールはボリュームからポリゴンに変換した後やレンダリング時につける必要があります。また、特にゲーム用途では背景に割けるポリゴン数が限られるため、最終的に出力する際のデータ量や計算量をいかに効率的にするかということも大きな課題となりそうです。

使用Software:Houdini 16.0.600

HeightField

まずはHoudini 16で新たに追加された地形を作成するための機能、「HeightField」について理解を深めましょう。

HeightFieldとは


HeightFieldはHoudiniの最新バージョンである16で新たに追加された、主に図のような地形要素を制作するための機能やノード群です。実態は平面的な二次元ボリュームで、基本的には特定のボクセルにおける高さを表す数値のみを制御することでOpenGLの描画時に形状がつくられ、最終的には二次元画像や三次元ジオメトリとして出力を行うことが可能です。これにより従来通りポリゴンでモデリングをするよりもメモリ効率が良く、マスクを定義しながら値を加算や乗算などの演算により制御が可能なことから、まるで画像のコンポジットのような感覚で三次元形状のモデリングをすることができます。また、実際のプリミティブタイプがVolumeであることから、通常の煙や炎を制御する際と同様にVolume VOPやVolumeWrangleなどのノードをそのまま使用することも可能です

HeightFieldのプリセット


Houdini 16で新たに追加された「Terrain FX」というタブのシェルフから、プリセットとして用意されているサンプルを見ることができます


アイコンをクリックするだけでなくプレイバーを再生してみると、雨や風によって侵食されて地形が変化していく様子を見てとることができます。山、丘、渓谷をはじめとして、孤島や月の表面といった様々な種類の地形が用意されているため、初めてHeightFieldを使用する場合はまずこれらをひと通り見ることでも基本的なノードの繋ぎ方やセオリーを把握することができます

HeightFieldのノード


「HeightField ~」で始まるSOPは全てHeightFieldの専用ノードです。ほぼ全てのHeightField用ノードはデジタルアセットであるため処理の内容が把握しやすく、場合によってはノードの仕様自体を改変することも可能です


HeightFieldタイプの情報に対応する入力部や出力部の接続は青緑色に表示されます。これにより、ネットワークが複雑になってしまってもHeightFieldを制御しているノード群が判別しやすくて非常に便利です

  • 代表的なノード

    【HeightField Draw Mask】
    カーブを自分で描いてマスクを定義できます。ペンタブレットを使用してより直感的にマスクを定義したい場合はHeightField Paintでマスクを定義することもできます

    【HeightField Mask Noise】
    ノイズによりマスクを定義します。単調でなく情報量をもったリアリティのある地形を制作したい場合には欠かせないノードです

    【HeightField Mask by Feature】
    地形の高さや傾斜、曲率などの特徴によってマスクを定義できます。例えば渓谷部にのみノイズを加えたり、平地のみ専用のテクスチャを変えたりなどといったプロシージャルな編集を加えることができます

    【HeightField Mask by Object】
    別のオブジェクトによりマスクを定義できます。従来のSOPの利点をそのまま活かして自由な形状のマスクを定義することができます

    【HeightField Noise】
    高さにノイズを加えて歪めます。地形を制作する上で使用頻度の非常に高いノードです

    【HeightField Distort】
    HeightField Noiseが特定のボクセルに対する高さの値にノイズを加える一方、このノードはもともとの高さの情報を二次元平面に沿って移動させるようにして歪めます

    【HeightField Erosion】
    時間軸に沿ってシミュレーションをして侵食を表現しHeightField Erosion ます。HeightFieldの目玉とも言えるノードです

次ページ:
おおまかな形状の作成

[[SplitPage]]

おおまかな形状の作成

モニュメントバレーやキャニオランズ国立公園などのアメリカ合衆国西部などに存在する、差別侵食により形成されるメサ(Mesa)やビュート(Butte)と呼ばれる卓上台地をつくります。

1.従来のSOPを使用してモデリングをしてからHeightFieldに投影

まずアプローチとして考えられるのは、従来のSOPでモデリングをしてからHeightFieldProjectで投影する方法です。概ねの台地の形状を思い通りに形づくりたい場合に最適なアプローチです


シンプルな制作例として、Curveノードで底部の形状を自由に描いて形づくってから複数回PolyExtrudeをくり返し、上方向に盛り上げていきます。当然ながら、より複雑な形状にモデリングをしたい場合はさらにPolySplitやEditを駆使して自由にモデリングをすることができます



  • Houdini 16の新たなインターフェイスで追加されたラディアルメニューを利用すればシーンビューでも自由に機能を選択でき、効率的にモデリングをすることが可能です



  • あくまでも投影用のジオメトリであるため、この段階でUVやトポロジーを気にする必要はまったくありません。また、ディテールはこの後に付加していくため今はおおまかな形状のみで問題ありません。納得のいく形状になったら、HeightField Projectを使用してHeightFieldに投影をします

2.最初からHeightFieldを利用

別のアプローチとして、最初からHeightFieldで形状をつくるという方法があります。まずHeightFieldノードで基となるHeightFieldを作成したら、HeightField Mask Noiseノードでノイズによってマスクを定義します



  • この際、Noise Typeを「Worley(cellular)F1」を選択すると簡単にそれらしいマスクを作成することができます。また、Post ProcessingにあるGainパラメータやBiasパラメータを調整して、くっきりとした境界をもつマスクにしておきます



  • このマスク部分を上に持ち上げるだけでは地面との境界が垂直になってしまい不自然になるため、HeightField Mask Blurノードを2回使用してマスクを広げてから境界をぼかし、HeightField Layer ノードでLayer ModeパラメータをAddにしてマスク同士を加算します


それからHeightField Noiseノードでマスク部分にのみノイズがかかるようにして上に持ち上げれば台地が出来上がります。具体的な形状を指定する必要がなく、プロシージャルに配置をしたい場合にはこちらのアプローチが便利です。今回の例では、手前に見える大きなメサとビュートのみ前者のアプローチを使い、奥にある数々の台地を後者のアプローチでつくりました

自然なノイズの付加

地形を制作する上で必要不可欠であるノイズを加えて適度に歪ませ、自然な形状にしていきます。

1.ノイズの追加



  • HeightField Noiseノードを使用してノイズを加えます。内部的にUnified Noise Static VOPを使用しているためFractalのタイプなども含めたノイズの細かい制御まで可能で、さらに発展させてCenter NoiseやPost Processingなどのパラメータを追加することにより思い通りのノイズに調整でき、非常に扱いやすくなっています



  • HeightField Noiseノードは高さの情報に対して値を加減算してY軸方向にのみ歪めるものですが、HeightField Distortノードを接続すると二次元平面に沿って元の形状を移動させてさらに歪めることができます。特に砂丘などに見られる、風に運ばれて波打ったような形状をした地面も容易に作成することができます



  • Noiseのみを適用した例



  • NoiseとDistortを適用した例

2.ノイズをより自然な見た目に編集

NoiseやDistortを一度適用しただけだと場合によっては少々幾何学的で不自然な結果に見えがちなため、HeightField Mask NoiseノードやHeightField Mask by Featureノードでマスクを定義してから部分的にノイズをかけるということを複数回にわたってくり返すことで、より自然な見た目にすることができます



  • 1つのノイズのみを追加した例。非常に単調に見えてしまいます



  • 複数のノイズをくり返しかけた例。この少しの手間をかけるだけで説得力が格段に上がります

3.段丘を追加


HeightField Terraceノードを使用すると卓状台地や棚田に見られるような階段状の段丘を容易に作成することができます。これに関しては、一度適用するだけの完全に等間隔な結果こそが実際の地形通りの望ましい結果ということもありますが、場合によってはノイズと同様に同じ箇所に数回適用してバラつきを与えることで自然な結果にすることができます


一度Terraceを適用した箇所は元の傾斜の情報を失ってしまうため、同じながれで複数回適用するのではなく、それぞれ適用したものをHeightField Layerノードで重ねる必要があります。マスクは自動的に作成されているため、Replaceモードで第3入力に第1入力と同じものを接続するだけで問題ありません。Terraceによって平らになりすぎたりノイズが一様になりすぎていても、この後に侵食の効果を適用させる箇所についてはまだ形状が変化するため、あまり細かく気にすることなく次に進むことにします

次ページ:
侵食の表現

[[SplitPage]]

侵食の表現

従来のモデリングでは難しく、新機能HeightFieldにより簡単に実現できることになったもののひとつがこの「侵食」の表現です。単なるノイズでは表現しきれないような地形を侵食を利用して形づくっていきましょう。

1.侵食のパラメータを確認

HeightFieldの目玉機能とも言えるHeightField Erosionノードを利用して、地形の侵食を表現します。侵食は、雨やそれによってできる河川による侵食(洗掘)と、風や土石などの蓄積物による侵食(磨食・風食)の2つに大別されます



  • パラメータを見てみると、水による侵食を制御するHydroと熱による侵食を制御するThermalがすぐに目につきます。まずおおまかに得たい結果に近づくようにこれらのパラメータを調整します。今回の例では砂漠気候で雨量は少なく、河川や湖ができないような値に調整しました



  • 水による侵食も表現しつつ貯水がされないようにするには、PrecipitationタブのEvaporation Rateパラメータの値を上げていきます


次に、斜面を流れ落ちて蓄積する堆積物の設定をDebrisタブのパラメータで設定します。Repose Angleパラメータの値によって斜面の角度が設定可能です。また、同時にErosionタブのThermal Feature Sizeパラメータが適切な値になるように設定をしていきます。この値は地形のスケール感によって適宜調整をする必要があります

2.浸食の表現を適用


プレイバーを再生してみると、地形が侵食によって変化していく様子が見てとれます。侵食前の状態でのノイズの種類や大きさによっても侵食の結果が大きく左右されることがあります。なかなか満足のいく結果が得られない場合は、侵食のパラメータだけを調整して試行錯誤を続けるだけでなく、それ以前の状態でのノイズのスケールなどを見直してみるとよいでしょう。また、より手間をかけて自然な結果を目指したい場合は複数パターンの侵食を用意して、上記のノイズの場合のようにブレンドをするとより説得力を出すことができます


File Cacheノードなどでジオメトリキャッシュをとる際には、たとえ静止画を制作する場合においても複数フレームにわたる情報を全てとっておき、そのすぐ下流にTime Shiftノードを繋いで特定のフレームで時間を止めるようにするとよいでしょう。こうすることでシミュレーションをかけ直すことなく、止めるフレームを変えるだけで侵食の度合いを自由に調整することができるようになります

さらなるディテールの追加

ポリゴンに変換をして、ディテールを追加していきます。

1.ポリゴンに変換

Convert HeightFieldノードを使用すると、制作した地形をポリゴンに変換することができます。しかし、高い解像度のボリュームをそのまま変換すると全体的にハイポリゴンになってしまい、多くのデータ量や計算時間を要してしまいます。特にジオメトリをゲームの背景などとして用いる場合は、当然ながら遠い山々に多くのポリゴンを使用することはできません。Remeshノードなどで分割しなおすこともできますが、調整や計算に時間がかかってしまうためあまり効率的とは言えません。そこで、ここでは別のアプローチを採ります


まず、制作した地形をHeightField Outputノードで二次元画像としてエクスポートします。このとき、自分で定義したマスクが複数あって変換後にも使用をする可能性がある場合は、その全てをエクスポートしておきます。flowなどの特殊なものを除けばほとんどが一次元情報なので、チャンネルごとに情報を格納した画像を生成することが可能です



  • 次に、必要な箇所のみ濃い状態にして大量のポイントを散布します。この例のように静止画やカメラがほとんど動かない場合は、カメラに近いほどポイント数が多くなるようにします



  • そしてTriangulate2Dノードによって面を張り、Attribute from Mapノードで先ほどのテクスチャを読み込めば準備は完了です。その後はHeightの値によって高さを変化させたり、マスク情報を使用して編集を加えていくことで、計算時間も非常に軽く自然なLODを実現することが可能です

2.さらなるディテールの追加


最後にさらなるディテールを加えていきます。前述の通り、二次元平面から高さ方向にのみ変位させて形状をつくるというHeightFieldの性質上、今回のように垂直にそびえる絶壁や崖のような箇所に対してそのままディテールをつけたり、トンネルなどの複雑な形状をつくったりすることは難しいため、ポリゴンに変換をしてから手を加えることになります。Mountainノードは従来に比べてはるかに細かい制御ができるようになっています。上記のHeightFieldNoiseノードと同様にUnified Noise Static VOPを使用していますが、大きなちがいとしてHeightFieldではY軸方向にしか変位しなかったことに対して、ポリゴンに変換した後のMountainノードでは法線方向に変位するため絶壁や崖に対しても効果的にはたらきます



  • 最後に、草木や細かい小石などを従来のSOPで自由に制作し、配置をしていきます。前もってHeightField by Featureノードなどを利用してマスクを定義しておけば草木の生える領域や小石の転がる領域が定義できるため、そこにScatterノードなどでポイントを散布してコピーをすればプロシージャルに自然な位置に配置することが可能です



  • 数千や数万といった単位で大量に複製したい場合でも、Instanceノードを使用して複数パターン用意したディスク上のキャッシュデータを遅延ロードで直接読み込むようにすれば、メモリ効率が非常に良くレンダリング時にかかる負担を大幅に削減することが可能です

Houdiniによる地形のモデリングを終えて

Houdiniの地形ツールのおかげで、最初からポリゴンで1つずつ頂点を移動してモデリングをすることが考えられないくらい効率的で快適なモデリングをすることができました。とはいえ、実際には極めて複雑で入り組んでいる広大な地形を1つの機能やノイズで表現をすることは難しいため、ここに記述したような手順の通り、その中でも手間をかけて情報量を増やすことで単調さを軽減して説得力をもたせることが重要です。



  • 月刊CGWORLD + digital video vol.227(2017年7月号)
    第1特集:アイドルCGキャラクター研究
    第2特集:プログレッシブ・エンバイロンメント

    定価:1,512円(税込)
    判型:A4ワイド
    総ページ数:144
    発売日:2017年6月9日
    ASIN:B071466CXS