地面のプロシージャル作成
ビュート、メサや峡谷のある地形を OpenVDB を元にしたボリューム形状を元にプロシージャルに作成する方法を紹介。
使用バージョン: Houdini FX 13.0.580
シーンファイルへのリンクは一番下にあり。
シーン概要
- Houdiniを起動。シーンファイルを開く。
このシーンファイルのネットワークはおおまかに以下のように分けることができる。
- 元の地面の定義: ネットワーク上部分岐点まで (上図赤)
- ビュート作成部分: 分岐後右側のネットワーク (緑)
- 地面のボリュームデータ作成: 分岐後、ネットワーク中央部分のノード4つ (青)
- 峡谷となる部分を削るための形状: 左側の独立したネットワーク (水色)
- 上記をまとめたネットワークと最終塑性 (紫)
元となる地面
制作過程を見ていくには一番上流のノードから見ていくのが良い。
- ネットワークの一番上に位置する grid1 を選択し、ディスプレイフラグをオンにする (右側の帯を水色にする)。
- 次にgrid1 から一つ下流の pointjitter2 ノードにディスプレイフラグを設定する。
- さらに一つ下流の triangulate2d1 ノードにディスプレイフラグを設定する。
- この一つ下流のattribcreate1 ノードを選択する。
- Paint_Paths ノードを選択ノード(黄枠)に、vopsop1 ノードに表示フラグ(水色)を設定し、ビューポート内でEnterキーを押すか、UI左側のツールバーから Show Handle ツールを選択。
ビュートの作成
上のネットワーク図で緑で表示された部分を見ていく。
- vopsop1 ノードから右下に分かれているVisualize_Peaksノードを表示してみる。
- 次に Visualize_Buttes ノードを表示してみる。
- 緑で表示されたネットワークを group1 から foreach1 まで一つずつたどっていく。
- 簡単に説明すると、この部分のネットワークの各ノードで起きていることは以下の通り。
- group1: Visualize_Peaksノードで表示された頂点ベースのグループを面単位のグループに変換
- delete1: ビュートに関係の無い面を削除
- connectivity1: 面の接合性を元にして class という名のアトリビュート(この名前はデフォルト)を作成、つながった面をそれぞれグループとする
- attribtransfer1: 上記で定義されたアトリビュート情報をを元形状に戻す
- RemoveGround: 地面部分面を分離
- foreach1: 分離面グループを元にボリュームデータによるビュートの作成
- データの流れがわからない場合は、Details Viewを使ってみると良い。
上の図は、attribtransfer1ノードを選択し、面(Primitives、赤枠で表示)単位の情報を表示したところ。各面が class という connectivity1 ノードで定義したアトリビュートを元にグループに分けられていることがわかる。
必要な情報を見るには、ノードによって、Points (頂点)、Vertices (面単位頂点)、Primitives (面)に切り替える必要がある。
- 簡単に説明すると、この部分のネットワークの各ノードで起きていることは以下の通り。
- foreach1 に表示フラグを設定。
地面のボリューム化
上のネットワーク図で青で表示された部分を見ていく。
- vopsop1 ノードから左に枝分かれした subdivide2、vopsop2, polyextrude4, xform3, vdbfrompolygons1 と順々に見ていく。
- subdivide2: vopsop1 の形状をさらに細かく再分割している
- vopsop2: subdivide2 にノイズを加えてディテールを追加。この際にペイントして定義した road アトリビュートの値が考慮されペイントした部分には変形が行われない
- polyextrude4 および xform3: vopsop2 の結果に -Y 方向にExtrudeを行い厚みを加えている (polyextrude4)。さらに xform3 でピボットの位置を調整。
- vdbfrompolygons1: xform3 の結果を OpenVDBフォーマットに変換。
- vdbcombine1: 先に作ったビュート地面を合成 (Operation = SDF Uniton) した結果。
峡谷となる元形状の作成
最初のネットワーク図で水色で表示された部分を見ていく。ここでは、
- CanyonCurve: 峡谷となる部分の元となる粗いカーブ
- resample1: CanyonCurveのをリサンプルしポイント数を増加
- smooth1 および edit1: プロフィールカーブを編集
- sweep1: 二つのカーブを元にSweep を実行
- skin1, delete2, delete3, merge1, fuse1, remesh2: 基本的にここで行っていることは外側の面の再構成。skin1 が側面で delete2 と delete3 が両側のキャップとなっている。これら 3つを merge1 で結合、 fuse1 で重複する頂点を結合、remesh2 でポリゴン再メッシュ化している。
- mountain1: remesh2 のに対してノイズによって細かい凹凸を追加
- vdbfrompolygons2: mountain1の結果をボリュームに変換
- vdbcombine2: ビュートと地面の結合結果とこの峡谷をさらに結合 (Operation=SDF Difference)
この一つ下流のswitch1 では峡谷の有無を選択可能(0:あり、1:なし)
最終塑性
最初のネットワーク図で紫色で表示された部分を見ていく。
- convertvdb1: ここまでボリュームで塑性されてきた形状をポリゴンに変換(Convert To=Polygons)
- fuse2: 重複する頂点を結合。この結果が以下の画像。
- CreateShadingAttributes: ビュートと峡谷を含めた全体の形状から最大標高と最低標高を求めてシェーディングアトリビュートとして渡している。
- polysoup1: ここまでで出来たポリゴン形状をレンダリングにより最適なpolygonsoup に変換している。Polygon Soup は単一の大きな形状をより効率よく処理しMantra でレンダリングするのに最適。ここでは、CreateShadingAttributesで60.45MBあったデータサイズを15.36MB に圧縮している。レンダリング結果はこちら。
おまけ
このポリゴン形状をMayaなど他のソフトウェアで使うために.objなどで出力するには以下の手順が必要(この部分は下記シーンファイルには含まれておらず)。- fuse2を選択。この出力から枝分れする形で TAB->clean ノードを作成。
- 作成された clean1 で Consolidate Points をオン。
- この clean1 の上で、RMB (右マウスボタン) -> Save Geometry... を実行。ディレクトリ先を指定し、ファイルを .obj で保存すれば、Mayaなどで読み込むことが出来る形状ファイルが出来る。
- もし簡単なUVを付けたいのであれば、clean1の出力から UV Texture (Texture Type = Orthographic, Projection Axis=Y Axis)とすると。上から貼り付けただけのUVを作成可能。
- UVQuickShadeノードを追加することでUVの様子を確認可能。
- この部分は下記シーンファイルには含まれておらず
シーンファイル:
- LandscapeEngine.hip (128KB)
0 件のコメント:
コメントを投稿