DirectX 11

221013

슬뷔 2022. 10. 26. 17:44

뷰행렬

월드에서 뷰변환을 한다는 얘기는 기준이 카메라로 바뀐다는 얘기이다.

카메라를 항상 월드에 있던 월드 원점의 기준이 아니라

월드상에 카메라도 같ㅇ ㅣ존재하고 있는데 카메라를 원점으로 보고 카메라가 전방으로 자기가 보고 있는 방향을 z축이라고 했을 때의 본인들의 좌표를 다시 계산해야되는 것이다.

 

월드에서 뷰로 넘어가기 위해서 곱해주는게 뷰행렬인데 

뷰행렬 안에는 카메라가 원점이고 카메라가 보는 방향을 z축이라고 했을 때의 좌표를 계산할 수 있게 해주는 변환행렬 정보들이 들어있다.

월드에 있던 좌표들이 뷰행렬을 곱하고 나면 뷰 좌표계로 바뀌는 것이다.

그렇게 하기 위해 뷰행렬에는 4행파트에 카메라 본인의 월드포지션을 음수로 해서 들고 있다.

카메라가 원점이 된다는 이야기는 결국 카메라가 월드에 있던 좌표에서 원점으로 바뀐다는 거니까 

이때 기준으로 다른 물체들도 똑같은 변화를 같이 해야되야하기 때문이다.

 

만약 카메라가 z축이 아닌 다른 곳을 바라보고 있다면?

카메라를 다시 z축을 쳐다보게 해야한다.. -> 회전을 해야한다.

물체들은 카메라가 z축을 바라보게 하는 만큼 공전을 해야한다.

 

상태행렬 = 크기 x 회전 x 이동

 

회전행렬이 이동보다 앞쪽에 곱해지면 자전

why?

이동하기 전에 먼저 돌려놓고 이동을 했기 때문이다.

본인이 어느위치에 있어도 보는사람 입장해서는 자기 위치에서 도는 것으로 보인다.

돌리고 배치했기 때문에 결과적으로 자기 자리에서 도는 것처럼 보인다.

 

상태행렬 = 크기 x 이동 x 회전

 

회전행렬이 이동보다 뒷쪽에 곱해지면 공전

why?

크기 변환하고 나서 이동한 다음에 거기서 회전을 시키기 때문에 원점을 중심으로 공전이 되는 것이다.

 

뷰이동행렬 카메라를 원점으로 이동하는 만큼의 이동행렬

그리고 회전행렬(카메라가 보고있는 전방방향을 z축으로 되돌려놓는만큼의 회전)을 곱한다.

월드에 있는 물체들 입장에서는 이동하고 회전이기 때문에 이동하고 원점에 있는 카메라를 중심으로 공전을 당하는 입장이다.

 

이동하고 회전을 미리 곱해놓는걸 뷰행렬이라고 부른다.

뷰행렬 = 이동 x 회전 or 회전 x 이동

 

* 뷰스페이스

1. 카메라가 원점에 있다.

2. 카메라가 보는 방향이 z축이다. (전방 front) -> 0 0 1

3. 우측 방향이 x축 (right) -> 1 0 0

4. 업은 y축 (up) -> 0 1 0

 

내가 구하고자 하는 R (회전행렬) 은 A 행렬의 역행렬이 된다.

R(우측), U(업), f(전방) 는 서로서로가 90도이기 때문에 서로서로 직교행렬이라고 볼 수 있다.

 

직교행렬의 특징

1. 역행렬을 구할 때, 전치만 시키면 된다.

 

현재 마우스 - 이전 마우스 - > 이전 마우스에서 현재 마우스로 향하는 진행방향

마우스를 어디로 이동시켰는지 이동방향이 나오게 된다.

윈도우 좌표는 아래가 + 이다.

그런데 우리는 위쪽이 플러스이다.. 

그래서 -1 을 곱해준다.

 


2d에서 자주 사용하는 투영법 -> 직교투영법

 

직교투영법 XMMatrixOrthographicLH

뷰스페이스에 물체들이 오고, 투영하고 싶은 범위를 지정한다.

일직선으로 물체가 부딪힌다.

그래서 물체가 가까이 있든 똑같은 크기의 물체가 멀리있든 똑같은 위치에 맵핑이 돼서 거리감이 없다.

내가 투영하고 싶은 범위를 정한 다음에 일직선으로 받고 ndc 공간으로 압축시키면 끝이다.

 

투영범위를 크게하면 내 화면상에서 작게 보인다.

투영범위를 작게하면 내 화면상에서 크게 보인다.

 

 

 

 

 

'DirectX 11' 카테고리의 다른 글

221017  (0) 2022.10.29
221014  (0) 2022.10.27
221012  (1) 2022.10.18
221011  (0) 2022.10.18
221007  (0) 2022.10.17