murakoshiA218のBlog

Blenderと3DCGの話題で暇をつぶすBlog

Dynamic Paintで生成したVertex GroupからParticleを発生させる裏技

 Blenderの不具合?バグ?を回避する裏技を発見した。

 水面をDynamic PaintのBrushに、キャラクターを同Canvasにして、水面に触れた部分=濡れた部分から水しぶきをしたたらせようと思った。
 そこで水面と接触した部分をVertex GroupにBakeし、ParticleのDensity用Vertex Groupに指定しても、Particleの発生源の位置が1フレーム目のVertex Groupの状態から変化しない。 具体的には以下のアニメGIFの左のようになる。(右のようにしたい。)
問題点

 Google検索すると同じような質問は見つかったものの、回避策が無い。 代替策としてはVertex Groupを使わず、ParticleのTimeテクスチャとDinsityテクスチャの2種類の連番イメージをBakeして指定する方法があったけれど、これはどうやってもうまく行かなかった。

 そこで何とかならないかなぁ…と思って色んなところをクリックしていると、Particle SystemのRotationチェックボックスを押した直後だけ、一瞬反映されることを発見。 チェックボックスの上でマウスボタンを連打するとうまくいくw
 このマウス連打を自動化したのが以下のPythonスクリプト。 カレントフレームが変わる前にRotationをOn/Offする関数を呼び出すようにした。 blendファイル読み込み後1回だけ実行する。(複数回実行しても結果は同じ。)

import bpy

def my_handler(scene):
value = bpy.data.particles["ParticleSettings"].use_rotations
bpy.data.particles["ParticleSettings"].use_rotations = not value

def register():
bpy.app.handlers.frame_change_post.clear()
bpy.app.handlers.frame_change_post.append(my_handler)
print("bpy.app.handlers.frame_change_post = ", bpy.app.handlers.frame_change_post)

register()



 実行すると見事に前述のアニメGIF右側のようになる。(よく見るとRotaionのチェックボックスがチカチカしているのが解ると思う。)

という訳で図解も用意した。

解説

【参考】
 スクリプトの作成に当たっては、以下のStack Exchangeの記事を参考にした。感謝。
python - Running a script for each frame - Blender Stack Exchange

 なおこの記事にあるunregister()関数は動作しないので注意。 他にも2つくらいの記事(URLは失念)を参考に、clear()メソッドで毎回登録済のhandlerをすべてクリアして登録し直している。(よって何等かのアドオンを併用している場合は不具合が起きるかもしれないので注意。)
スポンサーサイト
  1. 2017/05/07(日) 21:58:40|
  2. Blender::Particle/Hair
  3. | トラックバック:0
  4. | コメント:0

プロフィール

murakoshiA218

Author:murakoshiA218

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

カテゴリー

ブログ内検索

RSSフィード

リンク

このブログをリンクに追加する

counter