2016-09-26 5 views
-1

raytracer에서 작업하고 있는데 카메라의 방향 벡터가 벡터와 평행 한 경우를 처리 할 수없는 것처럼 보입니다. 0,1,0).내 raytracer에 y 축과 평행 한 카메라 방향을 어떻게 처리 할 수 ​​있습니까?

나는 그것이 카메라를 위아래로 벡터를 계산하는 내 방식에 연결되어 있다고 생각하지만, 해결 방법을 찾을 수는 없다.

cam_up = vector_cross(cam_dir, {0, 1, 0}); 
camp_right = vector_cross(cam_right, cam_dir); 

누군가가 가르치 려 수 : 여기

내가 그것을 어떻게?

+1

프로그래밍 언어 태그를 추가해야합니다. – Laurel

+0

어쨌든 어떤 방향으로 선택 하시겠습니까? – harold

+0

나는 이해하지 못한다. 방향을 선택하면 무엇을 의미합니까? –

답변

1

단일 cameraOut 벡터에서 직교 축을 계산하는 올바른 공식이 있습니다. 그러나,이 공식은 카메라 방향에 수직 인 평면에서의 임의의 방향 일 수있는 카메라 롤을 설명하지 않는다. 카메라가 극 (y 축)을 가로 질러 움직일 때 이것은 분명히 드러날 것입니다. 예기치 않은 행동이있을 것입니다 (예를 들어 정확하게 목표로 삼을 것입니다. 그러나 롤이 필요하지는 않을 것입니다).

자세한 내용은 gimbal lock을 참조하십시오.

롤 자체는 실제로 잘못된 것은 아니지만이 카메라 전환이 매끄 럽고 정확 해 보이기 때문에 (방향이 0,1,0으로 갑자기 뒤집히거나 스핀하는 것이 아니라) 발생 된 롤을 수정해야합니다 . 이것은 cameraOut 축에 대한 회전이며 이상적으로는 이전 카메라에 대한 상대 좌표이어야합니다. 이것은 올바른 롤 (또는 정확한 롤)을 유지하기 위해 이전 프레임의 카메라 POSE (위치 및 방향)를 고려하고 롤이 완화되도록해야한다는 것을 의미합니다. 물론 카메라가 움직이지 않으면 (즉 정적 카메라 위치의 프레임을 렌더링하는 경우) 이전 카메라 상태가 없으므로 위치를 계산할 수 없으며 장면 정의의 일부로 명시 적으로 정의해야합니다.

개인적으로 카메라의 직교 축을 개인적으로 저장하므로 방향과 롤이 항상 명확하게 정의됩니다. 이것은 완전성을위한 것입니다. 솔직히 축 전체를 저장할 필요는 없습니다. 벡터 2 카메라 cameraOut 및 cameraAlong (세 번째 카메라는 cameraUp)이면 충분합니다. cameraAlong은 좌표계의 수작업에 따라 달라집니다 (예 : 왼손 좌표계의 초기 카메라 위치 말 위치 (0,0,0), 카메라 오른쪽 방향은 뷰어와 관련하여 올바른 방향으로, 오른쪽 손으로 카메라를 사용하면 다른 방향으로 카메라를 가져올 수 있습니다 .CameraUp과 cameraOut는 두 좌표계에서 동일합니다.

희망이 도움이됩니다.

P.S 이는 광선 추적과 관련이 없으며 OpenGL/DirectX 또는 3D 표현에도 동일한 원칙이 적용됩니다.