2012-02-08 3 views
1

Я пытаюсь создать структуру 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; 

Благодарим Вас за помощь.

ответ

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(); 
     } 
    } 
Смежные вопросы