프로그래밍 공부
작성일
2023. 10. 27. 17:11
작성자
WDmil
728x90

DirectX에서 사용되는 3D그래픽을 2D화면에 투영하기 위한 변환행렬이다.

 

Proejction행렬은 카메라의 시점, 시야각, 화면의 종횡비를 고려하여 3D좌표를 화면좌표로 변환하는데 사용되는데,

 

이러한 행렬은 원근투영, 직교투영의 두가지 유형으로 나뉜다.


원근 투영 (Perspective Projection)

3D공간의 객체를 화면에 투영할 때 원근감을 반영하는 투영방식이다.

 

멀리있는 객체가 작게 나타나고 가까이있는 객체가 크게 나타나는 효과를 가진다.

 

  • 화면에서의 시야각(Fov)와 종횡비를 고려한다.
  • 가까운 객체와 멀리 있는 객체는 깊이(Depth)를 고려하여 원근효과를 적용한다.
  • DirectX에서는 D3DXatrixPerspectiveForLH 함수를 사용하여 행렬을 생성한다.

D3DXatrixPerspectiveForLH( 시야각, 화면 가로세로비율, 카메라의 가까운 투영평면, 카메라에서 가장 먼 투영평면)

 

원근 투영의 행렬생성수식

$\begin{bmatrix}
\frac{2n}{r-l} & 0 & \frac{r+l}{r-l} & 0 \\
0 & \frac{2n}{t-b} & \frac{t+b}{t-b} & 0 \\
0 & 0 & -\frac{f+n}{f-n} & -\frac{2fn}{f-n} \\
0 & 0 & -1 & 0
\end{bmatrix}$

 

n, f는 near와 far평면까지의 거리이다.

 

l = left

r = right

b = bottom

t = top

 

이 행렬을 곱해서 만든 동차 클립 좌표를 z값으로 나누면 원근투영이된다.

 

여기서 동차클립좌표는 해당 vertice의 Vector좌표를 이야기하는것 이고, z값으로 나눈다는 의미는

Depth값을 Vector좌표에 보정하겠다 라는 의미이다.


직교 투영 (Orthographic Projection)

직교 투영은 원근감을 고려하지 않고 모든 객체를 일정한 크기로 화면에 투영하는 투영방식이다.

 

이는 2D게임, CAD설계, 설계도면 만들기 등에 사용된다.

 

  • 원근감을 고려하지 않고 모든 객체를 일정한 크기로 표현한다.
  • 가까이 있는 개체와 멀리있는 객체가 동일크기로 나타난다.
  • 일반적으로 DircetX에서 D3DXMatrixOrthoLH함수를 사용하여 행렬을 생성한다.

D3DXMatrixOrthoLH(화면의 왼쪽, 오른쪽 경계, 화면의 상단과, 하단경계, 카메라에서 가장 가까운 투영평면의 거리, 카메라에서 가장 먼 투영평면 까지의 거리)

$\begin{bmatrix}
\frac{2}{r-l} & 0 & 0 & -\frac{r+l}{r-l} \\
0 & \frac{2}{t-b} & 0 & -\frac{t+b}{t-b} \\
0 & 0 & -\frac{2}{f-n} & -\frac{f+n}{f-n} \\
0 & 0 & 0 & 1
\end{bmatrix}$

 

n과 f는 near와 far평면까지의 거리

l r b t 는 각각 left, right, bottom, top을 나타낸다.


각각 행렬수식이 어떻게 이어지는지 이해하려면 법선Vector를 구하고 카메라 pos에 대한 cos만큼 보정해준다고 이해하면 쉽게 이해할 수 있다.

728x90

'컴퓨터 용어 정리' 카테고리의 다른 글

DIrectx11 Dll Setting  (0) 2023.11.02
블렌딩(Blending)기술  (0) 2023.10.30
DirectX RasterizerSate  (0) 2023.10.19
DirectX SamplerState  (0) 2023.10.19
HeightMap  (0) 2023.10.19