답변:
가장 중요한 점은 3D 월드 공간에서 2D 화면 공간으로 포인트 (정점)를 변환한다는 것입니다.
즉, 정점에이 행렬을 곱한 후 X 및 Y 좌표가 화면의 위치 ([-1, 1] 사이)이고 Z가 깊이임을 의미합니다. Z는 깊이 버퍼에 사용되며 평면 근처에서 카메라의 정점 (또는 조각)이 얼마나 멀리 있는지 식별합니다.
투영은 가까운 평면에서 더 가까운 정점이 화면의 중앙에서 더 멀다는 것을 의미합니다.-> 카메라에 더 가까운 삼각형은 멀리있는 것보다 큽니다. 그리고 이것은 당신의 시야를 기반으로합니다-당신은 createProjectionMatrix 함수 또는 createFrustum에 입력합니다. 그것은 당신의 카메라 절두체와 정점을 전단하고 단위 큐브로 크기를 조정합니다. 1보다 크고 -1보다 작은 값은 표시되지 않습니다.
또한 픽셀 종횡비를 유지하므로 픽셀을 제곱 할 수 있습니다. 간단합니다. 더 넓은 스크린-> 더 많은 수직 전단 및 그 반대의 경우와 같이 카메라 절두체를 전단합니다.
간단한 대답 :
카메라 프러스 텀을 정의하며 다음과 같은 장점이 있습니다.
이 답변은 사실 후에도 오래되었지만 Google에서 이것을 발견 했으므로 여전히 누군가를 도울 것입니다. JasonD와 Notabene이 말한 것을 분명히하고 싶습니다. 클리핑 계산을 수행하는 것이 훨씬 쉽습니다 (당신이보고있는 것과 멀리 떨어져있는 방식으로 볼 수있는 것과 보이지 않아야하는 것을 알아 내십시오) ). 뷰 프러스 텀의 경계에서 평면과 교차하는지 확인하는 대신 모든 것의 x, y, z를 xMax, xMin, yMax 등으로 비교하면됩니다. 큐브가 있으므로 간단합니다. 보여지는 것의 일부만 갖고 싶다면 조금 더 복잡하지만, 수학은 절두체보다 단위 큐브를 사용하는 것이 좋습니다.
다른 답변에서 오해의 소지가있는 몇 가지 사항 :
뷰 프러스 텀에서 측면을 깎지 않고 균일 한 행렬 변환을 사용하여 큐브로 변형시킵니다.
-이 단계에서는 2D 화면으로 변환하지 않습니다. 이 단계는 필요하지 않습니다. 이론적으로 우리는 절두체를 먼저 큐브로 변환하지 않고 모든 작업을 수행 할 수 있습니다. 직관적이지만 어려운 수학이지만 그래픽은 평균 게임 / 무엇이든 초당 많은 계산이 있기 때문에 계산이 정말 빠릅니다.
더 자세하게 : 이것은 반드시 우리가 변환하는 단위 큐브 일 필요는 없으며, 최대-최소 계산을 위해서는 사각형 상자 일뿐입니다. 실제로 클래스에서는 카메라가 z 축을 향하고 z는 0에서 1로, x는 -1에서 1로, y는 -1에서 1로 이동하는 상자를 사용했습니다. 일반적으로 수학 1, 0, -1은 계산을 더 쉽게하기위한 좋은 숫자입니다. 그래서 우리는 -100에서 100 또는 다른 것으로 이동하지 않습니다.
TLDR : 클리핑이 쉬워집니다.
편집 : bobobobo는 그 요점을 가지고 있습니다. 모든 것은 삼각형입니다. 일반적으로 : D.
출처 : 대학 그래픽 수업 수강
OpenGL이 이미지가 표시되는 방법 (화면 비율 또는 해상도, 하드웨어 세부 사항 등)에 대해 가정 할 수 없기 때문이라고 생각합니다. 운영 체제 나 드라이버 또는 모든 것이 올바른 해상도 / 크기로 조정되는 중간 형태로 렌더링 및 이미지됩니다.
Scratchapixel의 투시 투영 행렬에 대한 교훈을 확인하는 것이 좋습니다.
뷰 프러스 텀 공간을 단위 큐브로 워프하는 이유를 명확하게 설명합니다. 왜? 기본적으로 캔버스에 3D 포인트를 투영하는 프로세스는 NDC 공간을 변환하기 위해 관련되어 있기 때문에 스크린의 포인트가 [-1,1] 범위에서 리 맵핑되는 공간입니다 (화면이 정사각형이라고 가정). 이제 Z 좌표를 [0,1] (또는 때로는 [-1,1]) 범위로 다시 매핑하여 결국에는 큐브로 끝납니다. 사실 포인트가 큐브에 포함되어 있으면 뷰 프러스 텀 (이상한 공간, 잘린 피라미드)에 정의 된 것보다 처리하기가 더 쉽습니다. 또 다른 이유는 CG에서 상상할 수있는 모든 종류의 프로젝션 변환을 동일한 공간 (단위 큐브)으로 가져 오기 때문입니다. 예를 들어 원근법 또는 직교 투영법을 사용하는지 여부에 관계없이
어쩌면 그 이유에 너무 집중할 수도 있습니다. 단위 큐브는 실제로 정점을 화면에 투영 한 다음 좌표를 래스터 공간에 다시 매핑하는 데 사용되거나 사용 된 수학 과정의 결과입니다.