이제 3d 물체를 2d 스크린 좌표계로 변환하는 transformation 을 정리해본다.
좌표계를 변환하는 과정은 위와 같다.
먼저 모델 좌표계 (MC) 를 world 좌표계로 변환하고 (WC) 이를 카메라 좌표계로 변환한다. (VC)
그리고 카메라 스크린 면으로 정사영을 내린 2차원 좌표계로 변환한다 (PC)
이제 스크린 면에서 카메라의 시야각을 고려하여 정규화 및 clipping 과정을 거친 좌표계로 변환하고 (NC)
이 좌표계는 -1 ~ 1 사이의 정규화된 좌표값으로 변환된 것이기 때문에 최종적으로 모니터 크기에 맞춰 viewport 에 맞는 좌표계로 변환하면 (DC) 모든 변환이 끝난다.
보통 proejection 과 normalization 부분은 하나로 합치는 경우가 많기 때문에 4번의 변환 단계를 거치는 것으로 볼 수 있다.
변환에는 행렬을 사용한다.
먼저 모델 좌표계 위의 한 점은 모델 좌표계 상에서 3차원 점 데이터로 구성되어 있다.
이 점을 위의 4개 변환행렬에 넣으면 screen space 상에서의 2차원 좌표로 변환된다.
우리의 목표는 이 각각의 4개 행렬을 구하는 것이다.
3차원과 3차원 사이의 변환행렬은 homogeneous 행렬로 표현한 뒤 변환한다.
homogeneous 좌표계는 3차원 점 뒤에 1이라는 성분을 추가하여 4차원 점으로 다루는 방법이다.
물체의 이동과 회전은 위와 같은 행렬을 사용한다.
tx, ty, tz 성분이 물체의 이동과 관련된 부분이고
r 로 기술된 부분이 물체의 회전과 관련된 부분
(x, y, z, 1) 이 homogeneous 좌표계 상 물체의 점 좌표이다.
회전은 특정 축을 기준으로 회전하는 것을 생각한다.
z 축을 중심으로 회전하는 경우, 좌표의 z 성분은 변하면 안되니 (3, 3) 위치를 1로 설정하고, 나머지 위치는 cos -sin siin cos 순으로 기술한다. (참고로 y축 중심 회전은 - 부호가 반대로 붙는다)
회전행렬은 모든 열/행벡터의 크기가 1이고, 모든 열/행벡터가 서로에 대해 수직이며, 회전행렬의 역행렬은 전치행렬이라는 특성이 있다.
회전 행렬은 지금 본 형태 외에도 비선형 방식인 오일러 앵글, 비선형이며 복소수를 사용하는 쿼터니언과 같은 것을 사용할 수도 있다.
그리고 이들은 서로 상호전환이 가능하고, 좌표축이 아닌 임의축에 대한 회전도 할 수 있다.
만약 회전, 이동이 모두 적용된 행렬의 역행렬을 구한다고 하면, 이 둘의 순서를 바꿔서 각각 역행렬을 구해주면 된다.
회전의 역행렬은 전치행렬, 이동의 역행렬은 이동 방향에 부호만 반대로 바꿔주면 된다.
여기에서 중요한 것은 이동이 먼저인지 회전이 먼저인지만 신경써주면 크게 어렵지 않다.
지금까지 나온 내용을 활용하면 모델 좌표계에서 월드 좌표계로 변환하는 과정을 어렵지 않게 적용할 수 있다.
이제 월드 좌표계를 카메라 좌표계로 변환해보자.
카메라 좌표계를 세팅할 때는 카메라의 위치 (eye), 카메라가 바라보는 물체의 위치 (center)
카메라의 기울기 각도 up-vector 3가지가 필요하다.
먼저 카메라 좌표계의 z 축은 center 과 eye 벡터를 빼서 구할 수 있다.
위와 같이 구한다. (-를 붙이는 것에 주의, center -> eye 방향으로 증가해야 한다)
다음으로 y축은 up 벡터를 활용하는데, 만약 up 벡터와 n 벡터가 수직이 아니라면 수직으로 맞춰주어야 한다.
우리가 구하는 것은 n 벡터에 수직인 up' 벡터이며
이렇게 구할 수 있다.
up 벡터는 주황색 벡터 + up' 벡터로 표현할 수 있으므로, up' 벡터는 up 벡터에서 주황색 벡터를 뺀것과 같다.
이때 주황색 벡터는 up 벡터를 z 축으로 정사영 내린 것으로 생각할 수 있다.
마지막으로 x 축은 z, y 축에 수직인 벡터를 구하면 되기 때문에 두 축벡터의 cross product를 하면 구할 수 있다.
world 좌표계에서 카메라 좌표계로 변환하는 행렬을 바로 구하는 것은 어려워서
보통 카메라 좌표계에서 월드 좌표계로 변환하는 행렬을 구한 뒤, 이 행렬의 역행렬 통해 변환행렬을 구한다.
지금까지 구한 카메라 좌표계의 원점과 축 벡터는 모두 월드 좌표계 기준으로 표현한 것이다.
이걸 카메라 좌표계 기준으로 변환하는 것은 원점을 (0, 0, 0) 으로 만들고, 각 축 벡터를 (0, 1, 0), (1, 0, 0), (0, 0, 1) 로 변환하는 것과 같다.
이 변환행렬을 바로 구하기가 힘들어서 이렇게 설정한 좌표계를 앞서 구한 월드 좌표계의 표현으로 바꾸는 변환행렬을 쓴 뒤, 이의 역행렬을 구하는 것이다.
다음으로 하는 작업은 카메라 좌표계의 점을 projection space 공간의 점으로 변환하는 projection 변환을 거친다.
카메라 좌표계와 projection 좌표계 사이의 z 축 거리를 초점거리 f 로 정의하면 카메라 좌표계 위의 모든 점을 카메라 좌표계상 z 값이 -f 인 위치로 옮겨서 표현하는 것과 같다.
이 초점거리가 짧아지면 더 넓은 면적을 화면에 담을 수 있게 되고, 초점 걸이가 멀어지면 좁은 면적을 화면에 담게 된다.
변환된 점 x', y' 은 위와 같이 계산된다.
z 로 나눠주므로 거리가 멀 수록 더 작아보이게 된다.
그리고 이 계산을 유도하도록 행렬을 짜면
이렇게 짤 수 있다.
임의의 점을 대입해보면 이렇게 원하는 대로 변환되는 것을 알 수 있다.
이때 z 성분의 값을 보면 0이 아닌 어떤 값이 들어있는데, 이 값이 z-buffer 알고리즘에서 사용하려고 했던 물체의 앞 뒤를 나누는 값이다.
이렇게 변환된 z 값은 0과 -f 사이에 위치하게 된다. (위 그림의 연두색 사각형 영역)
이를 통해 멀리 있는 물체는 듬성듬성 보이고, 가까이 있는 물체는 촘촘하게 보이는 효과를 낼 수 있다.
마지막으로는 projection spcae 좌표계위의 점을 스크린 해상도에 맞춰 변형해주어야 한다.
이때 스크린 좌표계의 y 축은 방향이 반대이고, x, y 축 비율이 달라지는 점을 이용해 scale 변환을 통해 구해준다.
또한 원점 역시 가운데에서 왼쪽 위로 이동해야하므로 이동변환도 적용해준다.
이에 대한 행렬변환은 위와 같다.
이런 변환 행렬을 통한 좌표 변환은 물체 (폴리곤) 의 꼭짓점에 대해서만 일어나고
스크린에 정점을 찍은 뒤에는 스캔 컨버전을 통해 면을 채우는 과정을 다시 역으로 수행한다.
이런 기법은 shading 기법이며 object centric 이고, ray tracing 은 image centric 기법으로 거꾸로 이미지에서 시작해서 물체 방향을 찾아나가는 렌더링 기법이다.
'CS > 컴퓨터그래픽스와 메타버스' 카테고리의 다른 글
[그래픽스] 7. Bilnn-Phong illumination model (3) | 2025.06.11 |
---|---|
[그래픽스] 6. Scan Conversion (1) | 2025.06.11 |
[그래픽스] 5. Rendering (3) - Lightening & Ray Tracing (2) | 2025.06.09 |
[그래픽스] 4. Rendering (2) - Texture Mapping, Shadow Generation (1) | 2025.06.08 |
[그래픽스] 3. Rendering (1) - Shading (0) | 2025.06.08 |