왜 ?
카메라는 프로젝션 뷰를 나타 내기 때문입니다.
그러나 3D 카메라 (가상 카메라)의 경우 카메라가 세상 대신 움직입니다. 이 답변의 뒷부분에 자세한 설명을했습니다.
수학적으로 이해
투영 뷰는 공간 주위를 이동하고 방향을 변경합니다. 가장 먼저 알아 두어야 할 것은 화면의 원하는 투영이보기 방향으로 변경되지 않는다는 것입니다.
이러한 이유로 우리는 다른 것을 변형시켜 원하는 투영을 얻습니다.
http://opengl.org 에서 이해하기
카메라가 움직이는 것처럼 보이게하려면 OpenGL 응용 프로그램이 카메라 변환의 역으로 장면을 이동해야합니다. OpenGL과 관련하여 카메라가 없습니다. 보다 구체적으로, 카메라는 항상 눈 공간 좌표 (0, 0, 0)에 위치합니다.
http://open.gl 에서 이해
또한 http://open.gl/transformations의 View matrix 부분 에서 다음 줄을 공유하고 싶습니다.
카메라 변환을 시뮬레이션하려면 실제로 그 변환의 역으로 세상을 변환해야합니다. 예 : 카메라를 위로 움직이려면 세상을 아래로 움직여야합니다.
관점으로 이해
실제 세계에서는 "관점"이라는 방식으로 사물을 봅니다.
원근은 더 멀리있는 물체가 더 가까운 물체보다 작게 보이는 개념을 나타냅니다. 원근법은 또한 직선 도로 중앙에 앉아있는 경우 실제로 도로의 경계선을 두 개의 수렴 선으로 본다는 것을 의미합니다.
그것은 관점입니다. 관점은 3D 프로젝트에서 중요합니다. 원근법이 없으면 3D 세계는 실제처럼 보이지 않습니다.
이것은 자연스럽고 명백해 보일 수 있지만 컴퓨터에서 3D 렌더링을 만들 때 컴퓨터 화면 (2D 표면)에서 3D 세계를 시뮬레이션하려고 시도하는 것을 고려해야합니다.
컴퓨터 화면 뒤에는 실제 3D 장면이 있으며 컴퓨터 화면의 "유리"를 통해보고 있다고 상상해보십시오. 원근법을 사용하여 목표는 화면 뒤에이 실제 3D 세계가있는 것처럼 화면의 "유리"에 "투영"되는 것을 렌더링하는 코드를 만드는 것입니다. 유일한 경고는이 3D 세계가 현실이 아니라는 것입니다. 그것은 단지 3D 세계의 수학적 시뮬레이션 일뿐입니다.
따라서 3D 렌더링을 사용하여 3D에서 장면을 시뮬레이션 한 다음 3D 장면을 화면의 2D 표면에 투영 할 때이 프로세스를 원근 투영이라고합니다.
달성하고자하는 것을 직관적으로 구상하여 시작하십시오. 객체가 뷰어에 더 가까이 있으면 객체가 더 커야합니다. 물체가 더 멀리 있으면 더 작아야합니다. 또한 객체가 뷰어에서 직선으로 멀리 이동하는 경우 거리가 멀어 질수록 화면 중앙을 향해 수렴되기를 원합니다.
관점을 수학으로 변환
다음 그림에서 그림을 볼 때 물체가 3D 장면에 있다고 가정하십시오. 3D 세계에서, 물체의 위치는 시점에서 원점을 갖는 3D 좌표 시스템을 참조하여 xW, yW, zW로 기술 될 수있다. 화면 너머의 3D 장면에서 객체가 실제로 위치하는 곳입니다.
시청자가이 객체를 화면에서 볼 때 3D 객체는 화면의 2D 좌표계 (투영 평면)를 참조하는 xP 및 yP라고하는 2D 위치로 "투영"됩니다.
이 값을 수학 공식에 넣으려면 월드 좌표에 3D 좌표계를 사용합니다. 여기서 x 축은 화면에서 오른쪽, y는 위쪽, 양수는 z를 가리 킵니다. 3D 원점은 시청자의 눈의 위치를 나타냅니다. 따라서 화면의 유리는 z 축과 직교하는 평면 (직각)에 z 축으로, z는 zProj라고합니다.
다음과 같이 월드 위치 xW와 yW를 zW로 나누어 투영 위치 xP와 yP를 계산할 수 있습니다.
xP = K1 * xW / zW
yP = K2 * yW / zW
K1 및 K2는 투영 평면 (뷰포트)의 종횡비 및 눈의 "시야"와 같은 기하학적 요소에서 파생 된 상수로, 광각 비전의 정도를 고려합니다.
이 변환이 원근을 시뮬레이션하는 방법을 볼 수 있습니다. 눈과의 거리 (zW)가 증가함에 따라 화면 측면 근처의 점이 중앙을 향해 밀리 게됩니다. 동시에, 중심 (0,0)에 더 가까운 점은 눈으로부터의 거리에 의해 훨씬 덜 영향을 받고 중심에 가깝게 유지됩니다.
z에 의한이 구분은 유명한 "관점 분할"입니다.
이제 3D 장면의 객체가 일련의 꼭짓점으로 정의되어 있다고 가정합니다. 따라서 이러한 종류의 변형을 모든 지오메트리의 정점에 적용하면 객체가 시점에서 멀어 질 때 수축되도록 효과적으로 할 수 있습니다.
다른 중요한 경우
- 3D 카메라 (가상 카메라)의 경우 카메라가 월드 대신 이동합니다.
3D 카메라를 더 잘 이해하려면 영화를 촬영한다고 가정 해보십시오. 촬영하려는 장면을 설정해야하며 카메라가 필요합니다. 푸티지를 얻으려면 카메라를 사용하여 장면을 로밍하면서 장면의 객체를 다른 각도와 관점에서 촬영합니다.
3D 카메라에서도 동일한 촬영 프로세스가 수행됩니다. 생성 한 "가상"장면을 돌아 다닐 수있는 "가상"카메라가 필요합니다.
인기있는 두 가지 촬영 스타일에는 캐릭터의 눈 (일인칭 카메라라고도 함)을 통해 세상을 보거나 캐릭터를 카메라로 향하고 시야를 유지하는 것 (타사 인 카메라라고 함)이 포함됩니다.
이것은 3D 카메라의 기본 전제입니다. 3D 장면을 로밍하고 특정 시점에서 푸티지를 렌더링하는 데 사용할 수있는 가상 카메라입니다.
세계 공간 및보기 공간 이해
이러한 종류의 동작을 코딩하려면 3D 월드의 내용을 월드 좌표계의 관점이나 다른 고정 된 관점에서가 아니라 카메라의 관점에서 렌더링합니다.
일반적으로 3D 장면에는 3D 모델 세트가 포함됩니다. 모델은 자체 좌표계를 참조하여 정점 및 삼각형 세트로 정의됩니다. 모델이 정의 된 공간을 모델 (또는 로컬) 공간이라고합니다.
모델 객체를 3D 장면에 배치 한 후에는 "세계 변형"행렬을 사용하여 이러한 모델의 정점을 변형합니다. 각 객체에는 객체의 월드 위치와 방향을 정의하는 자체 월드 매트릭스가 있습니다.
이 새로운 참조 시스템을 "월드 공간"(또는 글로벌 공간)이라고하며,이를 관리하는 간단한 방법은 월드 변환 매트릭스를 각 객체에 연결하는 것입니다.
3D 카메라의 동작을 구현하려면 추가 단계를 수행해야합니다. 세계를 기준으로하지 말고 3D 카메라 자체의 기준 시스템을 참조하십시오.
좋은 전략은 카메라를 3D 세계에서 실제 3D 객체로 취급하는 것입니다. 다른 3D 객체와 마찬가지로 "세계 변형"매트릭스를 사용하여 3D 세계에서 원하는 위치와 방향으로 카메라를 배치합니다. 이 카메라 월드 변환 매트릭스는 카메라 오브젝트를 원래의 전방 회전 (z 축을 따라)에서 실제 월드 (xc, yc, zc) 위치 및 월드 회전으로 변환합니다.
다음 그림은 월드 (x, y, z) 좌표계와 뷰 (카메라) (x ', y', z ') 좌표계 간의 관계를 보여줍니다.