당신이 요구하는 것을 아크 볼 회전이라고합니다. 쿼터니언은 작동 방식을 이해 한 경우에만 쉬운 솔루션입니다. 그러나 쿼터니언 없이도 동일한 결과를 얻을 수 있습니다.
전제 조건
일반적인 개체 회전 방법을 알고 있습니까? 원점에 객체가 있다고 가정 해 봅시다. 회전 방법을 알고 있습니까 (힌트 : 회전 행렬을 곱함)? 그렇다면 객체를 먼저 번역 한 다음 회전하면 어떻게 될지 알고 있다고 가정합니다.
각도 축에서 회전 행렬을 계산하는 방법을 알아야합니다 (파이처럼 쉽고 온라인에서 무수한 방정식을 살펴보십시오. 많은 방정식도 코드를 제공합니다)
해결책
- 카메라의 위쪽 및 오른쪽 벡터를 가져 옵니다 . 그것들은 정규화되어야합니다.
- 초점에서 카메라로 벡터를 가져옵니다 (camPosition-Focus). 이것이 회전하려는 벡터입니다. 이 camFocusVector 라고합시다 .
- 카메라와 관련하여 요 / 피치에서 얼마나 회전시킬 것인지 결정
- 두 개의 회전 행렬을 만듭니다. 첫 번째 회전 행렬은 카메라 의 위쪽 을 사용자가 결정한 축 및 요 각도로 사용합니다. 두 번째 회전 매트릭스는 카메라 의 오른쪽 을 사용자가 결정한 축 및 피치 각도로 사용합니다.
- 이제 새로운 회전 행렬로 camFocusVector 를 회전하십시오 . 이것은 이제 원점을 기준으로 한 카메라의 새로운 위치입니다. 물론 초점과 관련이 있기를 바랍니다.
- 초점 위치를 camFocusVector에 추가하십시오 . 이것은 이제 카메라의 새로운 위치입니다. 그에 따라 카메라를 번역하십시오.
- 마지막으로 lookAt () 함수를 호출하여 카메라가 포커스 포인트에 초점을 맞추도록 요청하십시오.
경고
카메라가 작동을 멈출 특정 사례 나 특이점을 찾아야합니다. 예를 들어 똑바로보고 / 위로. 나는 당신이 그것들을 다루는 방법을 알아낼 것입니다.
EDIT1 : 카메라의 직교 법선 벡터를 다시 계산하는 방법
카메라의 방향을 이미 알고 있습니다 ((cameraPos-focusPoint) .normalize ()). 이제 카메라의 업이 + Y라고 가정하십시오 (또는 세계의 현재 업 축은 ... 당신에게 달려 있습니다). 이제 위쪽 으로 방향 을 건너면 오른쪽 으로 갈 수 있습니다 . 끝난? 아니! 위 벡터는 더 이상 다른 두 벡터와 직교하지 않습니다. 즉, 크로스 해결하려면 우측 으로 방향을 당신은 당신의 새로운 도착 을 위로 .
있습니다 그람 슈미트 orthonormalize 벡터로 사용되어야한다 정말로이다.
다시 말하지만, (어떤 경우에는 작동하지 않을 것입니다이 같은주의 사항을주의 깊게 살펴 방향 에 평행 까지 예를 들면).