2023年8月4日(金)、CGWORLDとオートデスクのオンラインフェス「Autodesk Day 2023」が開催された。全11のセッションでは、Maya、3ds Maxをはじめとするオートデスク製品の深掘りや、クリエイターによる制作事例のメイキング、学生CGトライアルの受賞者座談会など、幅広い内容をラインナップ。3DCG制作に役立つノウハウやアイデアを伝える1日となった。
本記事では「3ds MaxとtyFlow を使って動く枯山水を作ったよ!」の模様をレポートする。
イベント概要
Autodesk Day 2023
日時:2023年8月4日(金)
時間:11:00〜19:00
参加対象:3DCG制作に携わる方、これから目指す方など
参加費:無料 ※事前登録制
会場:オンライン配信
cgworld.jp/special/autodeskday2023/
コンテスト受賞作品をベースに砂の動きを解説
本セッションは、昨年末に開催された「KYOTO CG ART CONTEST」において「部門賞―うごき部門」を受賞した金原氏の作品『四季庭(シキテイ)』のブレイクダウンを通じて、3ds Max用エフェクト制作ツールtyFlowのチュートリアルを行うというもの。
金原朋哉 氏(WOW inc. Visual Designer)
フォトリアルなCG表現や映像演出に留まらず、キャラクターのデザインとアニメーション制作も得意とする。Autodeskのコンセプトムービーでは、登場するロボット「Max Man」「Maya Man」のデザイン、アニメーション、映像演出まで包括的に担当した。自主制作のショートフィルムにも精力的に取り組んでいる。
金原氏のX(Twitter):@59603
WOW inc.のX(Twitter):@wow_tokyo
Autodesk Day 2023公式ページからは3ds Max 2022と2024に対応したサンプルデータのダウンロードが可能となっており、金原氏の解説を聞きながら実際に手を動かしてtyFlowの要諦をつかむことのできるセッションとなった。
●サンプルデータのダウンロード
https://drive.google.com/file/d/1UzF-j9aoY2s697Wa4KpxttZwWdehPsWH/view?usp=sharing
●tyFlow FREEのダウンロード(セッションではv1.023を使用)
https://docs.tyflow.com/download/
『四季庭(シキテイ)』のテーマは外国人から見た京都。特に注目したのは石庭による枯山水と四季の表現で、金原氏はこの石庭を動かすということにロマンを感じたという。
「そもそも石庭は川の流れていない場所に川の流れを想像させるという役割も担っていました。当時の日本人は石庭を見て、枯山水が動く様子を想像したのだと思いますが、それを3DCGで動かすというのは何だか素敵だなと思ったんです」(金原氏)。
金原氏は本作の制作のために資料を集めるなかで、砂を「集めること」と「動かすこと」のふたつを切り分けて考えることが必要だと判断。セッションでは、この思考に沿って、「集める」と「動かす」をそれぞれtyFlowでどのように実現していったかを詳細に解説した。
集める(ファイル名:lib_Target)
ターゲットに集める
まずはtyFlowでシンプルにパーティクルを集める方法について解説。配布ファイルの「01_まずはターゲット」レイヤーをONにしてアニメーションを再生すると、パーティクルが中心に集まり球を形成する。
構造としては、Planeのエミッタからパーティクルを発生させ、その下にある地面にコリジョンさせ、tyFlowの[Find Target]イベントでポイントをターゲットに指定することで、パーティクルがポイントに集まってくるというもの。わずか7つのtyFlowイベントを繋ぐだけで、シンプルな「集まる」動きが実現できた。
パーティクルが集まった際に球状に盛り上がる様子は[Particle Physics]イベントで表現。[Collide force → Mass z-bias]値の調整により、盛り上がり方に変化を与えることができる。
また、[Collide force → Stiffness]を0.2などに下げると、集まっても盛り上がることはなくなる。
つまり、この「集める」挙動においては[Particle Physics]イベントの[Collide force → Mass z-bias]、[Stiffness]値が重要になる。「シミュレーションは値をちょっと変えるだけで挙動が大きく変わるので、上手くいった設定値を記録しておくことが大事」と金原氏。
なお、ここで使用しているパーティクルは[Shape]イベントで指定した球体だが、[Scale]イベントを挿入し、[Scale variation]値でランダム要素を加えると、パーティクルサイズにばらつきが出るようになる。
線上に集める
次は「02_次は線上」レイヤーをONにする。今度はノーマライズしたスプラインからスプラインメッシュをつくり、[Find Target]イベントでそのラインを指定して、パーティクルを集める。この[Find Target]以外は最初の例とまったく同じである。
金原氏はこのシミュレーションができた段階で、「今回の作品で、溝はもうこれでつくれてしまうなと確信しました」と話す。
変化するシェイプにパーティクルを集める
次は「03_応用」レイヤーをONにする。今度は、スプラインモーフを用いて円から三角形にシェイプを変化させ、それにパーティクルを集めてみる。
これを[Find Target]イベントで指定すると、パーティクルはこのように動く。パーティクルが三角形に集まる際には、各頂点が盛り上がる。
セッションでは、この盛り上がりを回避する方法を紹介。まず、どこまでの盛り上がりを許容するかを決めるために、しきい値となるZ値を計測するが、その際に、3ds MaxとtyFlowの単位を揃えるため、3ds Maxの上部メニューから[Customize → Units Setup]を実行。ダイアログから[DisplayUnit Scale → Generic Units]に設定する。
次に、側面図でラインを引くなどして、しきい値とするZ値を計測したら、その数値をコピーしておく。
続いて、tyFlowで[Property Test]イベントを挿入し、[Test type → Position Z]、[Test value → Greater than → Value]に先ほどコピーしたZ値をペーストする。
これにより、しきい値以上のZ値をもつパーティクルは別イベントに分岐するという条件が追加できる。ここでは、別イベントに分岐したパーティクルに対して[Force(Gravity)]を上げて落下しやすくし、[Find Target]イベントを外して単に落ちるように設定。さらに、Z値が0.25以下になったらまた集まるというループ設定を行なった。
マップを使ってパーティクルを集める
次は「04_脱線ターゲット」レイヤーをONにする。今度はノイズマップとシンメトリモディファイヤを適用したPlaneを用意し、ノイズの白い部分にのみパーティクルを集めた。
そして発生したパーティクルをMesherでメッシュ化する。
このメッシュを[Find Target]イベントでターゲットに指定する。「04_脱線文様」レイヤーをONにすると、ノイズに沿ってパーティクルが集まる様子が確認できる。
使用したtyFlowイベントは10個足らずとシンプルである。
動かす(ファイル名:lib_Fllow)
サークルパスに沿って動かす
続いては「動かす」。「01_まずは普通に」レイヤーをONにする。ここでは、シンプルなサークルパスに沿ってパーティクルが回転しながら動く様子を表現する。使用するのは[Path Follow]イベント。
[Path Follow]では、[Forces → Follow]値がサークルに従って動く割合、[Attraction]値がサークルに向かって集まる割合を指定する。
また、[Spin]値ではサークル外のパーティクルの挙動を操作できる。
複数のパスに吸着するように動かす
次は「02_次は線上」レイヤーをONにする。サークルパスを3つ、同心円状に配置して、tyFlowの[Path Follow]イベントで[Forces → Follow → Falloff]値を設定する。このとき、2つのパスの距離をLineで計測して、その値を[Falloff]に代入すると、パスに近いパーティクルは速く、パスとパスの間のパーティクルは遅く動くようになり、パスに沿って綺麗に分かれて動くことになる。
また、[Forces → Attraction → Velocity]、[Falloff]値を使うことによってパーティクルを集めることもできたが、これだけではパーティクルが山のように盛り上がる挙動は生み出せなかった。
[Find Target]を足して盛り上がりをつくる
次は「03_応用」レイヤーをONにする。サークルパスに高さを与えて[Find Target]イベントのターゲットに指定することで、パーティクルが山のように盛り上がりつつ、動く様子を表現できた。「もうこれでほぼ完成です」(金原氏)。
ただ、まだ問題は残っている。パーティクルを集めて動かした結果、すき間が発生しているのだ。そこで金原氏は、tyFlowのパーティクルを複製して上に重ね(赤色のもの)、[Spread]イベント→[Particle offsets → Z]で上方に移動。
さらに、[Find Target]と[Path Follow]イベントをOFFにする。
この結果、複製したパーティクルが全体に覆い被さってすき間がなくなり、元のパーティクルは動くという理想のかたちになった。
なお、この動きを実現するためには、2種類のパーティクルについて[Particle interaction → Process only this event]をOFFにしておく必要がある。
高さのしきい値を設けて「集まる」と「動かす」の自然なループをつくる
次は「04_更に細かく」レイヤーをONにする。先ほど作成した、Z値のしきい値に応じてパーティクルの挙動を分岐する処理を加える(濃い青のパーティクルがしきい値を超えたパーティクル)。
この処理を加えることにより、高く行きすぎたパーティクルは下に落ち、また上がってくるというループを生成できる。
パーティクルに回転を加える(ファイル名:lib_spin)
実はここまでのシミュレーションは単に[Particle Physics]を用いた軽い処理のものであり、実は各パーティクルの粒は回転せず横滑りするような動きしかしていない。そこで、[Spin]イベントを用いてパーティクルに回転を加える。
ここでのポイントは[Spin rate → Relative to velocity]をONにして、速度に比例してスピンがかかるように設定すること。速く動くパーティクルは多くスピンし、あまり動かないパーティクルは少しだけスピンするようになる。
また、[Spin rate → Relative to radius]を設定すると、オブジェクトサイズが小さければ小さいほど多くスピンするような挙動を与えることができる。作品では、これら2つの設定を利用して砂粒の自然な回転を表現している。
今回PhysXを使わなかった理由(ファイル名:Particle_VS_PhysX)
tyFlowにはリジッドボディのPhysX Shapeというものもある。これを使えば、オブジェクトのスピンなどの計算も自動で行われ、リアルなシミュレーションを生成できる。ただし動作が重いという欠点があるため、本作では[Particle Physics]に[Spin]を適用して疑似的な回転を加えた。
「シミュレーションとしては正しくないんですが、それっぽく見せられるので、今回のような微細な砂粒であれば、これで十分にリアルに見せられると判断しました」(金原氏)。
パーティクルへの着色(ファイル名:Particle_Color)
最後の仕上げはパーティクルへの着色。金原氏が本作制作で最もこだわった部分のひとつだ。
当初は、[Set Target]イベント→[By Value → Random]値を100にしてチャンネルを設定し、[Mapping]イベント→[Mapping mode → Mapping from custom float]、[Mapping from customdata]で設定したチャンネルを指定して、[Normalize values]を0~100の間に指定する。
これによって、パーティクルに赤からピンクまでの100段階の色がランダムで着色された。
しかしレンダリングしてみたところ、今ひとつ綺麗な仕上がりにならなかった。
そこで金原氏は、写真を使ったPlaneのUVをパーティクルに転写することにした。
ただし、そのままでは写真を転写したことがわかってしまうため、VRayUVWRandomizerを使って写真をUVWに対してランダムにタイリング。満足のいくレンダリング結果を得ることができた。「一部分だけ大きく色が違う箇所があったりとか、なかなかねらってつくれないような、複雑だけど大きなムラがある仕上がりになりました。おしゃれな印象で、これは良いぞと」(金原氏)。
このようにして夏・秋・冬もその季節を象徴する色遣いの写真を用意して、パーティクルに転写することであの美しいルックを導き出した。
セッションの締めくくりに金原氏は、本作のポイントをこう語った。「本編は10秒程度ですが、シミュレーションとしては、どんなに時間が経ってもこの動きを繰り返してくれるというところがポイントです。こんなオブジェがあったら欲しくないですか?」。
TEXT__kagaya(ハリんち)
EDIT_武田かおり/ Kaori Takeda