이번 글에서는 시점 변환에 대해 정리하려고 한다.
시점 변환은 주어진 그림에서 카메라의 위치를 이리저리 옮기는 것을 말한다.
카메라의 위치 정보를 설정하는 좌표계는 View Coordinate System (VCS, 시점좌표계) 이다.
따라서 시점을 옮기는 행위는 VCS이 변환되는 것을 의미한다.
이를 위해 사용하는 행렬이 뷰 행렬이다.
(그런데 GL에서는 Model 행렬과 View 행렬을 합해서 하나의 행렬로 취급한다고 한다.)
그렇다면 뷰 행렬은 어떻게 구할까?
위 이미지에서 보는 것이 뷰 행렬을 구하는 것과 관련되어 있다.
결국 우리가 원하는 것은 VCS를 구하는 것이다.
즉, VCS의 x, y, z 축을 결정하고, 이 축을 기준으로 기존 정점을 새롭게 표현하는 것이다.
이는 아래와 같은 방식으로 구한다.
우선 시점 좌표 (camera position), 바라보는 물체 (초점) 좌표 (target position), up vector 가 주어진다.
up vector는 카메라의 기울기 (orientation) 을 의미한다.
1. z축
z축은 시점 좌표와 초점 좌표를 이은 시선 벡터이다.
camera position - traget posisoin 이 z축이 된다.
2. y축
y축은 카메라의 기울기인 up vector 가 그대로 사용된다.
3. x축
x축은 위에서 구한 y축과 z축의 외적이다.
따라서 뷰 행렬을 구하는 함수는 아래와 같이 정의되어 있다.
위 정보를 입력하면 아래와 같은 뷰 행렬이 만들어진다.
여기에서 R, U, D 의 의미는 각각 아래와 같다.
왜 위치에는 음수가 붙고, 좌표축은 세로줄이 아니라 가로줄로 쓰일까?
그 이유는 카메라의 위치를 옮기고 회전시키는 행위를 볼 때, 실제로 카메라를 옮기는 것이 아니라, 전체 world 좌표계를 그 반대 방향으로 돌리는 것으로 보고 계산하기 때문이다.
카메라를 왼쪽으로 옮겨서 보는 것은, 상대적으로 world 좌표계를 오른쪽으로 옮겨서 보는 것 과 같다.
이를 시각적으로 표현하면 아래와 같다.
먼저 카메라의 위치와 초점의 위치를 이용해서 direction (z축)을 구한다.
여기에 up vector를 활용해서 x축을 구한다.
'CS > HCI 윈도우즈프로그래밍' 카테고리의 다른 글
[Computer Vision] 1. introduction (0) | 2024.05.29 |
---|---|
중간고사 최종 정리 (1) | 2024.04.22 |
[OpenGL] 17. Transformation (5) - Projection & Perspective Normalization (0) | 2024.04.20 |
[OpenGL] 16. Transformation (4) - 셰이더에 행렬 변환 적용하기 (1) | 2024.04.19 |
[OpenGL] 15. Transformation (3) - GLM 사용하기 (0) | 2024.04.19 |