2013-03-26 3 views
2

구면의 한 점에 중심을 둔 3D 카메라가 있습니다. 그것은 구의 기둥을 제외하고는 그 주위를 완벽하게 따라 다니고 회전합니다. 구체는 실제로 위치 좌표를 쉽게 관리 할 수 ​​있도록 구형으로 투영 된 입방체입니다.구형 극을 감싸고있는 카메라

물체가 구 주위로 수평으로 움직이면 카메라는 의도 한대로 작동합니다. 그러나 물체가 구체의 상단 또는 하단 극을 향해 이동하면 카메라가 극을 감 쌉니다. 직선이 극을 통과하면 180도 회전하는 것처럼 보입니다.

저는 왜 이런 일이 벌어 지는지 이해합니다. 카메라가 자신을 방향을 잡는 방법을 알기 위해서는 전역적인 업 벡터가 있어야합니다. 오른쪽 방향과 같이 다른 방향으로 벡터를 변경하면 카메라가 더 이상 상단 또는 하단 극 주위를 뒤집지 않고 대신 구의 왼쪽 및 오른쪽 극점에서 동일한 동작을 보입니다.

내 질문은 내 카메라의 동작을 변경하여 이것이 발생하지 않도록하는 것입니다. 카메라가 일정한 위치에있는 것처럼 느끼고, 구를보고, 구가 X 축과 Z 축으로 회전하는 것처럼 카메라가 느끼고 싶습니다.

"잘못된"방향이 발생할 수 있음을 알았습니다. 예를 들어, 사용자가 구면에서 시작하여 위로 올라간 다음 왼쪽으로 가면 구의 왼쪽에서 끝납니다. 카메라는 Z 축에서 90도 회전하고, 정면에서 시작하여 직접 왼쪽면으로 이동하면 회전이 없습니다. 카메라가 얼굴을 가로 질러 카메라의 로컬 회전을 천천히 "고정"하거나 사용자가 카메라를 잠금 해제 할 수 있고 카메라 각도를 직접 처리 할 수 ​​있기 때문에 괜찮습니다. 참고로

, 내 카메라는 현재이 문제의 솔루션을 사용하여 계산하고 있습니다 : Camera rotation aligned to arbitrary plane

모든 통찰력을 주시면 감사하겠습니다!

+0

SketchUp의 회전 모델을 살펴보십시오. 그들은 극을 넘어갈 때 위쪽 방향을 바꿉니다. –

+0

어떻게 구체 주변을 회전시키고 있습니까? 행렬 또는 쿼터니언? – Kobunite

답변

1

구가 트랙볼처럼 동작하도록하려면 사용자 정의 컨트롤에 지정된 회전 행렬에 점진적 회전 (예 : x 축 및 y 축)을 적용하십시오.

업데이트 후에도 회전 행렬을 "다시 표준화"해야합니다. 그렇지 않으면 숫자 오류가 발생하고 결국 회전 행렬이 회전 행렬이되지 않습니다. 계산은 다음과 같이되어야합니다.

update = RotX(userInput.dX) * RotY(userInput.dY) 
rawUpdatedRot = userRot * update 
newZ = Normalize(Cross(rawUpdatedRot.x, rawUpdatedRot.y)) 
newY = Normalize(Cross(newZ, rawUpdatedRot.x)) 
newX = Normalize(rawUpdatedRot.x) 
userRot = Matrix(newX, newY, newZ) 
+0

불행히도 카메라, 구 및 구형 객체가 월드 공간에 있어야하므로이 작업을 수행 할 수 없습니다. 내가 링크 한 스레드는 어떻게 설정했는지 설명합니다. 그것을 더 명확하게하지 않는 것에 대한 나의 사과. – Stardreamer

+0

예, 회전을 적용 할 위치를 알아 내면됩니다. 본질적으로, 카메라를 부모의 중심에 모이게하고 회전을 적용해야합니다. (카메라 변형은 객체 양육 계층의 행렬 스택의 "반대쪽 끝에"역순으로 적용됩니다 ...) – comingstorm