Python 这个矩阵在什么空间?
在Blender 2.6 API中,PoseBone用于设置骨骼动画。PoseBone.matrix是一种方法。API称PoseBone.matrix位于“对象空间” PoseBone.matrix我什么都没见过。 我仍然无法让我的动画导入器工作。 PoseBone和matrix有什么关系?在Blender 2.4 API中有两个矩阵:一个在局部空间,一个在电枢空间 但是新的PoseBone.matrix两者都不是!这不是一个局部矩阵: 位置不是本地的,而是全球的 但是轮换Python 这个矩阵在什么空间?,python,animation,matrix,space,blender,Python,Animation,Matrix,Space,Blender,在Blender 2.6 API中,PoseBone用于设置骨骼动画。PoseBone.matrix是一种方法。API称PoseBone.matrix位于“对象空间” PoseBone.matrix我什么都没见过。 我仍然无法让我的动画导入器工作。 PoseBone和matrix有什么关系?在Blender 2.4 API中有两个矩阵:一个在局部空间,一个在电枢空间 但是新的PoseBone.matrix两者都不是!这不是一个局部矩阵: 位置不是本地的,而是全球的 但是轮换 矩阵在对象空间
矩阵在对象空间中,它的行为应该与您从代码中期望的一样。发生的情况是,骨骼的矩阵在更改矩阵后不会立即更新。到目前为止,我已经找到了一个黑客解决方案,可以在每一根骨头上都更新整个场景
bpy.context.scene.update()
编辑:
我找到了将这些对象空间转换为骨骼局部空间的解决方案
长话短说——下面是一段完成该任务的代码片段:
poseBone = C.object.pose.bones[2] # <----- set your bone here
# poseBone.matrix is in object space - we need to convert it to local space
if poseBone.parent is not None:
parentRefPoseMtx = poseBone.parent.bone.matrix_local
boneRefPoseMtx = poseBone.bone.matrix_local
parentPoseMtx = poseBone.parent.matrix
bonePoseMtx = poseBone.matrix
boneLocMtx = ( parentRefPoseMtx.inverted() * boneRefPoseMtx ).inverted() * ( parentPoseMtx.inverted() * bonePoseMtx )
else:
boneRefPoseMtx = poseBone.bone.matrix_local
bonePoseMtx = poseBone.matrix
boneLocMtx = boneRefPoseMtx.inverted() * bonePoseMtx
loc, rot, scale = boneLocMtx.decompose()
你真的在剧本上试过吗?下面是一个脚本示例,混合不起作用。你能删除你答案中实际上不是答案的部分吗?你不应该在回答线程中提问。你在什么地方找到了这个问题的答案了吗?请和我分享一下好吗?
bpy.context.scene.update()
poseBone = C.object.pose.bones[2] # <----- set your bone here
# poseBone.matrix is in object space - we need to convert it to local space
if poseBone.parent is not None:
parentRefPoseMtx = poseBone.parent.bone.matrix_local
boneRefPoseMtx = poseBone.bone.matrix_local
parentPoseMtx = poseBone.parent.matrix
bonePoseMtx = poseBone.matrix
boneLocMtx = ( parentRefPoseMtx.inverted() * boneRefPoseMtx ).inverted() * ( parentPoseMtx.inverted() * bonePoseMtx )
else:
boneRefPoseMtx = poseBone.bone.matrix_local
bonePoseMtx = poseBone.matrix
boneLocMtx = boneRefPoseMtx.inverted() * bonePoseMtx
loc, rot, scale = boneLocMtx.decompose()
boneOS = C.object.pose.bones[2].matrix
parentBoneOS = C.object.pose.bones[2].parent.matrix
boneRP = C.object.pose.bones[2].bone.matrix_local # rest pose matrix in bone local space
parentBoneRP = C.object.pose.bones[1].bone.matrix_local # parent bone's rest pose matrix in bone local space
boneLS = ( parentBoneRP * boneRP ).inverted() * parentOS.inverted() * boneOS