5

Blender 2.6 API では、ボーンのアニメーションに PoseBone が使用されます。PoseBone.matrix はそれを行う 1 つの方法です。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 との取引は何ですか? Blender 2.4 API では、2 つの行列がありました。1 つはローカル空間に、もう 1 つはアーマチュア空間にありました。

しかし、新しい PoseBone.matrix はそのどちらでもありません! これはローカル マトリックスではありません。

ここに画像の説明を入力

位置はローカルではなく、グローバルです。

しかし回転 ここに画像の説明を入力

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

は。

では、API が PoseBone.matrix があると言っているこの「オブジェクト空間」とは何でしょうか?

アーマチュア空間行列を階層アーマチュアに割り当てようとしていますが、正しく取得できません。

「PoseBone.matrix」として設定する前に、親の回転を元に戻し、マトリックスを再構成して、私が持っているマトリックスを分解しようとしました。うまくいきません。

oldmatrix = myMatrix
loc, rot, scale = oldmatrix.decompose()

#rot = rot * pose.bones[bonename].parent.rotation_quaternion.conjugated()
for i in pose.bones[bonename].parent_recursive:
   rot = rot * i.conjugated()

newmatrix = rot.to_matrix().to_4x4()

newmatrix[0][3] = loc.x
newmatrix[1][3] = loc.y
newmatrix[2][3] = loc.z

pose.bones[bonename].matrix = newmatrix 
4

2 に答える 2

2

EDIT : これらのオブジェクト スペース変換をボーン ローカル スペースに変換するソリューションを見つけました。

簡単に言うと、そのタスクを実行するコード スニペットを次に示します。

    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 = 親OS * boneLS

しかし、お気づきのように、正しい解決策は得られません。ボーンはまだオフセットされています。一つ気になったのは、静止ポーズ変換でオフセットされているので、ロールバックしてみましたが、それでもうまくいきませんでした。使用した方程式が間違っていたのかもしれません。

ポーズ ボーンのローカル空間変換を計算しようとした方法を次に示します (ボーン 1 が関心のあるボーンであり、ボーン 0 がその親であり、その 0 には親がないと仮定します)。

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
于 2013-05-28T21:30:53.077 に答える
0

マトリックスはオブジェクト空間にあり、コードから期待されるように動作するはずです。何が起こっているかというと、マトリックスを変更した直後にボーンのマトリックスが更新されていないということです。これまでのところ、すべてのボーンの後にシーン全体を更新するハックソリューションを見つけました

bpy.context.scene.update()
于 2013-04-13T11:51:59.547 に答える