如何在Blender 2.5中将全局坐标转换为局部坐标?
我想用下面的脚本在Blender 2.5中移动一个骨骼
bpy.context.object.pose.bones['hand_ik.L'].location=(X1,Y1,Z1)
但是我有全局坐标(X2,Y2,Z2)。我该如何通过矩阵运算把X2,Y2,Z2转换成对应的X1,Y1,Z1呢?
我想要实现和下面一样的移动效果
bpy.ops.transform.translate(value=(X2,Y2,Z2),const raint_orientation='GLOBAL')
我发现用以下代码可以移动一个没有父级的骨骼
ob = bpy.context.object
globalVector = Vector((1.0, 0.0, 0.0))
mw = bpy.data.armatures['Armature'].bones['hand_IK.R'].matrix.copy()
bpy.context.object.pose.bones['hand_IK.R'].location = mw.inverted()*globalVector
但是当一个骨骼有父级并且没有连接时该怎么办呢?
谢谢
1 个回答
1
几周前,PoseBose.matrix(骨骼的骨架空间矩阵)的写入权限被开放给了Python API。如果你使用的是2.59版本或更新的版本,你可以用下面这样的代码:
from mathutils import Matrix
ob = bpy.context.object
globalVector = Vector((1.0, 0.0, 0.0))
mw = bpy.data.armatures['Armature'].bones['hand_IK.R'].matrix.copy()
obGlobal = ob.matrix_world
bpy.context.object.pose.bones['hand_IK.R'].matrix = ob.matrix_world.inverted()*(Matrix.Translation(globalVector)+mw.to_3x3().to_4x4())
将维度转换为3再转换回4,这样可以清除原来的位移,然后你再加入你的globalVector,并把整个矩阵反转,这样就能考虑到物体的全局矩阵。
如果你想看一些关于操作骨骼的好代码示例,可以看看我为动作捕捉制作的Blender插件,在这里,查看retargetEndUser中的bakeTransform函数。