各フレームに違う値を自動入力したい
Blenderをやってるとき↓こんな感じでオブジェクトのキーフレームをずらっと打ちたいことがあります。
手動で打つのは、要素が多かったり尺が長くなれば面倒です。スクリプトでやりたいと前から思ってたのでやってみました。
今回はモディファイヤのディスプレイスメントの強さと、とテクスチャのノイズの強さのキーフレームをランダムに入力しました。
できたのはこちら↓
import bpy import random #オブジェクト取得 obj = bpy.context.object #フレームのstart位置 frame_num = 0 while frame_num<120: #120フレームまでキーフレームを打つ #Displacementモディファイアとノイズテクスチャのサイズに指定範囲のランダム値を入力 obj.modifiers["Displace"].strength = random.uniform(0.02,0.04) bpy.data.textures["Texture"].noise_scale = random.uniform(0.03,0.06) #現在のフレームにキーフレームを挿入 bpy.data.textures["Texture"].keyframe_insert("noise_scale",frame=frame_num) obj.modifiers["Displace"].keyframe_insert("strength",frame=frame_num) frame_num += 3 #3フレーム先へ。
モディファイヤ系のキーフレームの打ち方がわからなくてちょっと調べました。
わかったら簡単でした。↓で打てるようです。
bpy.context.object.modifiers['モディファイヤ名'.keyframe_insert("パラメーター名",frame=フレーム数)
Blenderは要素の大部分にキーフレームを打てるので、スクリプトからキーフレームを操作できると便利そうです。数値が入力できないものにもなぜか打てたりします。
Blenderでスクリプトを書くには、Scriptingのワークスペースに移動して【新規】を押してテキストを作成。最初に↓
import bpy
と書いたら、あとはやりたい指示を書きます。
指示に関してはBlender上で何かの操作をするとエディタの「情報」のところに、コマンドが出てきますので、それをスクリプトにコピペすれば同じ動きをします↓
なので最低限のことさえ覚えれば何とかなりそうです。
取得したい要素の上で右クリックをしても同様のデータパスを取得できます↓
書いたスクリプトは別シーンに読み込めば使いまわせるので便利です。
参考にした記事
[Blender×Python] アニメーションのつくりかた
Is there a list for Keyframe data_paths in Blender?
Keyframe a modifier value with python
[Python][random]小数の乱数を範囲付きで生成するには?
検証で作った映像
今回はオブジェクトの手書き感のあるノイズを追加するために、メッシュ自体にランダムに変形かけるとき使いました。全フレーム適当な値でキーフレーム打ってくれたらうれしいと思いました。
作った映像はこんな感じ。
LineArt機能と、グリースペンシルのノイズにモディファイアでも同様なことができますが、それだけだと動きが大雑把でランダム感が弱いのと、ほかのソフトでは再現できないので、今回のやり方を考えました。
線画はLineArtで生成したもの。LineArtのノイズモディファイアでも強弱を混ぜています。