해결된 질문
22.05.18 16:12 작성
·
1.1K
답변 1
1
2022. 05. 18. 17:44
안녕하세요.
직교투영(Orthographic)행렬은 원근투영에 비해 단순하다보니 따로 다루지는 않았습니다.
직교투영행렬을 이해하실 수 있게 정리를 해보면
직교투영공간의 z값은 x와 y축에 직교하기 때문에 초점거리(d)가 의미가 없어 행렬에 들어가진 않습니다. 따라서 1행과 2행에 초첨거리에 관련된 내용이 없어졌다고 이해하시면 되겠습니다.
그리고 직교투영은 원근투영과 달리 z값에 영향을 받지 않습니다. 따라서 동차좌표에서 NDC로 넘어갈 때 나누는 w값은 의미가 없어 w값은 1이 되어야 합니다. 따라서 4행의 설계가 다른 것을 볼 수 있습니다.
원근 투영행렬에서 4행과 (0,0,-n,1)을 내적해 얻은 벡터의 w값은 -n이 나와야 하는데, 직교투영행렬에서는 1이 나와야 합니다. 따라서 직교투영행렬의 4행은 (0,0,0,1)이 됩니다.
마지막으로 3행과 (0,0,-n,1)을 내적해 얻은 벡터의 z값은 각각 -1과 1이 나와야 하는데, 이를 만족하는 3행(0,0,k,l)의 수식은 각각 다음과 같습니다.
이를 만족하는 k와 l의 값은 각각 2/(n-f)와 (n+f)/(n-f) 가 됩니다.
DirectX와 OpenGL이 다른 점은 깊이 값의 범위를 DirectX는 [0,1]을 쓰는 반면 OpenGL은 [-1,1]을 사용합니다. 따라서 DirectX의 경우 위 수식은 다음과 같이 계산됩니다.