저는 The Hazy Mind의 XNA 자습서를 읽었습니다. 위치 (Vector3)와 회전 (Quaternion)을 가진 기본 객체가 있습니다. 개체 모델이 튜토리얼의 카메라 구현에서이 블록의 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)를 생성한다
을 그리고 지금 우리가 내 블록에 회전을 호출, 실제 문제가 : 쿼드의 경우 각 쿼드 개체의 렌더링 메소드를 호출, 나는 각 쿼드에 할당 된 오프셋 및 회전이 질감 블록이처럼 보이는 형성해야 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);
}
}
이 그러나 여기에서 볼 수 있듯이 나에게 예상되는 결과를 제공하지 않았다 :
잘못된 솔루션
다음 솔루션은 작동하지만 매우 일반적인 수 없으며 제한 될 것입니다 : 회전하려는 축을 확인한 다음 각면 (Quad 객체)을 올바른 방향으로 회전시키는 if 문이 있습니다.
적절한 솔루션
는 또한 나는 쿼드의 렌더링 블록 개체 (부모)의 회전에 따라 개체를 만들 수 있지만이 작업을 수행하는 방법에 대한 확신입니다.
세 번째 및 마지막 옵션은 Rotate 메서드가 각 Quad 개체 회전 및 위치를 올바른 값으로 업데이트하도록하는 것입니다.이 메서드는 잘 수행 할 방법이 확실하지 않습니다.
그래서 내가 무엇을 요구하고있어 이에 대한 몇 가지 아이디어 나 생각, 바람직하게는 시각적 인 방법으로, XNA에 쿼터니온을 사용하는 방법을 설명 아마도 몇 가지 링크 및/또는 자습서 인 질문. 귀하의 의견 :