<용어 정리>
정점(Vertex) : 3D 공간상의 점, 좌표 값, 위치 값
폴리곤(Polygon) : 정점 3개가 모여 만들어지는 삼각형, 렌더링을 하는 가장 최소 단위
- 컨벡스(Convex) : 볼록 다각형(내각이 180도를 넘지 않는다.)
- 컨캐이브(Concave) : 오목 다각형(내각이 180도를 넘는다.)
메쉬(Mesh) : 폴리곤으로 이루어진 오브젝트, 모델링한 데이터
버텍스 프로세싱(Vertex processing)
로컬 좌표계 --(월드 변환)--> 월드 좌표계 --(뷰 변환)--> 카메라 좌표계 --(투영)--> (-1, -1. 0) ~ (1, 1, 1)사이의 값 --(뷰포트 변환)--> 2D 화면 좌표계
정점에 관련된 처리를 하는 버텍스 프로세싱은 크게 4개의 변환을 거치게 됩니다.
월드 변환, 뷰 변환(카메라 변환), 정규 변환(투영), 뷰 포트 변환 입니다.
<로컬 좌표계>
로컬좌표계는 오브젝트를 구성할때 사용된 좌표계 입니다. 예를 들어 정육면체를 그린다고 생각 해봅시다.
이 정육면체를 그리기 위해서 36개의 정점을 찍어야 됩니다. (왜 36개 인지는 나중에 다시 설명하겠습니다.)
만약 (0,0,0)을 중심으로 정육면체를 그린다고 하면 윗면을 그리기위해 좌측 상단 (-1, 1, -1), (1, 1, -1), (-1, 1, 1) 우측 하단 (-1, 1, 1 ), (1, 1, -1), (1, 1, 1) . . . 이런식으로 좌표값을 정점에 넣게 되는데 이때 사용되는 좌표계가 로컬 좌표계 입니다. 즉, 오브젝트를 그릴때 사용되는 좌표계라고 생각하시면 쉽겠네요.
#정육면체의 정점의 수#
왜 정육면체에 8개의 정점이 아닌 36개의 정점이 필요한 이유는 폴리곤 때문입니다. 일단 렌더링을 하기 위한 최소 단위는 폴리곤이라고 위에 용어설명에서 적어놨습니다. 폴리곤을 구성하기 위해서는 최소 3개의 정점이 필요합니다.
그렇기에 사각형의 면을 그릴려면 폴리곤이 2개, 정육면체가 가지고 있는 면의수는 6개 이기에 36개의 정점이 필요합니다.(D3DPT_TRIANGLELIST기준입니다)
<월드 좌표계>
로컬 좌표계가 오브젝트를 그리기위한 좌표였다면 월드 좌표계는 오브젝트가 있을 공간상의 좌표입니다.
예를 들면 보물상자를 정점을 이용해 만들었습니다. 이제 이 보물상자를 게임상의 좌표 어디에 위치되어야 하는데 이때 사용되는 좌표계가 월드 좌표계 입니다. 즉 월드 좌표계는 오브젝트가 공간상에 위치될 좌표 입니다.
<월드 변환>
월드 변환은 이떄 사용되는 변환 입니다.
로컬 좌표계를 월드 좌표계로 변환 할때 사용되는 변환이 월드 변환 입니다.
월드 변환은 행렬계산을 사용하여 계산을 합니다.
월드 변환은 3가지의 변환이 있는데
1. 이동
2. 회전
3. 크기변환
이렇게 있습니다.
이동은 오브젝트의 이동, 회전은 오브젝트의 회전, 크기변환은 오브젝트의 크기를 변환하는 행렬로 각각 독자적으로 사용될수도 있고 모두 같이 사용될수도 있습니다.
(변환행렬 M = S * R * T)
<카메라 좌표계>
카메라는 사람으로 치자면 눈과 같은 역활을 합니다. 월드 좌표계의 오브젝트를 보기 위해서는 카메라를 통해 월드 좌표계를 바라 봐야 합니다.
카메라에는 3가지 요소가 있는데
1.카메라의 위치
2.카메라가 바라보는 방향
3.카메라의 업벡터
가 있습니다.
카메라의 위치는 월드상의 카메라가 있는 곳이며 카메라가 바라보는 방향은 말그대로 카메라가 보는곳, 바라보는 지점입니다. 그리고 카메라의 업벡터는 카메라의 위쪽과 아래쪽을 구분하는 방향라고 생각 하시면 되겠습니다.
<뷰 변환>
뷰 변환에 말하기 앞서 자동차의 창문을 바라 본적이 있을 겁니다. 이때 나무를 보면 자동차 뒤로 이동하는 듯한 느낌을 받아본적 이 있을겁니다. 뷰변환은 자신이 이동할때는 자기가 이동하는 것이지만 자신의 시야를 기준으로 보면 물체가 뒤로 가는 것처럼 보입니다. 이 처럼 카메라가 원점에 있는것으로 하고 물체들을 카메라의 움직임에 맞추어 카메라가 원점에서 떨어진 만큼 빼주어서 카메라를 원점 위치로 옮겨줍니다. 이러한 변환을 뷰변환 이라 합니다.
<투영>
투영변환 이전에 일단 절두체 부터 알아 보도록 합시다.
절두체는 삼각뿔의 윗부분을 잘라낸 형태 입니다. 피라미드에서 윗쪽 꼭지를 잘라낸 형태라고 생각하시면 쉽겠네요.
절두체의 구성은 카메라와 가장 가까이 있는 면인 near 면과 가장 멀리 있는 far 면 그리고 왼쪽, 오른쪽, 위, 아랫 면을 담당하는 left, right, top, bottom으로 되어 있습니다.
왜 이 절두체를 이야기 하는 것이냐 하면 월드 좌표계의 모든 오브젝트를 다 보여준다고 하면 게임이 너무 느려지게 됩니다. 그래서 사람의 눈 처럼 일정한 시야를 만들어서 이 시야 안에 들어오는 오브젝트만 렌더링을 하는 것 입니다. 시야 밖에 있는 오브젝트는 렌더링 할 필요가 없으니 과감하게 렌더링 하지 않는 것이지요.
절두체는 여기서 시야에 해당 하게 됩니다.
투영은 이제 이 절두체 안에 있는 오브젝트들을 정규화된 장치 좌표계인 (-1, -1, 0)~(1, 1, 1)의 값으로 변환하는 작업입니다. 이 작업은 2가지 방법이 있는데 하나는 원근감 없이 오브젝트 그대로 보이게 하는 직교 투영과 멀리 있는것은 작게 보이게 하는 원근 투영 이렇게 2가지가 있습니다. 보통은 원근감을 느끼게 하기 위해 원근 투영을 사용합니다.
<뷰포트 변환>
이제 투영까지 거치게 좌표를 2D 모니터 상의 좌표계로 옮겨주는 뷰포트 변환이 남았습니다.
화면 좌표계는 모니터의 좌측 상단이 (0, 0)이 되고 x축은 오른쪽으로 커지고, y축은 왼쪽으로 커지는 형식의 좌표계 입니다. 투영으로 변환된 좌표계를 이 2D좌표계로 변환하는데 D3D의 y축과 모니터 상의 y축은 반대 이므로 -1을 곱해주고 각 모니터 비율에 맞도록 맞춰 표현이 됩니다.
(계산식은 y' = - height / 2 * y + height / 2, x' = width / 2 * x + width / 2 입니다.)
변환 과정을 식으로 써보면
모니터 좌표 = 로컬 좌표 * 월드 행렬 * 뷰 행렬 * 투영 행렬 * 뷰포트 행렬
로 표현될수 있습니다.
---------------------------------------------------------------------------------------------------------
기말 시험 공부 정리
최대한 수학공식을 사용하지 않고 설명할려고 했는데 쉽지가 않네요 ;;;