BlenderでMaterial nodesなどにキーフレームが打ってある場合はglTFでexportできないので、Blenderからキーフレームの値を取得してJSON出力してみました。
code
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名を渡せます。
使い方
- コードをBlenderの
Text Editor
にコピペ orOpen Text
で読み込みする - 取得したいキーフレームのオブジェクトを選択する
-
Run Script
ボタンを押してScriptを実行
すると、blendデータの同階層に以下のような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してから実行すれば全ての値が取れます🙆♀️
おしまい。