筆者環境
・Bifrost2.5.0.0
・Maya2020.2
前半で作ったのはメッシュを敷き詰めるだけの単純なものでした。
後半では要件3の実装を行い、更により自然な仕上がりとなるよう細部の機能追加をしていきます。
3.カーブで小道を作る
この要件は道の形になるように草の配置を制限すれば実現できそうですね。
要件2の花の散布と同様にバーテックスカラーによるマスキングでも良いのですが、より直感的に操作できるようにカーブを用いてマスクを生成しようと思います。
具体的にはカーブから一定距離内にあるPointsを見つけ出してマスキングするという実装になります。
.1
モデルデータパック内のカーブデータをグラフに入力します。
[terminal]に接続してデバッグ表示してみましょう。
もしカーブ形状を再現するための頂点数が不足してカクカクしていたらStrandsデータへのコンバートオプションを調整してみてください。
→ #01 input – Curve
→ #03 データタイプ – terminal
.2
[get_closest_locations]を取得し、Strandsデータを接続します。
検索スタート位置は[scatter_points]のpositionsを使用します。これによってPointsからカーブ(Strands)への最も近い場所の検索が実行されます。
→ #07 空間検索 – closest
またuse_cutoff_distanceをONにしてcutoff_distanceを設定することで、検索の最大距離を指定することができます(OFFの場合は無限距離になります)。
.3
[get_closest_locations]の結果をデバッグ表示してみましょう
[location_scope]を取得し、Strandsデータと検索スタート位置、そしてGeoLocationデータを接続します。
そして[terminal]のdiagnosticに接続しビューポートに表示します。
指定した距離内でStrandsへの最も近い場所が見つかったPointsからはStrandsへ向かう矢印が描かれます。
→ #07 空間検索 – GeoLocationをデバッグ表示する
.4
[get_closest_locations]からは最も近い場所が見つかったかどうかのbool値の出力もあるので、今回はこの判定結果を元にしてマスク値を構築します。
[if]を取得し、[get_closest_locations]のfoundの値を接続します。
true_case=0.0、false_case=1.0とすることで、検索に成功したものには0.0、見つからなかったものには1.0の値をセットした配列データが生成されます。
→ #05 オートループ
このデータを草をインスタンス配置している[create_instance]のmask_weightsに接続します。
.5
花のインスタンス配置にも同様のマスクを適用する必要があります。
工程4の[if]を複製し、false_caseには[sample_property]で取得したバーテックスカラーの値を接続します。その結果を花をインスタンス配置している[create_instance]のmask_weightsに接続します。
これでカーブ周辺を小道にすることが出来ました。
ここまでのグラフのテキストは12.zipのsample1.txtです(メッシュの入力は各自で行ってください)。
機能追加
このままでは無機質な仕上がりなので、細部に味付けをしていきましょう。
道のエリアにも少し草を配置する
小道と叢が明確にエリア分けされているは、値が0か1の両極端なマスクを使用しているからです。草の配置を無くす0.0という値の代わりにランダム値をセットするようにグラフを拡張しましょう。
[array_size]と[random_value_array]を取得し下図のように接続します。foundと同じ配列数のランダム値が作成されるので、[if]のtrue_caseにセットします。
これで道のエリアにも少し草が生えました。
花が全て同じ向きで配置されているため向きをランダムにする
インスタンスの配置に回転値を適用するにはPointsデータに回転のプロパティーをセットする必要があります。
[randomize_point_rotation]使うとPointsデータの回転プロパティーにランダム値をセットすることができるので、[create_instance]へ渡す前のPaointsデータに適用しましょう。
印象が大きく変わりますね
道のエリア内に配置した草や花のサイズを小さくする
インスタンスの配置にスケール値を適用するには、回転の時と同じくPointsデータにスケールのプロパティーをセットする必要があります。
[scale_points]使うとPointsデータのスケールプロパティーに任意の値をセットすることができます。
マスキングで使用した値を[scale_points]のscaleに接続し、[create_instance]へ渡す前のPaointsデータに適用しましょう。
小道に石を敷き詰める
草や花と同じ要領で石メッシュのインスタンス配置を設定します。
そして要件3の工程4で作った[if]を複製して設定をtrue_case=1.0、false_case=0.0とします。それをマスクデータとして適用します。
ここまでのグラフのテキストは12.zipのsample2.txtです(メッシュの入力は各自で行ってください)。
他にも
・草の背丈をランダムにする
・小屋周辺の日当たりの悪い場所は草を減らす
・小道の幅を均一にしない
・石の向きをカーブに沿わせて石畳にする
など様々な拡張が考えられますね。
最後に
BifrostBlogは今回で一旦終了となります。
正直なところBifrostには改善が必要な箇所がまだまだ残されています。ですが将来有望なツールであると感じていますので、皆さんも一度触ってみてください。
今後も折を見て情報発信をしていこうと思いますので、引き続きよろしくお願いします。
あいるびーばっく!
高島 正規
テクニカルアーティスト
長年シネマティックアーティストとしてフェイスリグやフェイシャルモーションの制作を担当。現在は技術戦略グループに所属し、DCCツールのプラグイン開発のための内製C++ライブラリの構築と、Bifrostを用いたツール開発を行っている。