2011-10-25 3 views
6

저는 The Hazy Mind의 XNA 자습서를 읽었습니다. 위치 (Vector3)와 회전 (Quaternion)을 가진 기본 객체가 있습니다. 개체 모델이 튜토리얼의 카메라 구현에서이 Class Diagram블록의 6면을 회전합니다.

처럼, 내가 회전의 사본을 만들어 방법을 회전 및 개체에 그들을 구현했습니다 보인다

public virtual void Rotate(Vector3 axis, float angle) 
{ 
    axis = Vector3.Transform(axis, Matrix.CreateFromQuaternion(Rotation)); 
    Rotation = Quaternion.Normalize(Quaternion.CreateFromAxisAngle(axis, angle) * Rotation); 
} 

public virtual void Revolve(Vector3 target, Vector3 axis, float angle) 
{ 
    Vector3 revolveAxis = Vector3.Transform(axis, Matrix.CreateFromQuaternion(Rotation)); 

    Quaternion rotate = Quaternion.Normalize(Quaternion.CreateFromAxisAngle(revolveAxis, angle)); 

    Position = Vector3.Transform(Position - target, Matrix.CreateFromQuaternion(rotate)) + target; 

    Rotate(axis, angle); 
} 

내 블록 객체 (6)를 생성한다 Block rendered by 6 Quad objects

을 그리고 지금 우리가 내 블록에 회전을 호출, 실제 문제가 : 쿼드의 경우 각 쿼드 개체의 렌더링 메소드를 호출, 나는 각 쿼드에 할당 된 오프셋 및 회전이 질감 블록이처럼 보이는 형성해야 obj 요법은 객체 자체가 회전을 바꾸게하고 내 쿼드 객체가 회전하지 않으므로 내 Block 객체에 새로운 Rotate 함수를 구현했습니다.

public override void Rotate(Vector3 axis, float angle) 
{ 
    for (int i = 0; i < mySides.Length; i++) 
    { 
     Quad side = mySides[i]; 
     side.Revolve(this.Position, axis, angle); 
    } 
} 

이 그러나 여기에서 볼 수 있듯이 나에게 예상되는 결과를 제공하지 않았다 :

Block object rotated

잘못된 솔루션

다음 솔루션은 작동하지만 매우 일반적인 수 없으며 제한 될 것입니다 : 회전하려는 축을 확인한 다음 각면 (Quad 객체)을 올바른 방향으로 회전시키는 if 문이 있습니다.

적절한 솔루션

는 또한 나는 쿼드의 렌더링 블록 개체 (부모)의 회전에 따라 개체를 만들 수 있지만이 작업을 수행하는 방법에 대한 확신입니다.

세 번째 및 마지막 옵션은 Rotate 메서드가 각 Quad 개체 회전 및 위치를 올바른 값으로 업데이트하도록하는 것입니다.이 메서드는 잘 수행 할 방법이 확실하지 않습니다.

그래서 내가 무엇을 요구하고있어 이에 대한 몇 가지 아이디어 나 생각, 바람직하게는 시각적 인 방법으로, XNA에 쿼터니온을 사용하는 방법을 설명 아마도 몇 가지 링크 및/또는 자습서 인 질문. 귀하의 의견 :

답변

2
당신이 무엇을해야

, 당신이 언급을 기대

건배, 쿼드의 렌더링이 부모의 회전에 따라 개체를 확인합니다.

이것은 당신과 같은 hierachal 시스템을 사용하면 비교적 쉽습니다. 렌더러가 블록을 렌더링 할 때, 블록의 변환을 매트릭스에 저장해야합니다. BlockWorld으로 호출합니다. 각 쿼드를 렌더링하려면 Quad의 로컬 변환을 BlockWorld으로 곱하십시오.

관련 문제