チュートリアル / Bifrostはじめました
第7回:ジオメトリーでのコントロール

2018.10.03

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

ジオメトリーのモーションフィールド

Mayaの開発チームの中にMayaの初期から開発に携わり、Mayaの父と言われている方が居ます。

Duncan

Duncanという方です。私は以前Softimageに居ましたが、彼が開発したPaint EffectやFluidなどは「すげーもの作る人がMayaには居るなー」と感じていました。私がAutodeskに移って、やりたかったことの一つが、Duncanを日本に呼ぶことでしたのでMaster Classでの講演が実現したときは大変嬉しかったのを覚えています。
https://area.autodesk.jp/event/report/autodesk_masterclasses_2010/index-2.html
講演の冒頭で尺八を吹いたのには驚きましたが。。。。

さて、弊社の中では独自の動画共有サイトがありまして、社内の開発などが、そのサイトを通じて「こんなものを作っているんだけど、どう思う?」という感じで技術を見せ合っています。DuncanはBifrostのMotionFieldの開発のリードだったのですが、彼自身がサンプルでこんなものを上げていました。

なるほど、BifrostってMotion Fieldにジオメトリーを使えるのね。ということは流体の動きをローレベルのアニメーションでコントロールできるということじゃないか!ということに気づきました。
そのジオメトリーのモーションフィールドを使って作ったのが前回の波の動きです。
では浜辺のシーンの続きを作る前にジオメトリーのモーションフィールドの使用法を理解し、その上でシーンを作成していきましょう。

簡単なサンプルで試す

こんなシンプルなシーンを作ってみましょう。

イルカを球が突き抜けるシーン

イルカを球が突き抜けるというものです。Bifrostの流体はイルカに引き付けられるように設定してあるので、球が突き抜けてもイルカに吸着します。こんなシンプルなシーンですがお付き合いください。まずはイルカのモデルを読み込みます。コンテンツブラウザーを呼び出しイルカのモデルを読み込んでください。

コンテンツブラウザーを呼び出しイルカのモデルを読み込む

コンテンツブラウザーはウインドー>一般エディターから呼び出せます。

コンテンツブラウザー

色んなサンプルが含まれていますので、お好きなものをご利用ください。
呼び出したままの状態では結構大きいのでバンドウイルカの標準サイズの3mくらいまでの大きさに調整してください。

イルカからBifrostを発生させ、そのBifrostのプロパティとイルカのモデルを選択した状態で、Bifrost流体>モーションフィールドを実行します。こうすると選択されたイルカのモデルがジオメトリーのモーションフィールドとして設定されます。後は衝突用のオブジェクトとして球を設定するだけです。下記のようにオペレーションを動画にしましたので参考にしてください。

イルカのモデルがジオメトリーのモーションフィールドとして設定される

球にアニメーションをつけイルカを突き抜けるように設定します。アニメーションを再生してみましょう。

球にアニメーションをつけイルカを突き抜けるように設定

上記のように重力に引かれるわ、発散してしまうなど、こちらが期待していたような動きは生まれません。
そこでパラメーターを調整します。
bifrostLiquidPropertiesContainerの中の重力を9.8から0に変更します。つまり下向きの重力が発生しないようにします。

bifrostLiquidPropertiesContainerの中の重力を9.8から0に変更

次にモーションフィールドのパラメーターです。今回はなるべくイルカの形を保持したいと考えています。そこでbifrostMotionFieldContainerを開きます。デフォルトでは方向にチェックが入っています。
このままだと一方向に力が加わるので、このチェックはOffにします。イルカには吸着させたいので、ジオメトリーはチェックを入れておきます。

モーションフィールドのパラメーター

次にイルカに吸着させるように設定します。bifrostMotionFieldContainerの中のジオメトリーのタブの中でまず影響範囲のチェックを外し、法線に沿うのパラメーターに―の値を入れておきます。+の値だと法線方向に押し出されるからです。

イルカに吸着させるように設定

あと摩擦のパラメーターも使用すると、パーティクルに摩擦がかかり、動きがだんだん緩やかになります。動きがゆっくり過ぎる場合はMagnitudeに値を入れると係数になりますので、調整してください。ではアニメーションを再生してみましょう。

摩擦のパラメーターも使用する

これでジオメトリーを使用したモーションフィールドの振る舞いが理解できたと思います。

波を作成する

では基本がわかったところで波を作成してみましょう。この波の作り方は弊社ドイツスタッフであるRolandから教えてもらいました。(Rolandありがとう!)
使うテクニックはモーションフィールドのジオメトリーです。まずは波の発生源を作ります。
Mayaのシーンを読み込んでください。

注:サンプルシーンは軽くするためにマスターボクセルを大きくしています

波を作成する

現実世界と同じように岸に近づくと浅くなるように設定しています。
アニメーションを再生してみましょう。フレームが動いても特にドライブするオブジェクトが存在しないので水面は静かなままのはずです。

現実世界と同じように岸に近づくと浅くなるように設定

ここでモーションフィールドのジオメトリーを使用するのですが、そのドライブするオブジェクトが、前回作成したBOSSで計算したものをAlembicキャッシュとして出力したものです。BOSSで毎フレーム計算するとCPUに負担がかかりますので、キャッシュファイルを使用するわけです。
キャッシュ>Alembicキャッシュ>Alembicから読み込みでファイルを読み込んでください。

キャッシュ>Alembicキャッシュ>Alembicから読み込み

前回のコラムを実行されていない方はこちらからデータをダウンロードすることができます。

Alembicファイルは全フレームのデータですので若干重いです。このファイルの場合240フレーム分のデータですので138MBほどあります。ご注意ください。

Alembicファイルを読み込みましたらパーティクルに対して適切な位置に配置してください。私の場合少し海面の下になるように配置しました。

海面の下になるように配置

ではモーションフィールドを設定していきましょう。最初にCube3を選択し、Bifrostのノードとキャッシュデータを選択し、Bifrost流体>モーションフィールドを実行します。
ついでに計算コストを下げるためにKill Planeも設定して、落ちていったパーティクルは計算しないようにしましょう。簡単に動画にしてみましたのでご覧ください。

モーションフィールドを設定

さて、これからパラメーターを修正していきます。
先ほどのイルカの場合は衝突によって拡散したパーティクルが戻るという設定にしましたが、今回は波が浜辺に押し寄せるという設定です。そこで今回はMotionFieldのパラメーターに以下のようなセッティングにします。

パラメーターを修正

減衰の有効化にチェックを入れます。また法線に沿うに関しては0を入れます。これでドライブするオブジェクトの特定の近さのパーティクルのみドライブされるようになります。また波はその場にいてほしいわけではなく、浜辺に向かって進んで欲しいのでInherit Velocityに1以上の数値を入れてあげます。つまりパーティクルはより強い力で押し出されるわけです。

bifキャッシュを使う

さて、それでは計算させてみましょう。
マスターボリュームの値にはよりますが、少なくとも私のMac Book Proではとても重い計算になります。この後に泡も追加したいのですが、そのままでは待ちが多くなって作業スピードが滞ってしまいます。そこでキャッシュを取って作業の効率化を図っていきましょう。
いったんキャッシュ化が終わったら、波本体のシミュレーションはキャッシュに任せて、キャッシュをベースに泡などを追加すればいいわけです。
ではキャッシュファイルを作っていきましょう。いくつかのアプローチがありますが、Bifrost流体>計算してディスクにキャッシュを選んでください。

Bifrost流体>計算してディスクにキャッシュ

エディターが開きますので、キャッシュファイルの名前や、フレームの長さなどを決めてください。
キャッシュファイルはbif形式で自分で定義したプロジェクトデータ内に格納されます。

キャッシュファイルの名前や、フレームの長さなどを決める

オペレーションを動画で撮ってみましたので参考までにこちらをご覧ください。

オペレーションの動画

圧縮フォーマットですが、ロスレスだと必然的にファイルサイズが大きくなるので、それ以外の圧縮フォーマットにしたほうが良いかもしれません。
作成のボタンを押すと、一フレームずつデータを作成していき所定の場所にキャッシュファイルが生成されます。その間はコーヒーでも飲んでいてください。

キャッシュファイルを活用する

さて、先ほどキャッシュを作りましたので、もうこのCPUに負荷をかける作業からは卒業です。
まずはシーンの断捨離を行いましょう。
bifrost系のノードは丸ごと必要ありません。BOSSで作成したAlembicキャッシュも必要ないので消しちゃいましょう。

BOSSで作成したAlembicキャッシュも必要ないので消す

シーンデータはこのようにすっきりしましたね。

すっきりしたシーンデータ

ではキャッシュファイルを読み込んでいきましょう。一応bifrostノードが必要なので球でも出してbifrostの設定を行ってください。
大事なのはキャッシュファイルを指定することです。bifrostLiquidPropertyContainerの中にキャッシュのタブがありますので、液体のキャッシュを有効化し、事前に作成しておいたbifファイルを指定してください。

キャッシュファイルを読み込む

ちょっと文章だけだとわかりづらいですね。動画を撮っておきましたのでこちらをご覧ください。

操作説明動画

折角なので240フレーム分作成してみました。

これで波の動きはシミュレーションではなく、キャッシュで動いています。では、次に泡を追加しましょう。キャッシュから泡が発生するので非常に軽くデータを生成することができます。
Bifrostのノードを選択し、Bifrost流体>泡を選択します。

Bifrostのノードを選択し、Bifrost流体>泡を選択

そのままでも良いのですが、少し変化をつけたいので、FormShapeのノードからカラーのタブを選択し、少し色を変えていきましょう。

FormShapeのノードからカラーのタブを選択

デフォルトだと泡の色は白のみなんですが、密度が低いと薄い青に、密度が上がると白に変化するように調整しました。好みの問題ですが、ご自由に調整してください。
後はシミュレーションするだけです。
たいしたことはやっていませんがこちらもオペレーションを動画にしてみました。

操作説明動画

波はキャッシュ、泡に関してはそのキャッシュの上で計算させたものが下記の動画です。動画のキャプチャーを行いながらMayaを動作させているためフレーム落ちしていますが、実際はほぼリアルタイムで動作します。

都合3回分MotionFieldに関しては解説しました。冒頭Duncanを紹介しましたが、第4回のコラムに関してもDuncanからサポートしてもらいました。また来日が実現した暁には日本酒でも飲んでもらいましょう。
Bifrostの高速化や最適化に関してはまだ書きたいことがあるので次回以降も続けていきたいと思います。
これに加えArnoldが5.2に進化したことや、Mayaが2018以降のUpdateでArnoldでのbifrostレンダリングが大分安定してきました。次回以降のコラムではこの部分に関しても述べていきたいと思っています。参考までに第5回のシーンをArnoldでレンダリングしてみました。
次回以降もよろしくお願いします。

著者

門口 洋一郎

門口 洋一郎

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

製品購入に関するお問い合わせ
オートデスク メディア&エンターテインメント 製品のご購入に関してご連絡を希望される場合は、こちらからお問い合わせください。