如何在Blender 2.5中将全局坐标转换为局部坐标?

1 投票
1 回答
6532 浏览
提问于 2025-04-17 00:00

我想用下面的脚本在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函数。

撰写回答