응애맘마조
220110 강의 본문
오늘도 어제에 이어 카메라에 대해서 배웠습니다.
3D 과정에서는 카메라가 많이 필요합니다. 하지만 지금 배우는 2D 과정에서는 카메라가 여러 개 필요하지 않고 하나만 필요합니다. 그래서 카메라도 Singleton을 사용합니다.
(원래 카메라라는 개념은 없습니다. 정점도 없고 단지 출력만 해서 구현을 한 거라 존재하지는 않습니다.)
카메라도 행렬을 사용합니다.
enum 안에 SPACE로 해서 WORLD와 SCREEN이 있습니다.
WORLD는 카메라입니다. 다른 객체의 움직임에 사용됩니다.
SPACE는 공간 이동을 받지 않습니다. 시간의 표시나 UI에 사용됩니다.
카메라는 V, P, VP를 사용합니다.
V는 뷰 행렬(역이동 행렬)입니다. 이동 행렬을 사용하고 이동 방향의 반대로 객체가 움직이게 합니다.
(그래서 포지션이 음수 값이 들어갑니다.)
P는 프로젝션입니다. 투영 행렬이고 가로, 세로값에 사용됩니다.
여기서 투영은 비춘다는 것을 의미하고 있습니다.
3D에서는 멀리 있는 것을 작게, 가까이 있는 것을 크게 보이게 하는 원근법을 사용합니다. (컬링, 조명, 크리핑도 3D에서 사용합니다.)
2D에서는 따로 깊이감이 없기 때문에 다 똑같은 크기로 나오는 직교 투영을 사용합니다.
직교 투영을 하게 되면 NDC 좌표계로 나옵니다. (-1, -1에서 1, 1 사이로만 나오는 좌표계입니다.)
카메라의 좌표계는 스크린 좌표계를 사용합니다.
여기에서 객체가 해상도 크기에 맞춰서 출력 해주는 것이 Viewport입니다.
Viewport는 기본 좌표가 0, 0입니다.
ResizeScreen은 최대화를 했을 때 실행됩니다.
여기까지가 VS이고 그 다음 RS를 실행하게 됩니다.
RS는 생성자와 ResizeScreen, DirectX11.cpp 이렇게 3개밖에 없습니다.
자원은 RasterizerState를 사용합니다.
D3D11_FILL_SOLID는 색을 채우는 역할을 합니다.
D3D11_FILL_WIREFRAME은 삼각형으로 그리게 됩니다. 정점의 뼈대 역할을 한다고 보시면 됩니다.
D3D11_CULL_NONE은 전부 다 그리는 역할입니다.
D3D11_CULL_FRONT는 화면의 앞면을 그리지 않습니다.
D3D11_CULL_BACK은 화면의 뒷면을 그리지 않습니다.
FrontCounterClockwise은 어느 쪽을 앞면으로 할 것인가를 결정합니다.
시계 방향을 앞면으로 할 경우에는 false, 시계 반대 방향을 앞면으로 할 경우에는 true를 사용합니다.
함수 사용에 대해 조금 알아봤습니다.
레퍼런스(&)는 포인터처럼 쓸 수 있습니다. 하지만 주소가 없어서 원본이 반드시 필요합니다.
같은 주소를 공유하게 됩니다.
L-value는 좌측이라서 L을 사용하고 주소가 있어서 값의 임의변경이 가능합니다.
R-value는 우측이라서 R을 사용하고 주로 상수나 임시 변수, 임시 객체에 사용합니다.
내일부터는 드디어 충돌 처리에 대해 배운다고 했습니다. 원래는 4 ~ 5일이 걸리는 내용이지만 최대한 3일 안에 끝낼 수 있도록 한다고 했습니다.
읽어주셔서 감사합니다.