방향을 변경하려고하면 내 카메라가 한 지점을 중심으로 회전합니다. 카메라를 Y 축에서 30도 각도로 회전 시키면 카메라가 오른쪽으로 30도 보인 대신 카메라가보고 있던 지점을 중심으로 회전합니다.왜이 카메라로이 카메라로 회전합니까?
o is the camera, A and B are 3D models. The lines show line-of-sight.
This is what I expect:
A B
| >/
|/
|/
|/
o
This is what actually happens:
A B
|\
| \
| \
| > \
o
이제는 카메라를 움직이려면 그 양의 역수로 세계를 움직여야합니다. 따라서 Z 축에서 +1을 움직이려면 Z 축에서 세계를 -1로 변환합니다. 저는 방위를 표현하기 위해 쿼터니언을 사용하기 때문에 카메라 쿼터니온의 역함수를 사용합니다. 방정식은 항상 단위 쿼터니언이므로 역수를 계산하는 대신 공액을 사용하여 최적화하여 올바른 양만큼 월드를 회전시킵니다. 여기
내가 q는 반전 사원 수있는 매트릭스로 사원 수로 변환하는 방법입니다
[... ... ... -x]
|... ... ... -y|
|... ... ... -z|
[0 0 0 1]
그리고 마지막으로 : 그 후
[1 - 2 * (q.y * q.y + q.z * q.z) 2 * (q.x * q.y - q.w * q.z) 2 * (q.x * q.z + q.w * q.y) 0]
|2 * (q.x * q.y + q.w * q.z) 1 - 2 * (q.x * q.x + q.z * q.z) 2 * (q.y * q.z - q.w * q.x) 0|
|2 * (q.x * q.z - q.w * q.y) 2 * (q.y * q.z + q.w * q.z) 1 - 2 * (q.x * q.x + q.y * q.y) 0|
[0 0 0 1]
, 나는 행렬의 평행 이동 요소를 설정 이를 모델 뷰 매트릭스 스택에 곱한 다음 모든 객체를 렌더링합니다. 나는이 수학이 정확하다고 확신하지만 기대했던 결과를 산출하지 못합니다. 분명히 앞으로와 오른쪽 벡터는 문제이므로 내 유일한 질문은 왜 그들이 틀렸는가와 내가 예상 한 결과를 얻고 싶다면 어떻게 설정해야 하는가입니다. 감사.
편집 : this guy's quaternion camera class에서 해결책을 찾았습니다. 먼저 i가했던 것처럼 회전 행렬을 만들지 만 첫 번째, 두 번째 및 세 번째 열 (각각 xa, ya 및 za)에서 행렬의 열 벡터를 가져옵니다. 이어서이 같은 행렬의 병진 성분 세트 : 다음, 생성 행렬은 모델 뷰 매트릭스 스택으로 곱해질 수
[... ... ... -xa.dotProduct(cameraPos)]
|... ... ... -ya.dotProduct(cameraPos)|
|... ... ... -za.dotProduct(cameraPos)|
[... ... ... ... ]
을하고 완벽하게 작동한다.
해결책을 편집하여 수락하십시오. 그것이 우리가 여기에서 해결 된 질문을 표시하는 방법입니다. 또한 나는 당신이 무슨 일이 일어나는지에 대해 약간의 설명을 할 자격이 있다고 생각합니다. 나는 이것에 대한 답을 쓸 것이다. – datenwolf