0. 개요
컴퓨터 그래픽스에서 시점은 3차원 가상 공간을 바라보는 관점이라고 볼 수 있다. 3차원 공간에 있는 어떤 물체를 2차원 스크린에 표현하기 위해서 일반적으로 model, view, projection 행렬을 곱해주는데, 그 이유는 다음과 같다.
- 물체는 자신의 원점(0.0, 0.0, 0.0)을 기준으로 버텍스 정보를 가지고 있다.(모델 좌표계)
- 이 버텍스 정보에 model 행렬을 곱해주면 3차원 가상 공간의 월드 좌표로 변환이 된다.(모델 좌표계 -> 월드 좌표계 변환)
- 월드 좌표에 view 행렬을 곱해주면 뷰 좌표로 변환이 된다.(월드 좌표계 -> 뷰 좌표계)
- 뷰 좌표에 projection 행렬을 곱해주면 스크린 좌표로 변환이 된다.(뷰 좌표계 -> 스크린 좌표계)
이 중에서 월드 좌표에 view 행렬을 곱해주는 3번 과정은 물체를 바라보는 시점과 연관이 되어 있다. 뷰 좌표계에서는 바라보는 시점을 기준으로 물체의 회전, 움직임을 표현한다.
예를 들어 물체가 시점을 기준으로 z축 방향으로 10m 만큼 떨어져 있는 상황에서 관찰자가 z축 방향으로 3m 만큼 이동했다면 스크린에 표현되는 물체의 크기는 물체가 스스로 z축 방향으로 -3m 만큼 이동했을 때의 결과와 동일할 것이다. 마찬가지로 관찰자가 자신이 바라보고 있는 방향을 y축을 기준으로 90도만큼 회전을 했다면, 바라보는 모든 대상이 마치 y축을 기준으로 -90도만큼 이동한 것처럼 보일 것이다.
1. 마우스 이동에 따른 시점의 회전
1인칭 시점을 지원하는 게임, 프로그램에서 마우스를 이동하는 방향에 따라 플레이어의 시점이 함께 이동하는 경우가 많다. 이 경우 마우스를 화면의 중심에서 왼쪽으로 이동하면 플레이어의 캐릭터가 왼쪽을 바라보고, 중심에서 오른쪽으로 이동한다면 오른쪽을 바라볼 것이다. 수평 회전을 위해 고려해야 되는 부분은 다음과 같다.
우선 Windows API의 응용프로그램은 실행 중인 윈도우의 좌상단을 원점(0.0, 0.0)으로 하여 width, height 만큼의 크기를 가진다. 우리는 이 좌표를 NDC 좌표계로 변환해주어야 한다. 투영을 하면서 좌표 매핑을 손쉽게 하기 위해 NDC 좌표를 고려하는 것처럼, 응용프로그램의 해상도와 관계없이 NDC 좌표계 내부에서 마우스가 이동한 비율만큼 회전을 할 수 있도록 만들어 주기 위한 첫 번째 단계라고 보면 된다. NDC로의 전환은 다음과 같이 진행할 수 있다.
x 좌표에 대해서만 변환 작업을 진행한다. y 좌표도 동일한 방식으로 변환을 할 수 있다.
- 응용프로그램 상에서 x 좌표는 $ 0 <= x < w $의 범위를 가진다.
- 양변에 2를 곱해준다. 그 결과는 $ 0 <= x * 2 < 2 * w $가 된다.
- 양변을 w로 나눠준다. 그 결과는 $ 0 <= \frac{x * 2}{w} < 2 $가 된다.
- 양변에 1을 빼준다. 그 결과는 $ -1 <= \frac{x * 2}{w} - 1 < 1$이 된다.
이를 통해 x 좌표의 NDC 좌표를 구했으면 수평 회전을 할 수 있는 각도에 따라 그 비율을 구해 회전 행렬을 만들어 주면 된다.
'그래픽스' 카테고리의 다른 글
컨텍스트(Context) (0) | 2024.09.11 |
---|---|
이미지 스트라이드(Image Stride) (1) | 2024.06.16 |
yaw, pitch, roll (0) | 2024.06.09 |
림(rim) 효과 (0) | 2024.06.03 |
퐁(Phong) 반사 (0) | 2024.06.01 |