Quaternion을 사용하는 FPS 카메라가 기울어 지거나 엉망이되지 않도록하려면 어떻게해야합니까?


17

FPS와 같은 카메라를 사용하고 있으며 쿼터니언을 사용합니다. 그러나, 내가봤을 때 옆으로 가려고 할 때마다 기울어지고 때로는 뒤집어 질 수 있습니다. 이 문제를 어떻게 해결할 수 있습니까?


3
(7 시간 안에 자체 답변을 드리겠습니다) ...
Aeodyn 2016 년

답변:


16

쿼터니언을 요 / 피치 / 롤 앵글 세트로 분해 할 수 있지만 일반적으로 과도합니다.

다음과 같이 쿼터니언을 작성하는 대신 :

cameraOrientation = cameraOrientation * framePitch * frameYaw;

이 시도:

cameraOrientation = framePitch * cameraOrientation * frameYaw;

그러면 틸트 / 롤이 발생하지 않으며 요와 피치를 별도로 저장하는 것과 같습니다.


3
이. 이것이 바로 내가 찾던 것입니다. 하나의 라이너로 내 문제를 해결했습니다. 좋은!
aardvarkk

1
인가 framePitchframeYaw float유형? 또한, 첫 문장에 대해 좀 더 설명해 주셔서 감사합니다.
sirdank

1
@sirdank cameraOrientation, framePitchframeYaw모든 쿼터니언 (각 쿼터니언은 4 개의 부동 소수점 또는 두 배임 )입니다.
Dan

8

이것은 잠시 동안 발생한 문제이며 답을 찾을 수 없으므로 여기에 게시 할 것이라고 생각했습니다.

실제로는 매우 간단합니다. 회전을 수행하는 방법은 다음과 같습니다.

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;

왜 첫 번째 방법은 위아래로 원하는 현재 옆 방향에 대한 회전을 갖지만 옆으로 회전하는 것은 원하지 않기 때문에 두 번째 순서가 필요합니다.


나는 내 자신의 대답에 7 시간을 기다려야했다 ...
Aeodyn

죄송합니다. 스크린 샷으로 설명해 주시겠습니까? "1 차 주문"과 "2 차 주문"은 약간 혼동됩니다-감사합니다!
Atav32 2016 년

쿼터니언으로 작업 할 때는 항상 3D 회전과 마찬가지로 순서가 중요합니다. 이 예에서 "방향 * = newRotation"은 "방향 = 방향 * newRotation"과 같습니다. 그러나 왼쪽 및 오른쪽 회전으로 다른 방향으로 원합니다. 이로 인해 상하 기울기에 의존하지 않아 롤이 발생합니다.
Aeodyn

그러나 나는 4 분의 1 포인트가 짐벌 잠금을 피하고 회전이 모두 독립적이라는 것이었지만 교과서를 잘못 읽었을 수도 있습니다. 명확하게 말하면 회전 변환 순서를 반대로하면 카메라가 기울어지는 것을 방지 할 수 있습니까? 또는 요를 회전 할 때 롤 및 피치 변환을 수동으로 0으로 설정하고 있습니까?
Atav32 2016 년

5

FPS 카메라의 경우 일반적으로 롤을 원하지 않으며 +/- 90도 피치로 제한되므로 요 및 피치 각도를 사용하여 현재 상태를 추적합니다. 쿼터니언의 모든 힘은 실제로 이것에 도움이되지 않습니다.

쿼터니언 키 프레임 보간법 등을 사용하여 FPS 카메라와 애니메이션 카메라 간을 전환하려는 경우 요 / 피치 각도를 쿼터니언으로 또는 쿼터니언으로 변환 할 수 있습니다.


0

또 다른 간단한 트릭은 카메라를 GameObject에 배치하고 Yaw 회전으로 게임 오브젝트를 제어하고 자식 카메라는 Pitch 좌표로 구성하는 것입니다.

playerCameraHolder.transform.Rotate(0, rotationYaw, 0);
playerCamera.transform.Rotate(rotationPitch, 0, 0);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.