2012-02-08 2 views
1

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; 

도움을 주셔서 감사합니다.

답변

0

내 모습이 좋아 보이는데, 각도가 다른 문제가있을 수 있습니까?

당신이 행동을 볼 수있는, 내 코드는 2 차원에 도달하는 것입니다 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(); 
     } 
    }