답변:
쿼터니언을 요 / 피치 / 롤 앵글 세트로 분해 할 수 있지만 일반적으로 과도합니다.
다음과 같이 쿼터니언을 작성하는 대신 :
cameraOrientation = cameraOrientation * framePitch * frameYaw;
이 시도:
cameraOrientation = framePitch * cameraOrientation * frameYaw;
그러면 틸트 / 롤이 발생하지 않으며 요와 피치를 별도로 저장하는 것과 같습니다.
framePitch
및 frameYaw
float
유형? 또한, 첫 문장에 대해 좀 더 설명해 주셔서 감사합니다.
cameraOrientation
, framePitch
및 frameYaw
모든 쿼터니언 (각 쿼터니언은 4 개의 부동 소수점 또는 두 배임 )입니다.
이것은 잠시 동안 발생한 문제이며 답을 찾을 수 없으므로 여기에 게시 할 것이라고 생각했습니다.
실제로는 매우 간단합니다. 회전을 수행하는 방법은 다음과 같습니다.
currentDirection * newRotation;
그러나 이와 같이하는 것도 효과가 없습니다.
newRotation * currentDirection;
당신이해야 할 일은 첫 번째 순서로 위와 아래 회전을하고 두 번째 순서로 옆으로 회전을하는 것입니다.
저에게는 다음과 같습니다.
if (keyboard.IsKeyDown(Keys.Up))
Direction = Direction * Quaternion.CreateFromAxisAngle(new Vector3(1, 0, 0), TurnSpeed);
if (keyboard.IsKeyDown(Keys.Down))
Direction = Direction * Quaternion.CreateFromAxisAngle(new Vector3(-1, 0, 0), TurnSpeed);
if (keyboard.IsKeyDown(Keys.Left))
Direction = Quaternion.CreateFromAxisAngle(new Vector3(0, 0, 1), TurnSpeed) * Direction;
if (keyboard.IsKeyDown(Keys.Right))
Direction = Quaternion.CreateFromAxisAngle(new Vector3(0, 0, -1), TurnSpeed) * Direction;
왜 첫 번째 방법은 위아래로 원하는 현재 옆 방향에 대한 회전을 갖지만 옆으로 회전하는 것은 원하지 않기 때문에 두 번째 순서가 필요합니다.