답변:
짧은 답변
먼저 뷰 매트릭스를 반전시킵니다. 그런 다음 마지막 행 / 열에서 번역을 가져옵니다.
긴 답변
뷰 매트릭스의 내용을 추론하는 한 가지 방법은 카메라를 월드의 다른 객체로 간주하고 월드 매트릭스를 계산하는 것입니다.
RightX RightY RightZ 0
UpX UpY UpZ 0
LookX LookY LookZ 0
PosX PosY PosZ 1
월드 매트릭스는 좌표를 로컬 공간에서 월드 공간으로 변환합니다. 그러나이 경우 카메라의 로컬 공간과 뷰 공간은 동일하고 동일하므로이 매트릭스가 좌표를 뷰 공간에서 월드 공간으로 변환한다고 말할 수 있습니다.
반대 방향으로 변환해야하므로 행렬을 반전시켜야합니다. 그 결과 좌표를 월드 공간에서 뷰 공간으로 변환 하는 뷰 매트릭스 라고합니다 .
RightX UpX LookX 0
RightY UpY LookY 0
RightZ UpZ LookZ 0
-(Pos*Right) -(Pos*Up) -(Pos*Look) 1 // * = dot product
이것이 여러분이 가진 일종의 행렬입니다. 따라서 카메라 위치에서 카메라 위치를 다시 가져 오려면 먼저 카메라를 뒤집은 다음 마지막 행 (또는 시스템에 따라 열)에서 번역을 가져올 수 있습니다.
먼저 위치를 벡터로 별도로 저장하는 것이 좋습니다. 계산을 훨씬 쉽게 수행 할 수 있습니다. 어쨌든 ...
[x (dot) right, y (dot) up, z (dot) look]
실제 뷰 매트릭스가 아닙니다. 행렬 자체는 다음과 같은 형식입니다.
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
여기서 왼쪽 상단 3x3 매트릭스는 회전, 배율 등을 나타냅니다. 모든 카메라 방향이 여기에서 수행됩니다. 나머지 행과 열은 번역 및 지금은 다루지 않을 다른 복잡한 관점에 사용됩니다.
행렬을 가져 오면 (4x4 행렬이라고 가정) 행렬 클래스가 행 주요 순서인지 열 주요 순서인지에 따라 변환이 항상 마지막 행 또는 마지막 열에 저장됩니다.
당신이 아마 혼란스러워하는 것은 내적 제품이 필요하다는 사실입니다. 진행중인 것은 행렬 수학의 단순화입니다.이 스택 오버플로 질문에 더 자세한 답변이 있습니다 : /programming/349050/calculating-a-lookat-matrix
해결책은 here 에서 찾을 수 있습니다 . 행렬의 역을 취하고 그 변환을해야합니다.
Vector3 ViewTrans = Matrix.Invert(ViewMatrix).Translation;
Position = ViewTrans;
다른 답변은 카메라 매트릭스에서 카메라 위치를 반대로 얻는 방법을 설명합니다.
카메라 매트릭스의 3x3 부분에 일반적으로 회전 (스케일링 또는 전단 없음) 만있는 경우 카메라 매트릭스 변환에 카메라 회전 조옮김을 곱하여 계산을 최적화 할 수 있습니다. 카메라 위치는 변환 된 변환 벡터에 -1을 곱한 값입니다. GLSL에서 이것은 :
vec3 cameraPosition = -transpose(mat3(worldToCameraMatrix)) * worldToCameraMatrix[3].xyz;
또는
vec3 cameraPosition = -worldToCameraMatrix[3].xyz * mat3(worldToCameraMatrix);
카메라 위치를 균일하게 계산하고 전달하지 않으려는 경우 정점 셰이더에서 사용하고 있습니다.