CG log arch.

アート・映像・CG系のログ

DynamicPaintのシミュレーションを使用する際の注意点

BlenderのDynamicPaintはお手軽にシミュレーションが出来る機能として非常に有用だと思う。

youtu.be

先日、上に貼ったプールの動画でアニメーションを担当した。

波は全てDynamicPaintで作成しているのだが、

キャッシュ計算→レンダリング

の工程に入った段階で一度詰まってしまったので、せっかくなので初学者にありがちそうな点と併せて、その解決法を残しておく。

もし同じような内容で躓く人がいれば役立つかもしれない。

 

メッシュの分割数が重要であるため、ワイヤフレームは基本的に表示している。

使用バージョン 3.3.1(とはいえバージョンは関係ない)

 

シミュレーション

まずは新規シーンを立ち上げ、適当な場所に保存。

簡単にセットアップをする。

Plane、UV Sphereを用意し、そのSphereは適当に小さくしておく。

このPlaneはキャンバスに。Sphereをブラシとして設定する。

物理シミュレーションはPhysics Propertiesから設定できる。

画像のように設定すればOK.

キャンバスのフォーマットはわかりやすいのでWavesにしておく。

 

キャンバスの分割数は多い方が挙動が重い分綺麗にシミュレーションされるのでSubdivisionSurfaceモディファイヤを乗せて分割数を上げておく。

Levels Viewportの値を1→6にし、Renderでもう1段階細かく割っておいてもらうため、2→7にしておく。

 

元々Planeだった形状が変わってしまわないよう、Simpleにしておく。

更にこの記事ではワイヤフレームを表示しておきたいので、Optimal Displayのチェックを外しておく。

するとこのような結果になる。

 

次に、ブラシとなるSphereをアニメーションする。直線移動だけで十分。

アニメーションキーを打つのはビュー上でIキーを押すか、AutoKeyがオンになっている間に移動しておけばいい。

長くても仕方ないので、Sphereキーは0~30フレームの移動、全体のフレームは60にしてある。

 

再生

波が起きない。これは何故か。

 

原因:モディファイヤの順

これは分割するタイミングの問題だ。

  1. 分割を増やしてから
  2. シミュレーションをする

という順に設定する必要がある。

Blenderはモディファイヤスタックが下に行くほど後工程になるので、この場合は分割数を増やす前にシミュレーションしてしまっていたことになる。

 

ということで、モディファイヤ順を変更する。

 

再度、再生

波が出ることを確認できた。

 

準備は完了し、レンダリング

ここでは割愛するが、そのままレンダリングしてしまうと見づらいので、簡単にマテリアル設定とライティングを施してある。

Sphereが移動している最中の20フレーム目を、F12を押しレンダリングしてみる。

またしても波が起きていない。

なんとなくSphereは埋まっているように見えるが、先ほどの結果とは程遠い見た目でレンダリングされてしまっていた。

 

原因:シミュレーションがベイクされていない

原因はシミュレーションがベイクされてないことにある。

シミュレーションをベイクすれば直るのだが…

 

そもそもシミュレーションのベイクとはなんだろうか。

少し手荒だが、タイムラインの現在のフレームを動かしてみる。

綺麗に右から左へ波を作ってほしいのに、高速再生した瞬間だけおかしな結果が見えている。これが、ベイクしていない状態。

 

 

この望まないシミュレーション結果ではなく、通常再生した自然な結果を固めてしまおうというのがシミュレーションのベイクだ。

そしてそのシミュレーション結果は、既に.blendファイルの置き場に保存されている。

こうして再生したり、タイムラインを動かしているうちに自動でキャッシュの置き場としてのフォルダが作成される。

 

キャッシュに関してはPhysics Propertiesの最下部にある。

というわけで、BakeもしくはBake All Dynamicsを押下。

すると2、3秒ほど計算が走り、ベイクが完了する。

今まで出ていなかったDelete Bakeが表示されたらベイクが出来ている。

これでレンダリング準備ができ、作業画面と同様の結果がレンダリングされるはず。

先程と同じく20フレームをレンダリングしてみる。

またしても思うようにレンダリングされない。

シミュレーションもベイクしたのに、どういうことか。

 

原因:Levels ViewportとRenderの値の不一致

これは途中の工程でSubdivisionSurfaceモディファイヤのRender数値が7のままだったことが原因だ。

正確には値が7であることが問題ではなく、Levels ViewportとRenderの値が合っていない事が原因だ。

 

この場合の解決法としては2つあり、どちらでもよい。

  • SubdivisionSurfaceモディファイヤの数値を合わせる

    今回のパターンではLevels Viewportの6でシミュレーションされているため、Renderの数値を6にすることで解決する。

  • SubdivisionSurfaceモディファイヤを使用しない(Applyする)
    十分に分割数を増やしておく必要がある。

作業中にSubdivisionSurfaceモディファイヤを乗せておき、レンダリング時には分割数を増やしてレンダリングする手法は一般的だ。

ただその手法が、シミュレーション時にはエラーに繋がるという話だ。

 

これでようやく、作業ビュー上で見えていたシミュレーション結果がそのままレンダリングされるようになった。

少し見た目が悪いので、スムージングをかけておくと尚見た目は良くなる。

 

 

続いて番外編というか、紹介しきれなかった内容も記述する。

 

原因:シミュレーション時間外

簡単なシーンで用意したため流れで説明できなかったが、デフォルトでのシミュレーションのFrame StartとEndは1~250になっているはずだ。

これにより、もしこれより長い尺のレンダリングをしたい場合はベイクされず、レンダリング結果に反映されないことになる。

 

 

原因:シーンを保存していない

更には、シーンを保存していない状況ではそもそもBakeボタンはグレーアウトしておりベイクをすることが出来ないのだが、少し発生しづらいかと思い割愛した。

 

 

いくらでもエラーは起こりうるだろうが、ざっと思いつく事例の紹介は以上になる。

今回紹介した事例ではSubdivisionSurfaceモディファイヤ使ったが、当然使わない場合2つのエラーパターンは生じることはない。

ただ、分割数を増やす手段としては使いがちなので、こういったエラーに遭遇することもあるかと思ったので記録を残した。

 

おそらく他のチュートリアル動画やドキュメントを見ながら1から作業をすればそのまま再現できるはずなので困ることは無いと思うが、もし今回紹介した事例で1件でも解決できるエラーがあれば嬉しい。

ChatGPTでブログタイトルを決めてみた

いつも全世界の情報発信者の方々にお世話になってるので自分も書こうかと思いアドベントカレンダーに参加することにした。

とはいえ記事を全く書いていなかったこのログには名前すら付いていなかったので、今話題のChatGPTを試してみた。

 

chat.openai.com

 

言わずもがなだが普通に会話として成立してるのが凄い。

という事でタイトル決定。