父子矩阵链接/顺序层次结构

时间:2012-02-08 12:36:59

标签: c# matrix xna

我正在尝试在XNA C#中创建一个Bone结构。

我试图通过与矩阵的亲子关系来实现这一点。当我旋转父母时,孩子应该以相同的方式旋转......

目前这种方法很好,但是当在骨头上执行IK例程时,一切都很疯狂。

有人可以查看我的代码吗?向量中的ID 0是父级,1是子级偏离父级的52个单位...

        _boneList[0]._position = new Vector3(0, 0, 0);
        _boneList[0]._localTransform = _boneList[0]._rotationTransform * Matrix.CreateTranslation(_boneList[0]._position);
        _boneList[0]._globalTransform = _boneList[0]._localTransform;


        _boneList[1]._position = new Vector3(0, 52, 0);
        _boneList[1]._localTransform =  _boneList[1]._rotationTransform * Matrix.CreateTranslation(_boneList[1]._position);
        _boneList[1]._globalTransform = _boneList[1]._localTransform * _boneList[0]._globalTransform;

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

对我来说看起来很好,你应该有其他问题,也许是角度?

这是我在2D中获取它的代码,您可以在行动here

中观看它
    //------------------------------------------------------------------------------------
    public void UpdateLocal( )
    {  
        Vector2 traslation = Translator.GetValue();
        float rotation = Rotator.GetValue();
        Vector2 scale = Scalator.GetValue();

        Matrix mTraslation, mRotation, mScale;
        Matrix.CreateTranslation( traslation.X, traslation.Y, 0, out mTraslation );
        Matrix.CreateRotationZ( rotation, out mRotation );
        Matrix.CreateScale(scale.X, scale.Y, 1 , out mScale );
        Matrix.Multiply( ref mScale, ref mRotation, out Local );
        Matrix.Multiply( ref Local, ref mTraslation, out Local );  
    }


    //---------------------------------------------------------------------------------
    protected virtual void SpecialUpdateTransformTopToDown( )
    {            
        UpdateLocal( );

        if ( Parent != null )
        {
             Matrix.Multiply( ref Local, ref (Parent as BoneData).Absolute, out Absolute );
        }
        else
        {
            Absolute = Local;
        }

        foreach ( BoneData child in _children.OfType<BoneData>() )
        {
            child.SpecialUpdateTransformTopToDown( );
        }
    }