2008-11-25 5 views
14

그래서 새로운 프로그래머를 지향하는 Quaternion 기반의 3D 카메라를 작성하여 통합하고 사용하기가 매우 쉽습니다.Quaternion 기반 3D 카메라는 Quaternions 또는 Euler 각을 축적해야합니까?

처음 개발할 때 사용자 입력을 오일러 각도로 가져온 다음 해당 프레임에 대한 입력을 기반으로 한 쿼터니온을 생성했습니다. 저는 카메라의 쿼터니언을 취하여 입력을 위해 생성 한 것에 곱합니다. 그리고 이론 상으로는 입력 회전을 카메라 회전의 현재 상태에 추가하면 모든 것이 뚱뚱하고 행복 할 것입니다. Quaternions를 저장하고 추가하기 때문에 Quaternions를 축적하십시오.

그러나이 방법에 문제가 있음을 발견했습니다. 필자가 오일러 ​​각도를 1 회전 만하더라도 더 많이 사용할수록 Yaw라고 말하면 일부 반복에서는 피치라고 불리는 피어싱이 반복됩니다. 그것은 사소했지만 꽤 용납 될 수없는 것이 었습니다.

나는 오일러 각을 축적하는 것이 더 낫다는 기사를 발견 했으므로 카메라는 오일러 각으로 현재 회전을 저장하고 입력은 각 프레임에 간단히 추가됩니다. 그런 다음 회전 매트릭스를 생성하는 데 사용되는 각 프레임에서 쿼터니온을 생성합니다. 그리고 이로 인해 부적절한 축으로의 회전 출혈 문제가 해결되었습니다.

그래서 어떤 Stackoverflow 회원이이 문제에 대한 통찰력을 가지고 있습니까? 그것은 일을하는 올바른 방법입니까?

답변

12

곱셈 쿼터니언은 부동 소수점 올림 문제 (45도와 같은 단순한 각도조차도 정확하지 않을 수도 있음)의 누적으로 인해 어려움을 겪습니다. 회전을 합성하는 가장 좋은 방법이지만, 각 쿼터니언 구성 요소의 정밀도는 시간이 지남에 따라 떨어집니다. 블리드 스루는 한 가지 부작용입니다. 시각적으로 나쁜 것은 쿼터니언이 스케일 팩터를 통합하기 시작할 수 있다는 것입니다.이를 복구하려면 어떤 경우에도 오일러 각도로 다시 정규화해야합니다. 고정 소수점 오일러 각은 반올림을 누적하지 않습니다.

프레임 당 쿼터니온을 다시 계산하는 것은 최소한입니다. 나는 그것을 최적화하려고 노력하지 않을 것이다. 정확도를 되찾기 위해 재 정규화되기 전에 아마 몇 쿼터니언을 축적 할 수는 있지만 실제로 노력할 가치는 없습니다.

+0

변환 행렬 접근법도 마찬가지이며 오일러 각 기반 쿼터니온 클래스 (몇 줄만)에 연산 카운터를 추가하는 것은 그리 많은 노력이 아닙니다. btw 나는 원하는 변환 효과로 조금 엉망이 될 수 있기 때문에 너무 자주 정규화하지 않는 것이 좋습니다. 나는 보통 모든 64-128 작업을 정상화합니다. – Spektre

+0

_ "이를 복구하려면 어떤 경우에도 오일러 각도로 다시 정규화해야합니다."_ - 이것은 전혀 사실이 아닙니다. 스케일 팩터는 쿼터니언 – Eric

1

나는 둘 다 주장했다. 내 생각에 당신이 처리해야 할 실질적인 질문은 카메라 시스템의 유연성입니다. IMO yaw는 일반적으로 3 인칭 뷰에서 더 재미 있습니다 (캐릭터의 세로 축을 중심으로 회전하기 때문에). 당신은 틀림없이 1 인칭 시점에서 수직선을 "틀"수 있지만, 실제로는 똑같은지 확신 할 수 없습니다.

그러나 프레임 당 쿼터니언을 다시 계산하는 것은 낭비라고 생각합니다. 최신 쿼터니언을 저장하고 프레임에 입력이있는 경우 더러운 것으로 표시하는 것이 더 좋을까요?

+0

오일러 각도와 쿼터니온을 모두 저장하고 쿼터니언 if 회전 행렬을 저장해야하며, 업데이트가 필요한 경우 새로운 Quaternion을 통해 업데이트해야합니다. 이것은 물체의 회전에 더 중요하지만 카메라가 자주 바뀔 것입니다. – Adam

4

누적은 부정확 한 프로세스입니다. 증분 회전을 많이 누적하면 쿼터니언 또는 행렬을 사용하여 반올림 오류가 누적됩니다.

나는 다음과 같이 상상한다 : 코드를 작성하고 실행하지만 일정한 양의 탐색 후에 카메라가 성가신 이상으로 뒤틀리는 것을 발견했다. 사전에 생각하지 않은 불변성을 위반했다. 실제로, 당신은 이 회전을 축적하는을 원하지 않는다는 것을 깨달았습니다. 대신에 다른 것을하고 싶습니다.

숫자 정확도 문제보다 인터페이스 디자인 문제로 더 많이 볼 수 있습니다.기본적으로 사람들은 카메라가 피치, 요, 롤에 따라 탐색 할 것을 기대하므로 각도를 직접 제어하고 표현하도록 선택하면 많은 문제를 피할 수 있습니다.

여기서 불친절한 점은 quaterions가 중복되는 것처럼 보입니다 (이 특정 용도로는 적어도). 그래도 쿼터니언이 필요합니다. 원시 피치/요/롤 각도로 보간하는 것은 추악 할 수 있습니다. 다시 말하지만 인터페이스 디자인 문제입니다. 쿼터니언이 필요한 위치와 그 위치를 알아 내야합니다.