Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 这个矩阵在什么空间?_Python_Animation_Matrix_Space_Blender - Fatal编程技术网

Python 这个矩阵在什么空间?

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两者都不是!这不是一个局部矩阵: 位置不是本地的,而是全球的 但是轮换 矩阵在对象空间

在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