>   >  Houdini&Arnoldで描く大規模なフル3D自然景観、個人創作『Island』by 木川裕太(Spade&Co.)
Houdini&Arnoldで描く大規模なフル3D自然景観、個人創作『Island』by 木川裕太(Spade&Co.)

Houdini&Arnoldで描く大規模なフル3D自然景観、個人創作『Island』by 木川裕太(Spade&Co.)

<3>外部ツールSpeedTreeとHyperGrassで効率的に樹木と草木を作成

植物アセットはコピペ感とポリゴン数に注意

今回、植物のアセットの作成にはIDV社のSpeedTreeを使用して、メインとなるヤシの木と低木、その他5種類ほどを用意しました。それぞれ樹木ごとに3~4パターン、ヤシの木は7パターンのバリエーションを用意しています。樹木の種類やバリエーション数は作成する地形やカメラアングルによって変わるので一概には言えませんが、今回のような場合はこのくらいあれば十分かと思います。

樹木を作成するポイントとして、大量に複製して使う都合上、特徴的な形はコピペ感がバレる原因となるのでなるべく避けるようにします。ただし、特徴的な形を省きすぎると画面が単調になってしまうので、要所で特徴的な形の木を入れ込むことも必要です。また、樹木のポリゴン数は多くなりがちです。レンダリングの負荷を下げるため、なるべく見えない部分のポリゴンは削るなど最適化を行いましょう。今回はだいたい1本5~50万ポリゴン内に調整しています。

SpeedTreeで樹木をモデリング

樹木はSpeedTree Libraryにあるモデルをベースに作成していきます。Libraryモデルはポリゴン数が多いので、TwigsやWeldingなどの引きで見えなくなるようなジオメトリは非表示にしておき、Segmentも必要最低限に落としておきます

▲SpeedTreeの作業画面

▲引きで見えなくなる枝を非表示にした状態

▲片側に偏って いるような特徴的な樹木(右)はインスタンスで複数配置した際に目立ちやすいのでなるべく避けます

▲アクセントとして用意した、少し折れ曲がったような特徴的なヤシの木。コピペ感が目立たない程度にポイントで配置しておくとリアリティが増します

▲今回作成した樹木27本

樹木のルックデヴで広範囲にわたる色ムラを発生させる

樹木のマテリアルはジオメトリと同一階層内にmatnetを作成し、その中で作業します。そうしておくことで、大元のジオメトリノードをコピーすれば他プロジェクトでもアセットをすぐに流用することができるので便利です

▲Geometryと同じ階層にmatnetを作成

▲matnet内のマテリアルネットワークの一部。Color Jitterを使って樹木ごとに多少色味が変わるようにしています。さらにスキャタリングの工程で作成するカラーノイズアトリビュートをbasecolorとミックスさせることで、Color Jitterだけでは表現できないような複雑な色のバリエーションを作成しています

▲ColorJitterとカラーノイズアトリビュートをミックスさせたサンプル。オブジェクト固有の色味の差(Color Jitter)を出しつつ、さらに広い範囲での色ムラを表現しています。大量のインスタンスを配置する樹木は色のバリエーションがあるかないかで画の中の情報量が変わってくるので、こういった色のランダム化はとても重要です

▲草はVertex Library社のHyperGrassのモデルを加工。サークル上にパッチ化された草モデルを密度と大きさちがいで6種類用意しています。草は樹木に比べインスタンス数が多くなるので、今回のようなロングショットの場合はパッチ化した状態にしてインスタンス数を減らすのが効率的です

<4>最終的なリアリティを大きく左右する植物アセットのスキャタリング

現実のエコシステムを参考にインスタンスを配置

今作で一番の肝になるのが、植物アセットを地形に対してスキャタリング(インスタンスで配置)する工程です。現実世界に存在する植物は何らかの要因に基づいて生え、成長しているため、一定の分布ルールが存在します。CGでスキャタリングする際も、このルール=エコシステムをどれだけ意識できるかが最終的なリアリティに大きく関わってきます。そのため、植物の分布がわかるようなリファレンスをたくさん集めてよく観察することが大切です。

今回の作例では、「ヤシの木は砂浜沿いに多く生え、中間から高所にかけては生えていない」、「その他の樹木は中間までは生い茂っており、高所にかけて徐々に減っていく」、「低木は低所から高所まで広く分布する」、「特定の樹木は一定箇所にまとまって生えている」という4つの分布ルールを意識して作業しました。

こうしたルールに従ってスキャタリングをコントロールするのは根気のいる作業です。ですが、適当にランダム配置したものと、エコシステムを意識して配置したものとではクオリティに大きな差が生まれるので、妥協せず丁寧に作業します。

具体的な作業手順を解説します。まずはノード構成として、【スキャタリングする際のノード構成】の画像のように3つのジオメトリを作成します。緑がマテリアル設定などの作業用ジオメトリ、青がインスタンスのソースジオメトリ、赤がInstance Object(実際にレンダリングされるオブジェクト)です。Arnold for Houdini(HtoA)では配置先のポイントアトリビュートをシェーダ側で読み込むにはInstance Objectを使用する必要があります。作業用ジオメトリではオブジェクトの読み込み、マテリアルの作成・アサインを行い、SpeedTreeでつくられる不要なグループやアトリビュートの事前削除も行います。

スキャタリング用のポイントはInstance Object内でつくります。まずは地形メッシュに対してAttribute VOPを接続し、densityアトリビュートを作成。リファレンスを観察しながら植物ごとの分布ルールに基づいたdensityアトリビュートを作成していきます。植物はパッチ感(かたまって生えている感じ)を意識してdensityを設定すると、リアルな分布になりやすいです。また、前ページの樹木ルックデヴで使用した、樹木の色味にバリエーションを出すためのカラーノイズアトリビュートをここで作成します。

作成したdensityアトリビュートを基にScatter SOPでポイントを発生させます。また、pscale、回転、instanceアトリビュートについてVEXpressionを記述し、各樹木のサイズや向きにバリエーションが出るように設定します。

なお、自作HDA(Houdini Digital Asset)でインスタンスの最適化も行なっています。

群生感を意識してdensityアトリビュートを作成

▲スキャタリングする際のノード構成。緑が作業用、青がインスタンスのソース、赤がInstance Object

▲作業用ジオメトリの中

▲Instance Object内で、地形メッシュに対しAttribute VOPを使いdensityアトリビュートを作

▲VOPのノード構成。Anti-Aliased NoiseやVoronoi Noiseを組み合わせてノイズを作成し、岩盤部分や海沿いには配置されないようPositionやNormal情報を使ってマスク。また、HeightField Erodeの工程で生成したsedimentやdebrisなどの堆積部分のアトリビュートでマスクすることで、さらに複雑な分布を作成できます



  • ▲パッチ感を意識したdensityアトリビュート



  • ▲densityに応じて樹木草木のインスタンスを配置した状態



  • ▲樹木の色ムラを表現するためのカラーノイズ



  • ▲Scatter SOPによる低木のScatterポイント

▲樹木AのScatterポイント

▲pscaleで大きさのバリエーションを設定。リニアな分布にならないように、powで小さい木が多くなるよう分布を調整し、densityも組み合わせて、密度が薄い部分ほど小さくなるようにしています

▲ランダムな回転を加えます。樹木は真上に向かって配置し、低木や草などは地形の法線に沿って配置されるようにします

▲instanceでインスタンスソースを指定します

自作のHDAでフラスタム外とカメラのオクルージョン箇所のポイントを削除

自然景観の場合、数百万~数千万のインスタンスを配置することになるため、カメラから見えない部分にはインスタンスが配置されないよう最適化することがオペレーション、レンダリングの観点から非常に重要となります。筆者は、複数フレームにわたって確実に見えない箇所(フラスタム外、カメラからのオクルージョン箇所)のポイントやプリミティブを削除する自前のHDAで最適化しています

▲HDAによるインスタンスの最適化結果

▲pscaleや回転、instanceの設定などは何度も行うことなので、作業効率を上げるためにもこれらの処理はHDA化することをオススメします

次ページ:
<5>特徴的な山のシルエットを強調する逆光気味のライティングで画づくり

特集