2008年10月8日水曜日

blender - python でのPoseとActionとIpo

IK付いてるボーンがあったとして、それのtargetだけにキーを打ったものから、
chainlenで関連しているボーン全てに、targetのキーと同じタイミングに、キーを打ちたいんです。

このようにして、chainlenで関連してるボーンと、IKtargetを、Poseとして取得できます。

# ----------------------------------
# return ik related bones
# [ [ armature, [targets], [chanedBones]], ...]
# ----------------------------------
def getIKChains():
ikChains = []
scene = Blender.Scene.GetCurrent()
armatures = [ob for ob in scene.objects if ob.type == 'Armature']

for arm in armatures:
pose = arm.getPose()
for boneName in pose.bones.keys():
bone = pose.bones[boneName]
for con in bone.constraints:
if con.type == Constraint.Type.IKSOLVER:
targets = []
chainedBones = []

targets.append(
pose.bones[con[Constraint.Settings.BONE]])

clen = con[Constraint.Settings.CHAINLEN]
ikBone = bone;
chainedBones.append(ikBone)
for i in range(clen):
chainedBones.append(ikBone.parent)
ikBone = ikBone.parent

ikChains.append([arm, targets, chainedBones])

return ikChains

# debug
for chain in getIKChains():
for i in range(len(chain)):
arm = chain[0]
target = chain[1]
bones = chain[2]
print arm
print target
print bones



・・・・が、BlenderのPythonAPIでは、PoseとActionの関連付けを調べることがどうやっても出来ないのではないかと思うんです。

なんのこっちゃって感じですが、これがアニメーションのエクスポートに非常に重要で、まともにアニメーション吐けるスクリプトが無い最大の原因ではないかと思っています。

内部のコードでは、ActionChannelからPoseChannelにできます。Pythonではこれが無いんです。PoseからIpoを取得することもできませんし、ActionからIpoを取得しても対応するPoseは分かりません。

どなたかご存知でしたら、教えてください。

ということで、結局内部組込みのエクスポーターで処理することに。
Python以外にも、拡張する方法(DLLとかかな?)があるらしいんだけど、そっち調べても結局できなかったら意味ないし。
確実に出来る方法を取らないと、いくら時間あっても足りねえ。

0 件のコメント: