2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Blender】【Python】キーフレームをJSON出力する

Posted at

BlenderでMaterial nodesなどにキーフレームが打ってある場合はglTFでexportできないので、Blenderからキーフレームの値を取得してJSON出力してみました。

code

exportKeyframesJson.py
import bpy
import math
import json
import os

def exportKeyframesJson(action_name):
    keyframes = {}
    action = bpy.data.actions[action_name]
    fileDir = os.path.dirname(bpy.data.filepath)
    
    if action is not None and action is not None:
        for fcu in action.fcurves:
            transformType = fcu.data_path + '_' +str(fcu.array_index)
            keyframes[transformType] = {}
            for keyframe in fcu.keyframe_points:
                keyframes[transformType][math.ceil(keyframe.co[0])] = keyframe.co[1]
    
    with open(fileDir + '/keyframes.json', 'w') as f:
        json.dump(keyframes, f, indent=2)


selectedObj = bpy.context.selected_objects

# material node action
exportKeyframesJson(selectedObj[0].data.materials[0].node_tree.animation_data.action.name)

exportKeyframesJsonはざっくり言うとキーフレームの情報をDictionary(Pythonのデータ)にして、それをJSONに変換して書き出すという処理の関数です。

その関数にBlenderのaction名を引数で渡します。

# material node action
exportKeyframesJson(selectedObj[0].data.materials[0].node_tree.animation_data.action.name)

今回は引数に選択したオブジェクトのMaterial Nodeのaction名を渡しています。

# object action
exportKeyframesJson(selectedObj[0].animation_data.action.name)

上記のようにすると選択したオブジェクトのaction名を渡せます。

使い方

  1. コードをBlenderのText Editorにコピペ or Open Textで読み込みする
  2. 取得したいキーフレームのオブジェクトを選択する
  3. Run Scriptボタンを押してScriptを実行

すると、blendデータの同階層に以下のようなkeyframes.jsonが出力されます。

keyframes.json
{
  "nodes[\"Mapping\"].inputs[1].default_value_0": {
    "1": 0.0,
    "57": 2.0
  },
  "nodes[\"Mapping\"].inputs[1].default_value_1": {
    "1": 0.0,
    "57": 0.0
  },
  "nodes[\"Mapping\"].inputs[1].default_value_2": {
    "1": 0.0,
    "57": 0.0
  },
  "nodes[\"Mapping\"].inputs[2].default_value_0": {
    "1": 0.0,
    "57": 1.5707963705062866
  },
  "nodes[\"Mapping\"].inputs[2].default_value_1": {
    "1": 0.0,
    "57": 0.0
  },
  "nodes[\"Mapping\"].inputs[2].default_value_2": {
    "1": 0.0,
    "57": 0.0
  }
}

第一階層の変数名("nodes[\"Mapping\"].inputs[1].default_value_0"などの部分)はプロパティ(Location、Rotation、Scaleとか)が入っています。
最後の数字はプロパティのインデックスを表していて、以下のようにそれぞれx y z となっています。

Index 座標
0 x
1 y
2 z

第一階層の値のオブジェクト({"1": 0.0, "57": 2.0}などの部分)は変数名の方はフレーム、値の方はそのキーフレームの値が入っています。

アニメーションをbakeしてから実行すれば全ての値が取れます🙆‍♀️

おしまい。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?