쿼터니언 기반 3D 카메라는 쿼터니언 또는 오일러 각도를 축적해야 합니까?

StackOverflow https://stackoverflow.com/questions/319189

문제

그래서 저는 새로운 프로그래머를 대상으로 하는 쿼터니언 기반 3D 카메라를 작성하여 그들이 통합하고 사용하기가 매우 쉽습니다.

개발하는 동안 처음에는 사용자 입력을 오일러 각도로 가져온 다음 해당 프레임의 입력을 기반으로 쿼터니언을 생성했습니다.그런 다음 카메라의 쿼터니언을 가져와 입력에 대해 생성한 값으로 곱합니다. 이론적으로는 카메라 회전의 현재 상태에 입력 회전을 추가하기만 하면 모든 것이 뚱뚱하고 행복해질 것입니다.이것을 호출하자:쿼터니언만 저장하고 추가하기 때문에 쿼터니언을 누적합니다.

그런데 이 방법에 문제가 있다는 것을 깨달았습니다.더 많이 사용할수록 하나의 오일러 각도(예: Yaw)로만 회전하더라도 일부 반복을 통해 다른 각도(예: 피치)로 출혈이 시작됩니다.그것은 경미했지만 받아들일 수 없는 수준이었습니다.

그래서 좀 더 조사한 결과 오일러 각도를 축적하는 것이 더 낫다는 기사를 찾았습니다. 따라서 카메라는 현재 회전을 오일러 각도로 저장하고 각 프레임에 입력이 추가됩니다.그런 다음 각 프레임에서 쿼터니언을 생성하고, 이는 다시 회전 행렬을 생성하는 데 사용됩니다.그리고 이는 부적절한 축으로의 회전 출혈 문제를 해결했습니다.

그렇다면 Stackoverflow 회원 중에 이 문제에 대한 통찰력을 갖고 있는 사람이 있습니까?그게 올바른 일을 하는 방법인가요?

도움이 되었습니까?

해결책

Quaternions를 곱하면 부동 소수점 라운드 오프 문제가 축적 될 것입니다 (45도와 같은 간단한 각도조차도 정확하지 않습니다). 복합 회전을위한 좋은 방법이지만 각 쿼터니언 구성 요소의 정밀도는 시간이 지남에 따라 떨어질 것입니다. 블리드 스루는 하나의 부작용입니다. 시각적으로 더 나쁜 것은 쿼터니언이 스케일 팩터를 통합하기 시작할 수 있다는 것이 시각적으로 더 나빠집니다. 회복하기 위해서는 어떤 경우에도 오일러 각도로 다시 재정식해야합니다. 고정 점 오일러 각도는 라운드 오프를 축적하지 않을 것입니다.

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

다른 팁

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

나는 다음과 같은 것을 상상한다:코드를 시작하고 실행했지만 어느 정도 탐색한 후 카메라가 성가시게 기울어지는 것을 발견했습니다. 즉, 사전에 생각하지 못했던 불변성을 위반하는 것입니다.실제로, 당신은 그렇지 않다는 것을 깨달았습니다. 원하다 회전을 축적하기 위해;대신에 다른 일을 하고 싶어합니다.

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

여기서 당황스러운 점은 쿼터리온이 중복된 것 같다는 것입니다(적어도 이 특정 용도에서는).하지만 여전히 쿼터니언을 원합니다. 원시 피치/요/롤 각도로 보간하는 것은 보기 흉할 수 있습니다.다시 말하지만, 인터페이스 디자인에 관한 질문입니다.쿼터니언이 필요한 위치와 이를 가져오고 내보내는 방법을 파악해야 합니다.

나는 둘 다 논쟁을 보았다. 당신이 다루어야 할 실제 질문은 카메라 시스템의 유연성이라고 생각합니다. IMO Yaw는 일반적으로 3 인칭 시점에서 더 흥미 롭습니다 (캐릭터의 수직 축에 대해 회전하기 때문에). 1 인칭 시야에서도 수직 주위를 "요"할 수도 있지만, 그것이 실제로 같은 것이라고 확신하지 못합니다.

그러나 나는 그것이 프레임당 당신의 쿼터니언을 다시 계산하는 것이 일종의 폐기물이라고 생각합니다. 아마도 프레임이 입력을받는 경우 최신 쿼터니언을 저장하고 더럽게 표시하는 것이 더 나을까요?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top