半年ぶりの Blender なのですが…はい。今回はだいぶ苦戦していまして、機能ができていません。まずキーフレームのデータを取得するという行為そのものが相当面倒だったのですよ。
キーフレームがどこにあるのかと言えば、ココ。ドープシートの中です。
そこで、当初はドープシートのクラスを探す→所属するグループを検索→所属するキーフレームを取得…という手順を踏むと思っていたのですよねえ。
ところが、実際の手順はシーンからオブジェクトを取得→オブジェクトのアクションデータからFカーブ情報を取得する→所属するキーフレームを取得するという手順を取ります。
尚、主にアニメーションで使うアーマチュアオブジェクトには、所属するボーンがあり、実際には各ボーンに対して動きをつけていますが、オブジェクト→ボーン→Fカーブという取得の順にはならないようです。
これは、そもそもオブジェクト単体に対してキーを打って動作ができる点や、ライトやカメラ等の他のオブジェクトと足並みを揃えた為のようですね。
コード
import bpy
import re
if bpy.context.mode == 'POSE':
for obj in bpy.context.scene.objects:
#print(obj.name)
if obj.type != 'ARMATURE':
continue
bSelectd = False
frameStart = 0.0
frameEnd = 0.0
for fc in obj.animation_data.action.fcurves:
for ky in fc.keyframe_points:
if ky.type != 'KEYFRAME':
continue
if ky.select_control_point != True:
continue
if bSelectd == False:
frameStart = ky.co[0]
frameEnd =ky.co[0]
bSelectd = True
else:
if ky.co[0] < frameStart:
frameStart = ky.co[0]
if ky.co[0] > frameEnd:
frameEnd = ky.co[0]
bonename = fc.data_path
# bonename only
#if fc.data_path.count('"') == 2:
# bonename = re.search(r'"(.+)"',bonename).group(1)
print(bonename+"/idx:"+str(fc.array_index)+"/frame:"+str(ky.co[0]).rjust(6,' ')+"/pram:"+str(ky.co[1]))
if bSelectd == False:
print("No Selected")
else:
print("SelectStart:"+str(frameStart).rjust(6,' ')+"/SelectEnd:"+str(frameEnd).rjust(6,' '))
※インデントが崩れた為、字を小さくしています。コピペして読んでください。
コメントアウトした bonename only の部分は外すとボーン名のみになります。
結果はなんの変哲も無い出力ですね。
…こんなものを作るのに数ヶ月かかってしまった…。そもそもパイソンを忘れかけていたという恐怖…歳は取りたくない物ですねえ。
0 件のコメント:
コメントを投稿