この記事では、Bifrost で Vector Field を書き出して UE5 の Niagara で使用する方法を紹介します!
Vector Field は頻繁に使用される機能ではありませんが、特徴的な表現で使い所があるかもしれません。
対象読者
・エフェクトデザイナー
・テクニカルアーティスト
・Bifrost に興味があるデザイナー
環境
・Maya 2024
・Bifrost 2.15.0.0
・Unreal Engine 5.6.1
目次
サンプルデータ
以下の手順でサンプルデータを確認できます。
Bifrost はノード情報をテキストとしてコピー&ペーストできます。
①以下ボタンをクリック
「ノード情報のテキスト」がクリップボードに保存されます。
②Bifrost 2.15.0.0 をダウンロード
Bifrost は Maya とは別に独自にバージョンがあります。
完了したら、Bifrost 2.15.0.0 をダウンロードしたバージョンの Maya を起動
③Bifrost Graph Editer にペースト
[Window > Bifrost Graph Editor]を開き、「Create Graph」をクリック

[Ctrl + V]でペースト

Vector Field とは

空間上の各点に「方向(ベクトル)」と「強さ(スカラー値)」を持たせたデータ構造です。
「この位置のパーティクルは右へ流す」
「この位置では上へ吹き上げる」
「ここでは渦を巻くように動かす」
といったパーティクルの挙動を指定できます。
また、拡張子は .fga(Fluid Grid Asset)です。
一連の流れ
- Bifrost で Vector Field を作る
- スクリプトを実行し
.fgaを書き出す - UE5 の Niagara に組み込む
Bifrost で Vector Field を作る
今回は Volume から Vector Field を作るものを想定しています。
Volume の部分は[Bifrost Browser > Particle > gradient_advection]を使用します。

また、『simulate_aero』以降の部分は不要のため削除いただいて問題ありません。

サンプルデータを『simulate_aero』に接続してスクリプトを実行することで、.fga を書き出せます。
『make_vector_field_data』の中身に関しては、以降に記載しています。

Volume から Vector Field の値を作る

【全体像】

【sort_voxel_velocity の中身】
- Volume から Vector Field に必要な値を取得
- 範囲や速度にスケールをかけれるように設定
- Unreal の軸に変換
Vector Field に必要な値を取得

【sample_voxel_data の中身】
- 『volume_bounds』で Volume のバウンディングボックスを取得
- “divisions” をもとに参照するボクセル位置を作る
- 『volume_scope』でデバック表示
- voxel_velocity を取得
- “voxel_velocity_indices” の配列順を取得
参照するボクセル位置を作る

【generate_sample_points_from_volume の中身】


【for_each2 の中身】
【for_each3 の中身】
- ボクセルの最小サイズを算出
- XYZ の順に位置配列を並べる(バウンディングボックスのサイズを “divisions” で分割した形)
- 位置配列と “min_bounds” を加算し、バウンディングボックスと位置を合わせる。

ボクセル位置の配列順を取得

【make_voxel_velocity_indices の中身】


【for_each の中身】
【for_each1 の中身】
[X ⇨ Y ⇨ Z]の順にボクセルを並べていくイメージ。
スクリプトを実行し .fga を書き出す

【BifrostGraph】
以下コードをコピーし、Vector Field を書き出した Bifrost Graph を開いたまま、Maya の Script Editor で実行してください。
実行した後、現在の Maya Scene と同階層のフォルダに .fga が書き出されます。
コード
# -*- coding: utf-8 -*-
import os
from maya import cmds
import maya.mel as mel
def bake_fga_texture():
# 現在開かれている Bifrost Graph を取得
open_bifGraph = cmds.vnnCompoundEditor(query=True, dg=True)
# output の vector_field_data の要素を取得
vfd = cmds.getAttr(f"{open_bifGraph}.vector_field_data[*]") # 全要素をまとめて取得
voxel_res, min_bound, max_bound = vfd[:3] # 0,1,2 は voxel_resolution, min_bound, max_bound
voxel_velocity = vfd[3:] # 3 以降を velocity としてリスト化
# output の vector_field_file_name を取得
file_name = cmds.getAttr(f"{open_bifGraph}.vector_field_file_name")
# 出力パス(現在のシーンディレクトリに vectorfield.fga)
maya_file_path = os.path.dirname(cmds.file(q=True, sn=True)) or os.getcwd()
out_path = f"{maya_file_path}/{file_name}.fga"
# ファイル書き出し(1 行でコンマ区切り)
with open(out_path, "w") as f:
# 解像度(整数)
f.write(f"{int(voxel_res[0])},{int(voxel_res[1])},{int(voxel_res[2])},")
# min / max bounds
f.write(f"{min_bound[0]},{min_bound[1]},{min_bound[2]},")
f.write(f"{max_bound[0]},{max_bound[1]},{max_bound[2]},")
# velocity 配列
for v in voxel_velocity:
f.write(f"{v[0]},{v[1]},{v[2]},") # 最後のカンマは許容
print("書き出し先", out_path)
mel.eval(f'print("書き出し先: {out_path}")')
bake_fga_texture()
UE5 の Niagara に組み込む

Niagara で Vector Field を使用するには以下の2つのモジュールが必要です。
・Sample Vector Field
・Applay Vector Field
また、Vector Field を使う場合は粒子をたくさん飛ばす場合が多いかと思いますので、”GPU シミュレーション” に設定することを推奨します。
Sample Vector Field

※ 重要なパラメーターだけ詳細を記載いたします。
| Field | Vector Field を入れる箇所 |
| Sampled Vector Scale | 参照する速度の係数。値が大きいほどより速い動きになる。 |
Applay Vector Field

| Vector Field Intensity as Force | Vector Field を参照する加速度(徐々に早くなる) |
| Vector Field Intensity as Velocity | Vector Field を参照する速度(いきなり早くなる) |
| Vector Field Intensity Tightness | Vector Field にどれだけ“忠実に”従うかを決める値。 0 :ゆるく従う(初速だけ従うような状態) 1 :完全に従う(しっかり流れに沿う) |
以上で冒頭の動画のようになります!
まとめ
今回は Bifrost で Vector Field を書き出して UE5 の Niagara で使用する方法を紹介しました。
少しのスクリプトでツールに制約されずにデータを作成することができます。
また、Vector Field は UE 独自の機能ではありませんので、軸変換などを考慮したうえで他エンジンでもお試しいただけますと幸いです!

