Procedural Terrain

地面のプロシージャル作成

ビュート、メサや峡谷のある地形を OpenVDB を元にしたボリューム形状を元にプロシージャルに作成する方法を紹介。

使用バージョン: Houdini FX 13.0.580

シーンファイルへのリンクは一番下にあり。

シーン概要

  1. Houdiniを起動。シーンファイルを開く。
    • 開いた直後のビューポートはこのような状態。

      ポリゴンでおおまかにどこにビュートが出来るかを示している。
    • ネットワークは以下のような状態。

      ビューポートに表示されているノードは、右側にある円で囲まれた Visualize_Buttes というノード。

このシーンファイルのネットワークはおおまかに以下のように分けることができる。

  1. 元の地面の定義: ネットワーク上部分岐点まで (上図赤)
  2. ビュート作成部分: 分岐後右側のネットワーク (緑)
  3. 地面のボリュームデータ作成: 分岐後、ネットワーク中央部分のノード4つ (青)
  4. 峡谷となる部分を削るための形状: 左側の独立したネットワーク (水色)
  5. 上記をまとめたネットワークと最終塑性 (紫)
これらは、それぞれポリゴンで大まかに作られた形状から、OpenVDB ボリュームデータに変換、ボリュームデータ同士の演算によって最終形状が作られている。この方法を取ることにより編集中は細かいトポロジの差異を心配する必要がない。

元となる地面

制作過程を見ていくには一番上流のノードから見ていくのが良い。

  1. ネットワークの一番上に位置する grid1 を選択し、ディスプレイフラグをオンにする (右側の帯を水色にする)。
    • これにより、ビューポートには、大元の形状であるgrid1が表示された。

      黄色く縁取りされたノードが現在選択されているノード。表示ノード(右側水色)と選択ノード(黄枠)は別に設定することが可能。
  2. 次にgrid1 から一つ下流の pointjitter2 ノードにディスプレイフラグを設定する。
    • Scale の値によって各頂点が移動しているのが確認できる。
  3. さらに一つ下流の triangulate2d1 ノードにディスプレイフラグを設定する。
    • このノードで全体が三角形で再分割化されていることが確認可能。

      同じ要領でどのノードでもそれぞれの効果を見ていくことが可能。
  4. この一つ下流のattribcreate1 ノードを選択する。
    • ここででは各頂点に対し、road という名のアトリビュートを定義(Name=road)している。これは、Class=Point (頂点単位)、Type=Float (浮動小数点データタイプ)、デフォルトおよび初期値が0になっている。

      この値を編集することで、地形に影響できる部分とできない部分をコントロール可能。
  5. Paint_Paths ノードを選択ノード(黄枠)に、vopsop1 ノードに表示フラグ(水色)を設定し、ビューポート内でEnterキーを押すか、UI左側のツールバーから Show Handle ツールを選択。
    • こうすることでビューポート上にブラシツールが表示され、地面形状にペイントすることが可能。

      ここでは、Paint_Paths ノードにより Paintされた部分の road アトリビュートの値を 0 から 1 に変更している。その結果、ペインされた部分は vopsop1 ノード (ノイズを加え地面を隆起させている)の効果を受けなくなり、平らになる。

ビュートの作成

上のネットワーク図で緑で表示された部分を見ていく。

  1. vopsop1 ノードから右下に分かれているVisualize_Peaksノードを表示してみる。
    • このノードはビュートとして隆起する部分を表示している。
  2. 次に Visualize_Buttes ノードを表示してみる。
    • こちらは隆起する度合いをポリゴンで示したもの。最終的には OpenVDB を使った複雑な塑性が行われる。
  3. 緑で表示されたネットワークを group1 から foreach1 まで一つずつたどっていく。
    • 簡単に説明すると、この部分のネットワークの各ノードで起きていることは以下の通り。
      1. group1: Visualize_Peaksノードで表示された頂点ベースのグループを面単位のグループに変換
      2. delete1: ビュートに関係の無い面を削除
      3. connectivity1: 面の接合性を元にして class という名のアトリビュート(この名前はデフォルト)を作成、つながった面をそれぞれグループとする
      4. attribtransfer1: 上記で定義されたアトリビュート情報をを元形状に戻す
      5. RemoveGround: 地面部分面を分離
      6. foreach1: 分離面グループを元にボリュームデータによるビュートの作成
    • データの流れがわからない場合は、Details Viewを使ってみると良い。

      上の図は、attribtransfer1ノードを選択し、面(Primitives、赤枠で表示)単位の情報を表示したところ。各面が class という connectivity1 ノードで定義したアトリビュートを元にグループに分けられていることがわかる。
      必要な情報を見るには、ノードによって、Points (頂点)、Vertices (面単位頂点)、Primitives (面)に切り替える必要がある。
  4. foreach1 に表示フラグを設定。
    • ここで作られたボリューム形状は次の通り。

      foreach 内で行われていることを説明するには、このページ全体と同じ量を書かなければならないので今回は割愛。

地面のボリューム化

上のネットワーク図で青で表示された部分を見ていく。

  1. vopsop1 ノードから左に枝分かれした subdivide2、vopsop2, polyextrude4, xform3, vdbfrompolygons1 と順々に見ていく。
  2. subdivide2: vopsop1 の形状をさらに細かく再分割している
  3. vopsop2: subdivide2 にノイズを加えてディテールを追加。この際にペイントして定義した road アトリビュートの値が考慮されペイントした部分には変形が行われない
  4. polyextrude4 および xform3: vopsop2 の結果に -Y 方向にExtrudeを行い厚みを加えている (polyextrude4)。さらに xform3 でピボットの位置を調整。
  5. vdbfrompolygons1: xform3 の結果を OpenVDBフォーマットに変換。
  6. vdbcombine1: 先に作ったビュート地面を合成 (Operation = SDF Uniton) した結果。

峡谷となる元形状の作成

最初のネットワーク図で水色で表示された部分を見ていく。ここでは、

  1. CanyonCurve: 峡谷となる部分の元となる粗いカーブ
  2. resample1: CanyonCurveのをリサンプルしポイント数を増加
  3. smooth1 および edit1: プロフィールカーブを編集
  4. sweep1: 二つのカーブを元にSweep を実行
  5. skin1, delete2, delete3, merge1, fuse1, remesh2: 基本的にここで行っていることは外側の面の再構成。skin1 が側面で delete2 と delete3 が両側のキャップとなっている。これら 3つを merge1 で結合、 fuse1 で重複する頂点を結合、remesh2 でポリゴン再メッシュ化している。
  6. mountain1: remesh2 のに対してノイズによって細かい凹凸を追加

  7. vdbfrompolygons2: mountain1の結果をボリュームに変換
  8. vdbcombine2: ビュートと地面の結合結果とこの峡谷をさらに結合 (Operation=SDF Difference)

    この一つ下流のswitch1 では峡谷の有無を選択可能(0:あり、1:なし)

最終塑性

最初のネットワーク図で紫色で表示された部分を見ていく。

  1. convertvdb1: ここまでボリュームで塑性されてきた形状をポリゴンに変換(Convert To=Polygons)
  2. fuse2: 重複する頂点を結合。この結果が以下の画像。
  3. CreateShadingAttributes: ビュートと峡谷を含めた全体の形状から最大標高と最低標高を求めてシェーディングアトリビュートとして渡している。
  4. polysoup1: ここまでで出来たポリゴン形状をレンダリングにより最適なpolygonsoup に変換している。Polygon Soup は単一の大きな形状をより効率よく処理しMantra でレンダリングするのに最適。ここでは、CreateShadingAttributesで60.45MBあったデータサイズを15.36MB に圧縮している。レンダリング結果はこちら。

おまけ

このポリゴン形状をMayaなど他のソフトウェアで使うために.objなどで出力するには以下の手順が必要(この部分は下記シーンファイルには含まれておらず)。
  1. fuse2を選択。この出力から枝分れする形で TAB->clean ノードを作成。
  2. 作成された clean1 で Consolidate Points をオン。
  3. この clean1 の上で、RMB (右マウスボタン) -> Save Geometry... を実行。ディレクトリ先を指定し、ファイルを .obj で保存すれば、Mayaなどで読み込むことが出来る形状ファイルが出来る。
  4. もし簡単なUVを付けたいのであれば、clean1の出力から UV Texture (Texture Type = Orthographic, Projection Axis=Y Axis)とすると。上から貼り付けただけのUVを作成可能。
  5. UVQuickShadeノードを追加することでUVの様子を確認可能。
    • この部分は下記シーンファイルには含まれておらず

シーンファイル:

0 件のコメント:

コメントを投稿