チュートリアル / Bifrostはじめました
第7回:ジオメトリーでのコントロール
- Maya
- コラム
- シミュレーション
- チュートリアル
- 中級者
- 学生・初心者
ジオメトリーのモーションフィールド
Mayaの開発チームの中にMayaの初期から開発に携わり、Mayaの父と言われている方が居ます。
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に変更します。つまり下向きの重力が発生しないようにします。
次にモーションフィールドのパラメーターです。今回はなるべくイルカの形を保持したいと考えています。そこでbifrostMotionFieldContainerを開きます。デフォルトでは方向にチェックが入っています。
このままだと一方向に力が加わるので、このチェックはOffにします。イルカには吸着させたいので、ジオメトリーはチェックを入れておきます。
次にイルカに吸着させるように設定します。bifrostMotionFieldContainerの中のジオメトリーのタブの中でまず影響範囲のチェックを外し、法線に沿うのパラメーターに―の値を入れておきます。+の値だと法線方向に押し出されるからです。
あと摩擦のパラメーターも使用すると、パーティクルに摩擦がかかり、動きがだんだん緩やかになります。動きがゆっくり過ぎる場合はMagnitudeに値を入れると係数になりますので、調整してください。ではアニメーションを再生してみましょう。
これでジオメトリーを使用したモーションフィールドの振る舞いが理解できたと思います。
波を作成する
では基本がわかったところで波を作成してみましょう。この波の作り方は弊社ドイツスタッフであるRolandから教えてもらいました。(Rolandありがとう!)
使うテクニックはモーションフィールドのジオメトリーです。まずは波の発生源を作ります。
Mayaのシーンを読み込んでください。
注:サンプルシーンは軽くするためにマスターボクセルを大きくしています
現実世界と同じように岸に近づくと浅くなるように設定しています。
アニメーションを再生してみましょう。フレームが動いても特にドライブするオブジェクトが存在しないので水面は静かなままのはずです。
ここでモーションフィールドのジオメトリーを使用するのですが、そのドライブするオブジェクトが、前回作成したBOSSで計算したものをAlembicキャッシュとして出力したものです。BOSSで毎フレーム計算するとCPUに負担がかかりますので、キャッシュファイルを使用するわけです。
キャッシュ>Alembicキャッシュ>Alembicから読み込みでファイルを読み込んでください。
前回のコラムを実行されていない方はこちらからデータをダウンロードすることができます。
Alembicファイルは全フレームのデータですので若干重いです。このファイルの場合240フレーム分のデータですので138MBほどあります。ご注意ください。
Alembicファイルを読み込みましたらパーティクルに対して適切な位置に配置してください。私の場合少し海面の下になるように配置しました。
ではモーションフィールドを設定していきましょう。最初にCube3を選択し、Bifrostのノードとキャッシュデータを選択し、Bifrost流体>モーションフィールドを実行します。
ついでに計算コストを下げるためにKill Planeも設定して、落ちていったパーティクルは計算しないようにしましょう。簡単に動画にしてみましたのでご覧ください。
さて、これからパラメーターを修正していきます。
先ほどのイルカの場合は衝突によって拡散したパーティクルが戻るという設定にしましたが、今回は波が浜辺に押し寄せるという設定です。そこで今回はMotionFieldのパラメーターに以下のようなセッティングにします。
減衰の有効化にチェックを入れます。また法線に沿うに関しては0を入れます。これでドライブするオブジェクトの特定の近さのパーティクルのみドライブされるようになります。また波はその場にいてほしいわけではなく、浜辺に向かって進んで欲しいのでInherit Velocityに1以上の数値を入れてあげます。つまりパーティクルはより強い力で押し出されるわけです。
bifキャッシュを使う
さて、それでは計算させてみましょう。
マスターボリュームの値にはよりますが、少なくとも私のMac Book Proではとても重い計算になります。この後に泡も追加したいのですが、そのままでは待ちが多くなって作業スピードが滞ってしまいます。そこでキャッシュを取って作業の効率化を図っていきましょう。
いったんキャッシュ化が終わったら、波本体のシミュレーションはキャッシュに任せて、キャッシュをベースに泡などを追加すればいいわけです。
ではキャッシュファイルを作っていきましょう。いくつかのアプローチがありますが、Bifrost流体>計算してディスクにキャッシュを選んでください。
エディターが開きますので、キャッシュファイルの名前や、フレームの長さなどを決めてください。
キャッシュファイルはbif形式で自分で定義したプロジェクトデータ内に格納されます。
オペレーションを動画で撮ってみましたので参考までにこちらをご覧ください。
圧縮フォーマットですが、ロスレスだと必然的にファイルサイズが大きくなるので、それ以外の圧縮フォーマットにしたほうが良いかもしれません。
作成のボタンを押すと、一フレームずつデータを作成していき所定の場所にキャッシュファイルが生成されます。その間はコーヒーでも飲んでいてください。
キャッシュファイルを活用する
さて、先ほどキャッシュを作りましたので、もうこのCPUに負荷をかける作業からは卒業です。
まずはシーンの断捨離を行いましょう。
bifrost系のノードは丸ごと必要ありません。BOSSで作成したAlembicキャッシュも必要ないので消しちゃいましょう。
シーンデータはこのようにすっきりしましたね。
ではキャッシュファイルを読み込んでいきましょう。一応bifrostノードが必要なので球でも出してbifrostの設定を行ってください。
大事なのはキャッシュファイルを指定することです。bifrostLiquidPropertyContainerの中にキャッシュのタブがありますので、液体のキャッシュを有効化し、事前に作成しておいたbifファイルを指定してください。
ちょっと文章だけだとわかりづらいですね。動画を撮っておきましたのでこちらをご覧ください。
折角なので240フレーム分作成してみました。
これで波の動きはシミュレーションではなく、キャッシュで動いています。では、次に泡を追加しましょう。キャッシュから泡が発生するので非常に軽くデータを生成することができます。
Bifrostのノードを選択し、Bifrost流体>泡を選択します。
そのままでも良いのですが、少し変化をつけたいので、FormShapeのノードからカラーのタブを選択し、少し色を変えていきましょう。
デフォルトだと泡の色は白のみなんですが、密度が低いと薄い青に、密度が上がると白に変化するように調整しました。好みの問題ですが、ご自由に調整してください。
後はシミュレーションするだけです。
たいしたことはやっていませんがこちらもオペレーションを動画にしてみました。
波はキャッシュ、泡に関してはそのキャッシュの上で計算させたものが下記の動画です。動画のキャプチャーを行いながらMayaを動作させているためフレーム落ちしていますが、実際はほぼリアルタイムで動作します。
都合3回分MotionFieldに関しては解説しました。冒頭Duncanを紹介しましたが、第4回のコラムに関してもDuncanからサポートしてもらいました。また来日が実現した暁には日本酒でも飲んでもらいましょう。
Bifrostの高速化や最適化に関してはまだ書きたいことがあるので次回以降も続けていきたいと思います。
これに加えArnoldが5.2に進化したことや、Mayaが2018以降のUpdateでArnoldでのbifrostレンダリングが大分安定してきました。次回以降のコラムではこの部分に関しても述べていきたいと思っています。参考までに第5回のシーンをArnoldでレンダリングしてみました。
次回以降もよろしくお願いします。