Media & Entertainment Collection and Arnold キャンペーンMedia & Entertainment Collection and Arnold キャンペーン

チュートリアル / Bifrostはじめました
第3回:Bifrostの基礎(単位や各ノードの役割)

2017.11.27

  • Maya
  • シミュレーション
  • チュートリアル
  • 中級者
  • 学生・初心者

Bifrostを構成するノードと計算の単位を理解する

前回までBifrost Aeroを使用してエフェクトを作成してきましたが、流体を扱うにはAero以上に様々なアトリビュートを考慮しながら設定していく必要性があります。どんな形でBifrostが計算を行ってくれるのかを理解しながら進めると、結果を予測しながら扱うことができるはずです。また、シミュレーションの計算には実は単位が密接に絡んでいます。ここら辺も理解しながら進めると、より有効な効果を得ることができるはずです。

簡単にBifrostで流体を設定してみる

それではまず流体を使った簡単なシーンを呼び出して、その構成要素を見てみましょう。

実際の作成ステップはこの後で説明しますが、まずは添付のMayaシーンを開いてみてください。(Mayaバージョンは2018)
Mayaシーン: bifrost_rot_setteizumi.mb

なお、一から流体を設定したい場合は最後のオペレーションビデオを見ながらこちらのシーンをダウンロードしてください。
Mayaシーン: bifrost_rot.mb

前回使用したバックグランドキャッシングを使って色んなところから見てみてください。
このBifrostのシーンにはいくつかの構成要素が存在します。下記をご覧ください。

流体は発生源(エミッター)から生成され、重力や流体のパラメータに従い。衝突オブジェクトに当たり拡散したのち、キルプレーンより下は計算を省略。という流れになっています。
構造を理解するには3Dビューではなく、ノード間の関係性を見ていくのが適切な手法だと思います。多くのMayaユーザの方々はここでハイパーグラフ(弊社Mayaスタッフの画面を覗くと常にこのハイパーグラフが開かれています)を使われると思いますが、ここはノードエディタを使ってみましょう。
ノードエディタはウインドウ>ノードエディタから読みだせます。

様々な要素を呼び出すと収拾がつかなくなりますので、ここではアウトライナーでbifrostLiquidを選択しておきましょう。

そのうえで、ノードエディタを開きます。

こんな感じになるはずです。表示が違うよ!という方はメニューの赤丸で囲った部分をクリックしてください。ノードやアトリビュートの表示方法が切り替わります。

普段ノードエディタを使っていない方はこの機会に色々と触ってみてください。
ノードエディタの良いところは各ノード間の接続だけではなく、どのアトリビュートが接続されているかをすぐに確認し、アトリビュートエディタと組み合わせてその場で様々なカスタマイズが可能なところです。ICEを愛用していた私にとっても馴染みやすいUIです。
では各ノードをわかりやすいように色付けしてみましょう。

発生源(エミッター)はBifrostの発生元になるプロパティーを定義します。このノードに発生源となるオブジェクトを接続して使用します。複数の場所から流体が発生する場合ではこのノードにそれぞれのオブジェクトを接続する形になります。例えばグラスに水を追加で注ぐなどの時です。
フレームはシミュレーション時のフレームアトリビュートの値を格納しています。

衝突オブジェクト(コライダー)は流体が衝突するときの値や衝突オブジェクトをどのような形で扱うかを定義します。例えば衝突計算の精度などもこの中で定義することができます。エミッターと異なり、複数のノードを設定できますので、衝突オブジェクトごとに異なるパラメータを持たせることも可能です。

ガイドシミュレーションは計算負荷を軽減させるときに使用する手法です。例えば海洋のシミュレーションなどをまともに計算させると、とんでもない量のコンピューティングパワーが必要となります。基本的な動きはガイドに任せ、飛沫や泡、波が砕けるなどにリソースを費やすことができます。今回のようなケースには使用しませんが、Bifrost流体の設定を行うと自動で作成されます。

メインプロパティをクリックして使用できるアトリビュートを確認してみてください。重力やボクセルサイズなどを設定できるほか、bifrostの計算を行うのに欠かせない水滴、渦、表面張力、粘性、浸食といった各種パラメータをコントロールできます。また各種キャッシュの管理などもこのノードでコントロールされます。

メインコンテナーは各種ノードから入力された値を受け、シミュレーションを実行するノードになります。

シェイプはシミュレーションで得られた結果を実際に表示している部分です。通常はパーティクルで表示していますが、ボクセルやメッシュに変換なども行えます。
試しにポリゴン化してArnoldでレンダリングしたものが下記の例です。

では単位の話を

続けてBifrostの単位の話をしていきたいと思います。
CGの中で1グリッドって実世界の中ではどれくらいの大きさでしょうか?一応我々の方では単位をプリファレンスの中で定義していますが、現実とのインタラクションがない限りあくまでも相対値であって、プロジェクトに応じて決めていく。なんていう位のものだと思います。

ところが、Bifrostはこの単位を念頭においてシーンを構築しなければ望んだ結果を得ることができません。なぜなら水が持つ表面張力や粘性の力は非常に小さく、水の大きさによって影響の度合いが異なってくるからです。

ではBifrostの基本単位はどう設定されているのでしょうか。
まずはMayaの中で単位がどのように設定されているのかを確認してみてください。

ウインドウ>設定/プリファレンス>プリファレンス

この中から設定を選んでください。
作業単位の部分がセンチメートルになっていることを確認してください。

Bifrostはこのリニアがセンチメートルの時に1グリッドの大きさを1mとして計算します。このことを念頭に置いてシーンの設定をしていきましょう。

わかりやすいようにMayaのグリッドで表示します。

という事で、波打ち際を表現したければ、50~100グリッド、噴水だと10グリッド、グラスなら0.1グリッド位でモデリングを行う必要性があるという事を理解してください。勿論、対象になるものの大きさがリファレンスになるわけです。

本当に結果が違うの?という声が上がってきそうですので、実際に実験してみましょう。
サンプルのMayaのシーンを開いてください。
Mayaシーン: bifrostUnit_setteizumi.mb

自分で流体のシーンを組む場合は最後のオペレーションビデオを見ながらこちらのMayaシーンで作業を行ってください。
Mayaシーン: bifrostUnit.mb

私はこのサンプルを何も考えずに作成しましたので、結果的に半径8mのタンクに2m*2m*2m計8トンの水が落ちることになります。
さて結果を見てみましょう。

すごい勢いで水が飛び散っているのがわかります。巨大な水が衝突するので、こんな現象が起きるわけです。
ではこれを1/100の大きさに変えてみましょう。
オブジェクトの親を選択してXYZのスケール値に0.01を入力します。

今度は1/100の大きさなので半径8cmのグラス(メガジョッキ?)に8gの水が落ちることになります。では結果をと言いたいところですが、ここでパラメータを調整する必要性があります。
シーンが1/100の大きさになっているので、計算精度も変更しなければいけません。

変更するパラメータは今回は2つです。
マスターボクセルサイズを0.2から1/100の0.002に、転送ステップと、時間のステップをそれぞれ0.75に変更します。
マスターボクセルサイズは基準になるボクセルのサイズです。1が1mですから、今回の計算精度は2cm間隔ということになります。転送ステップと時間のステップはパーティクルの移動値がシーンに対して相対的に大きすぎたり小さすぎたりするときに調整します。
今回オブジェクトの大きさを1/100にしました。つまりパーティクルの移動値が相対的に大きくなったわけです。そこでステップの数値を大きくすることで計算の反復数を上げて対応します。

結果を見てみましょう。

ユラユラと動くだけです。こちらはよく目にする光景だと思います。

どうでしょうか?Bifrostの基本的な振る舞いと各ノードに関して理解できたでしょうか?
ただ今回の内容はちょっと地味でしたので、少し派手な水のシーンを作ってみました。ご覧ください。

次回以降ではBifrostを使用して、より実践的なシーンの構築に進んでいきたいと思います。

最後に全体を通したオペレーションを撮っておきましたので、こちらも参考までにご覧ください。

各ノードの説明とシーンの構築に関して:

単位に関して:

著者

門口 洋一郎

門口 洋一郎

オートデスク株式会社
技術営業本部
M&Eマネージャー