XMMatrixIdentity -> 단위행렬
XMMatrixScaling(x값 크기, y값 크기, z값 크기) -> 넣어주면 사선으로 x y z 1 생기고 나머지 0
XMMatrixTranslation(x값 이동, y값 이동, z값 이동) -> 이동행렬
월드 행렬 = 크기 * 이동
들어온 것은 로컬스페이스 좌표인데 행렬 안에 이동값이 들어가 있다.
이동파트가 4행에 들어와있다.
네번째 동차좌표를 1로 확장시켜 곱해주면 행렬 안에 들어있는 4행성분의 이동량만큼 이동을 하게 된다.
즉, 로컬스페이스는 동일한 좌표가 들어오는데 각 오브젝트별로 자기의 월드 행렬값을 전달시켜
랜더링 하기 전에 자기의 월드상태를 보내놓으면 로컬스페이스에 있는 것을 월드행렬을 적용시켜
거기에 기록되어 있는 이동값이 영향을 받아 이동하는 개념으로 바뀌게 되는 것이다.
월드 행렬 안에는 크기 데이터도 들어있다. (사선으로)
월드 행렬을 통해서 기록되어있는 상태값을 적용받아서 로컬스페이스에 있던 물체를 월드로 이동시킨다.
이동한 좌표를 월드좌표라고 부른다.
월드좌표까지 이동한 후에 카메라가 얘를 찍어야한다..
편의상 카메라가 만약 월드에서 원점에 있고 Z축을 보고있는 상황이라고 한다면,
물체가 로컬에서 월드에 배치에 됐는데 원점에 카메라가 있으니까 화면에 그대로 나오면 된다.
만약에 카메라가 월드상에서 다른 위치에 있다면 다른 위치에 그려져야 한다.
최종 NDC 좌표는 중심이 0, 0 이기 때문에 카메라가 원점으로 이동하는 만큼 물체들이 같이 따라와야한다.
월드에 이동만 시켜도 카메라 앞에 배치한 것과 다름 없다.
그냥 배치만 한 것이 아니라 카메라가 z축을 본다는 가정을 해야한다.
만약 카메라가 원점에 있어도 카메라가 z축이 아닌 다른 곳을 보면 거기서부터 회전을 해서
우리 화면 앞에 있어야 한다.
1. 카메라 컴포넌트
뷰행렬 -> 월드에 있는 것을 카메라 앞에 배치를 시키는 작업
ViewPos : 카메라가 원점에서 z축을 보고 있다 -> 뷰행렬이 단위행렬이라는 의미
랜더링할 이유가 없다. 보는 쪽이기 때문~
2. 투영 (ProjPos)
뷰 스페이스가 기준 -> 원점에 카메라가 있고, 카메라는 z축을 바라봐야한다.
NDC 공간 안에 들어오는지 확인
뷰스페이스는 원근 투영법(perspective projection)을 사용하기 때문에 아무리 커다란 물체도 NDC 범위인 -1 ~ 1 범위 안에 들어오게 된다.
원근 투영법을 이용하면 같은 크기의 물체더라도 내 화면상에 보이는 최종적으로 그려지는 크기는 달라질 수 있다.
최종적으로 넘기고자 하는 좌표는 ProjPos 가 되는 것이다.
width 와 height 는 내가 보는 시야각에 대한 보정값이다. (NDC -1 ~ 1 에다가 값을 곱한 값이다)
최소 거리(n)는 깊이값 0
최대 거리(f)는 깊이값 1
투영원리는 직각삼각형의 삼각비를 이용한다.
n : vz = proj.x : vx
https://createcode.tistory.com/m/15
왼손좌표계를 이용하기 때문에 XMMatrixPerspectiveFovLH 를 쓰면 된다.
투영시키기 전에 내 공간을 늘려놓는다 (시야각(fov)을 넓게 잡을수록 더 늘어난다 )
그 후에 NDC 좌표계로 압축한다.
시야각을 넓게잡으면 더 많은 물체들이 NDC 좌표계로 압축되어 들어온다.
시야각을 좁게 설정했으면 안 보였을 애들이 이 안으로 들어온다.
AspectRatio -> 종횡비
종횡비를 구하려면 해상도를 알아야한다.
윈도우 해상도가 아닌 랜더링 해상도 기준(디바이스가 들고 있다)이다.
시야각은 degree값으로 넣어야한다.
각도는 기본적으로 라디안이다.