[簡単]blenderでPythonを使って楽しよう後編_その2

blender2.82使用




「簡単」というからにはこれは外せない。
Pythonでプロパティにキーフレームを打つ方法です。
プロパティにキーを打つのは基本アクティブオブジェクト一つにしかできません。
トランスフォームのキーフレームの様にいっぺんに設定するわけにはいかないのです。
そこでfor文を使って複数のオブジェクトにキーを打とうという訳です。












プロパティにキーフレームを打つコマンド
実際にやってみましょう。
なお過去記事にてPythonコンソールのオートコンプリートにCTRL+SPACEを割り振ってあります。
動画にあった通り
bpy.context.object.keyframe_insert(data_path)でプロパティにキーを打つ事が出来ます。
data_pathの部分はプロパティの所で右クリックして「データパスをコピー」して""の中に貼り付けてください。
(今回の場合bpy.context.object.keyframe_insert("hide_viewport"))

またオプションなので省略できますがキーを打つフレームもframe=で指定できます。
bpy.context.object.keyframe_insert("hide_viewport",frame=bpy.context.scene.frame_current + 1)こんな感じで実行すると現在のフレーム+1の場所にキーを打つ事が出来ます。ストレートに数字で指定しても良いですし、変数も使えます。

ついでなのでサンプリングなどのシーン設定にもキーを打ってみましょうか。

シーンは流石にcontext.objectでは打てないのが分かるでしょう。
情報ウィンドウで調べます。
調べた結果bpy.context.sceneでした。
後は同じ様にkeyframe_insertを使いデータパスをコピーしてキーを打つ事が出来ます。

キーフレームの削除もkeyframe_insertをkeyframe_deleteに変えるだけで後は同じですがキーがないとエラーが出ます。









Pythonスクリプトを書く
コマンドは分かったのでスクリプトを書きましょう。

import bpy
for i in bpy.context.selected_objects:
    i.keyframe_insert("hide_viewport")
    if i.hide_viewport == True:
        i.hide_viewport = False
    else:
        i.hide_viewport = True
    i.keyframe_insert("hide_viewport",frame = bpy.context.scene.frame_current + 1)

無駄にif文を使ってしまいました。
これは選択したオブジェクトに対して「ビューポートで表示」にキーを打ち、次に「ビューポートで表示」のチェックを反転させて現在の次のフレームにキーを打つものです。
(よく考えたら非表示のオブジェクトは選択できないのでbpy.context.selected_objectsでは意味がない・・・)





この方法はリジッドボディでも使えます。
リジッドボディを続きから再開する方法でも紹介しましたがアニメのチェックにキーを打つ事でアニメーションを反映させて物理演算を行わせる事が出来ます。




リジッドボディ自体は「オブジェクト」→「リジッドボディ」から一括で適用したり、アクティブから設定をコピーできますが、アニメーションまではコピーされません。なので複数のオブジェクトのリジッドボディにキーを打つ時には是非活用してください。

import bpy
for i in bpy.context.selected_objects:
    if i.type == "MESH":
        if i.rigid_body:
            i.rigid_body.kinematic = True
            i.keyframe_insert("rigid_body.kinematic")
            i.rigid_body.kinematic = False
            i.keyframe_insert("rigid_body.kinematic",frame = bpy.context.scene.frame_current + 1)


今回のスクリプトではまずオブジェクトタイプをメッシュに限定して他の種類のオブジェクトは処理しないようにしてエラーを防ぎました。
次のif i.rigid_body:はオブジェクトにリジッドボディが設定してあるか調べるために書きました。
これでリジッドボディが設定されていないオブジェクトが選択されてもエラーになりません。

という訳で、キーフレームを打つ方法はいかがだったでしょうか?
大量のオブジェクトは数行のスクリプトで処理できるので是非活用しましょう。