인프런 커뮤니티 질문&답변

‍구본재님의 프로필 이미지

작성한 질문수

게임 엔진을 지탱하는 게임 수학

혹시 직교투영에 대해서도 설명해주실 수 있으실까요?

해결된 질문

22.05.18 16:12 작성

·

1.1K

0

원근 투영 행렬을 만드는 것은 이해가 잘 되는데, 블로그나 여타 사이트에서 볼 수 있는 OpenGL에서 사용하는, DirectX에서 사용하는 직교 투영 행렬의 모양이 왜 그런식으로 나와야 하는 것인지 설명이 좀 부족해서 이해하기가 조금 힘드네요.

답변 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)의 수식은 각각 다음과 같습니다.

  • -kn+l=-1
  • -kf+l=1

이를 만족하는 k와 l의 값은 각각 2/(n-f)와 (n+f)/(n-f) 가 됩니다. 

DirectX와 OpenGL이 다른 점은 깊이 값의 범위를 DirectX는 [0,1]을 쓰는 반면 OpenGL은 [-1,1]을 사용합니다. 따라서 DirectX의 경우 위 수식은 다음과 같이 계산됩니다.  

  • -kn+l=0
  • -kf+l=1