这个矩阵在什么空间?

2024-10-01 07:23:05 发布

您现在位置:Python中文网/ 问答频道 /正文

在blender2.6api中,PoseBone用于设置骨骼的动画。PoseBone.matrix公司是一种方法。API说PoseBone.matrix公司在“对象空间”中。在

http://www.blender.org/documentation/blender_python_api_2_63_5/bpy.types.PoseBone.html#bpy.types.PoseBone.matrix

在PoseBone.matrix公司我什么都没见过。 我还是不能让我的动画导入器工作。 怎么回事PoseBone.matrix?在blender2.4api中有两个矩阵:一个在局部空间,一个在电枢空间。在

但是新的PoseBone.matrix公司都不是!这不是一个局部矩阵:

enter image description here

位置不是局部的,而是全球性的。在

但是旋转 enter image description here

<Euler (x=1.5708, y=-0.7854, z=-0.0000), order='XYZ'> 

是的。在

那么API所说的“对象空间”是什么呢PoseBone.matrix公司在吗?在

我试图把我的电枢空间矩阵分配到一个层次的电枢,但我不能得到正确的结果。在

我试着分解我拥有的矩阵,撤消父循环,然后重新组合矩阵,然后将其设置为“PoseBone.matrix公司". 只是不起作用。在

^{pr2}$

Tags: 对象api空间公司动画矩阵局部matrix
2条回答

矩阵在对象空间中,它的行为应该像您期望的代码那样。现在的情况是,骨骼的矩阵在改变矩阵后并没有立即更新。到目前为止,我已经找到了一个黑客解决方案,在每根骨头之后更新整个场景

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=parentOS*boneLS

但正如你所注意到的-它没有给出正确的解决方案。骨骼仍然偏移。 我想到的一件事是,它被静止姿势变换抵消了,所以我试着把它向后滚动,但那也没用,但也许我用的方程是错的。在

下面是我如何计算姿势骨骼的局部空间变换(假设骨骼1是我感兴趣的骨骼,骨骼0是其父骨骼,而0没有父骨骼):

^{pr2}$

相关问题 更多 >