Houdiniで簡単な芝生を作成する方法をご紹介します。
ポイント
- カーブをベンド
- Sweepに使用するプロファイルをRampで編集できるようにする
- Scatterで作成したポイントをカーブに変更し、カーブのNormalとTangentを配置時の回転に使用する
- リサンプリングしたカーブを地形にしっかり接地する
- テクスチャカラーを頂点カラーとして使用する
完成データはこちらからダウンロード
※ボーンデジタルHoudiniユーザ向けパスワードが必要です。
まずは、芝生1本を作成します。
Lineを作成し、Resampleでサンプルを調整します。
次は、ポイント1のカーブを曲げるです。
Attribute Wrangleを使用してカーブを曲げます。
これは依然説明した「Wrangleで渦巻を作る」を参考にしてください。
芝生のバックボーンができたら、ポイント2「Sweepに使用するプロファイルをRampで編集できるようにする」を行います。
これは、PointVopを使用します。
ポイントの位置を取得し、Floatに分解、それをRamp parameterに接続するだけです。
このRampの値をSweepで参照するため、パラメータ名をつけておきましょう。
プロファイルとして指定するノードは、最終的に板ポリにするならLineでいいですし、コーン上にしたい場合はCircleにします。
この結果をSweepにつなぎます。
SweepのTransform Using Attributesをオフにして、Scaleにエクスプレッションを設定します。
上で作成したRampを参照したいのでchrampを使用します。
chramp("参照するパラメーター",評価するランプの位置,time)
例 chramp("../vopsop_scale_ramp/profileScale_ramp",$PT/($NPT - 1), 0)
これでPointVopで作成したRampを元に芝生1本の形状がきまります。
Normalを追加し、法線を追加します。
次はこの1本の芝生を適当な束にします。これが最小単位の芝生の束になる、この1束を最後にコピーしていきます。
小さなGridを作成しScatterでポイントを生成します。
ここからカーブを作成するため、Addを追加します。
AddのオプションでPolygonsタブを選択し、By Groupに設定します。
AddはAll Pointsにしてすべてのポイントをポリゴンカーブでつなぎます。
カーブにいったんするのは、今回はカーブのTangentを使用したいからです。
ポイントをつなぐカーブになります。
Addでカーブを作成した後に、Attribute Wrangleを使用しノーマル方向を定義します。
これでカーブのノーマルが作成されます。
最初にノーマルをワールドアップに定義しておくことで、Polyframeを追加した際にノーマル方向が自動で反転方向に作成されてしまうことを防ぎます。
作成されたカーブに、polyframeをつなぎ
Normal Nameをupに設定し、Tangent NameをNにします。
これでカーブのTangentがNormalとして使用でき、かつUp Vectorも定義することができました。
Copy to Pointを使用し、カーブの位置とNormalを使用して芝生を複製します。
カーブのTangentを使用して方向を決めているため、適度なバラバラな方向に芝生を向けることができます。
これで芝生一束が作成されます。
次に芝生をはやす地面にを設定します。
単純にジオメトリにMountainで凹凸をつけ、UV Projectで上からUVを投影しました。
Scatterでサンプルポイントを作成し、先ほど同様Addでカーブを作ります。
次に作成したカーブをResampleします。Scatter自体でポイントを増やすこともできますが、地形に沿って滑らかに配置されるようにカーブポイントを増やす方法を今回はしようします。
Resampleされたポイントは、地形ジオメトリに接地していません。ここがポイント4です。
ResampleしたものをTransformでY方向に2移動し、すべてのポイントがいったん地面より上にくるようにします。
Rayノードを使用し、地形ジオメトリ上にポイントを投影します。
Rayノードのオプションとしてを設定します。
- Y方向のみに投影します。
これで全てのポイントが地形ジオメトリに接地します。
次にポイント5「テクスチャカラーを頂点カラーとして使用する」です。
Attribute from Mapを使用します。
Textureとして近くの広場で撮影した芝生のテクスチャを使用しました。
Texture Mapでこの画像を指定し、uvを参照手、Cd(頂点カラー)として出力します。
これでジオメトリに頂点カラーを適用することができました。
これをAttribute Transferを使用し、リサンプリングして地面に設置したカーブポイントに頂点カラーをTransferします。
先に紹介した手順で、Attribute WrangleでNormalを+Y方向に定義、その後、Polyframeを追加します。
この結果をcopytopointsに接続します。
CopytopointのオプションにてPack and Instanceを有効にし、データをPacked Primitivesとしてコピーします。
Packed Primitives(パックプリミティブ)は、 レンダリング時 にジオメトリを生成するプロシージャです。 この目的は、複製を減らして必要な時にだけ情報を読み込むことで、Houdiniでのインタラクティブ操作時のメモリ使用量を減らすことです。
Packed Primitivesとしてコピーしない場合、Scatterにてポイントを変更するたびに多くの計算時間が必要となります。しかし、Packed Primitivesとしてコピーしておくと、Scatterの値を何千と増やしていっても芝生束を迅速に複製配置した結果を確認することができます。
カーブのリサンプルを増やしても、迅速にその結果を確認することができます。
次にPacked PrimitivesとしてコピーされたものをUnpackします。
Unpackする前のジオメトリのノーマルはカーブのNormalを引き継いでいます。
このまま、ゲームエンジンにもっていくと正しく評価されず、ジオメトリを描画することができません。
また、MayaなどのDCCツールにもっていった場合はそちらで法線を再定義しなければいけません。
パックプリミティブは編集不可です。ノーマルを元に戻すためにUnpackする必要があります。
Copyの後に、Unpackノードをつなぎます。
Unpackノードのオプションにて、Transfer AttributeにCdを追加し、頂点カラーをUnpack後も引き継ぐように設定します。
Unpack後のデータをみると法線が修正され
頂点カラーも引き継げていることがわかります。
これで完成です。
ゲームエンジンに読み込んでみるために板ポリゴンに変更し、分割数なども変更します。
File>Export>Filmbox FBXを選択し、FBXとして出力します。
出力したFBXをUnrealにロードし、頂点カラーを表示できるようにするとしっかり適用されていることがわかります。
次回はこれをHDAにしてみましょう。