侵食の表現
従来のモデリングでは難しく、新機能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つの機能やノイズで表現をすることは難しいため、ここに記述したような手順の通り、その中でも手間をかけて情報量を増やすことで単調さを軽減して説得力をもたせることが重要です。