Родительско-дочерняя матричная цепочка / иерархия заказов - PullRequest
1 голос
/ 08 февраля 2012

Я пытаюсь создать структуру Bone в XNA C #.

Я пытаюсь достичь этого с помощью отношений родитель-ребенок с матрицами.Когда я поворачиваю родителя, ребенок должен вращаться таким же образом ...

В данный момент это работает нормально, но при выполнении процедуры 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 голосов
/ 09 февраля 2012

Мне кажется, у вас должны быть другие проблемы, может быть, с углами?

Это мой код для доступа к нему в 2D, вы можете посмотреть его в действии здесь

    //------------------------------------------------------------------------------------
    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( );
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...