筆者環境
・Bifrost2.5.0.0
・Maya2020.2
これまでのブログで紹介した基本機能をおさらいしながら、メッシュのランダム散布ツールを作ってみましょう。工程ごとに過去のブログへのリンクを貼っていますので、躓いたら確認しながら進めてください。
まず今回目標とするツールの要件は以下の3点にします。
- 地面に草を敷き詰める
- バーテックスカラーを塗ったエリアに花を咲かせる
- カーブに沿って小屋へ続く轍を作る
プロシージャルモデリングでは使い古された題材ではありますが、入門編には最適な教材だと思います。動画で使用しているモデルデータはこちらの11_model_fbx.zipでダウンロードできます。
内容物:
- 地面 (バーテックスカラーマップを設定済み)
- 小屋
- 草(2種)
- 花(2種)
- 石(2種)
今回作成するノードグラフは記事の末尾でダウンロードできますが、グラフ内で設定しているバーテックスカラーの名前や散布するメッシュタイプは上記のモデルデータに準じています。ご自身でモデルデータを準備される際は適宜設定を変更してください。
(当ブログで[]で括っているものはBifrostGraphEditor内のノード名です)
1.地面に草を敷き詰める
「座標をランダムで生成するノード」「メッシュの複製(インスタンス)を生成するノード」が標準で実装されていますので、それらを組み合わせてメッシュを散布するグラフを組んでいきましょう。
.1
グラフを新規作成し、モデルデータセット内の地面メッシュをドラッグ&ドロップで入力します。
→ #00 新規グラフ
→ #01 input
.2
[scatter_points]を取得し、地面メッシュを接続します。
→ #02 ノードの取得
→ #02 ノードの接続
Scatter
[scatter_points]は入力したジオメトリの表面上にランダムでPoints(座標)データを作成するノードです。
ある程度均一な散布にしたい場合は scatter_mode の設定を BlueNoiseにすることをお勧めします。
散布数はamountで設定できます。(厳密にはこの数はPointsの算出を試みる回数です。条件に沿わずに省かれるデータもあるため、この数が出力数と一致するとは限りません)
.3
Pointsデータをデバッグ表示で確認してみましょう。
[point_scope]と[terminal]を取得します。[point_scope]にPointsデータを渡し、次に[terminal]のdiagnosticポートに接続してください。
地面メッシュの表面に黄緑色の円で描画されたのが[scatter_points]で生成したPointsデータです。
→ #03 terminal
Scope
ノード名に”scope”と付くものはデータをビジュアライズするためのノードです。
#07 空間検索では[location_scope]でGeoLocationデータをデバッグ表示していましたね。
.4
[create_instance]を取得し、Pointsデータを接続します。
Instance
[create_instance]はpointsの座標にジオメトリをインスタンスで配置するノードです。
配置するジオメトリはinstance_geometreisに入力したものが対象となりますが、入力が複数の場合はポイントごとにランダム選択となります。
インスタンスで配置する草メッシュをグラフに入力しましょう。地面メッシュと同くドラッグ&ドロップによる入力でもいいですが今回はワイルドカードによる入力を設定してみます。
[input]を取得し、pathプロパティーに /source/grass/*/* と入力します。これでMayaシーン上の階層 |source|grass| 以下の全てのジオメトリが入力されます。
→ #01 input – パスで入力
.5
[create_instance]の出力を[terminal]のproxyに接続してビューポート上に描画します。
これで地面を2種類の草メッシュで埋め尽くすことが出来ました。
2.バーテックスカラーを塗ったエリアに花を咲かせる
花も草と同様に[scatter_points]で生成したPointsに配置していきますが、[create_instance]のマスク機能を利用して配置エリアをコントロールしてみましょう。
今回は要件に従い地面メッシュのバーテックスカラーをマスクとして使用します。
.1
[create_instance]と[input]を取得し、まずは草と同様の手順で地面メッシュ一面を花畑にします。
.2
地面メッシュには予めバーテックスカラーマップを適用していますのでウォッチポイントで確認しましょう。
→ #02 ウォッチポイント
Maya側で設定しているバーテックスカラーマップの名前は”FlowerMask”、チャンネルはAのみです。
Bifrost側ではウォッチポイントにプロパティー名=”FlowerMask”、データタイプ=array<float>があるのが確認できるはずです。
→ #03 Meshプロパティー
.3
[sample_property]を取得し、地面メッシュと[scatter_points]のgeo_locationsを接続します。
これによってscatterで生成したPointsの場所(ロケーション)における様々なプロパティー(ポジションや法線、UVなど)のサンプリングが可能になります。
今回は上記のバーテックスカラーの値をサンプリングしたいので[sample_property]のプロパティーはproperty=FlowerMask、default=floatにします。
→ #08 GeoLocation
.4
[sample_property]で取得した値を[create_instance]のmask_weightsに接続します。
これで特定のエリアに花を咲かせることができました。
グラフは常に入力データの更新を監視していますので、バーテックスカラーの塗りを変更すれば即座に花畑の形状が変わっていきますよ。
ここまでのグラフのテキストデータは11.zipのsample1.txtです。(メッシュの入力は各自で設定してください)
ブログ最後となる次回「メッシュ散布ツールを作ってみよう【後半】」ではツールの要件3を実装しつつ、細かな味付けをしていこうと思います。
高島 正規
テクニカルアーティスト
長年シネマティックアーティストとしてフェイスリグやフェイシャルモーションの制作を担当。現在は技術戦略グループに所属し、DCCツールのプラグイン開発のための内製C++ライブラリの構築と、Bifrostを用いたツール開発を行っている。