Camera Coordinates
좌표계는 어떤 게 있을까?
1. Modeling Coordinates
Modeling 하는 좌표계
실세계와 다른 독립된 좌표계이다.
2. World Coordinates
실세계의 좌표계
Modeling 된 물체들이 World Coordinates에 배치된다.
3. Camera Coordinates
카메라로 보는 좌표계
유저가 바라보게 되는 좌표계이다.
이 때 Camera Coordinates 는 어떻게 구성될까?
Camera Coordinates
Camera 는 그 자리에 있고, 그 위치에 대한 상대적인 위치를 정의하면 된다.
그림으로 살펴보자.
World Coordinates가 있고, Camera Coordinates가 있다고 하자.
이 때 World Coordinates에 있는 물체들을 Camera에 대해서 상대적으로 어떤 위치에 있는가를 알면 된다.
즉 World Coordinates를 Camera Coordinates에 맞춰 이동시키고 회전시키는 것이다.
1. 이동 (Translation)
Camera의 위치를 World Coordinates의 원점으로 이동시켜주면, Camera와 World가 Camera와 World가 서로 떨어진 거리만큼 볼 수 있게 된다.
=> Camera의 원점을 알면 된다.
2. 회전 (Rotation)
회전 Matrix 를 구하기 위해선, Camera Coordinates의 X축, Y축, Z축을 알아야 한다.
World Coordinates 에서 카메라를 보는 방향으로 Zview 를 구한다. (P0 - Pref)
Zview 와 World Coordinates의 y축을 이용하여 Yview를 구한다.
(이 때 Yview 는 기울어져 있으면 안된다. Camera의 Y축이 기울어져 있으면 고개를 꺾어 보는 것같이 부자연스럽게 바라보게 된다.)
Xview 는 Yview 와 Zview 의 Cross Product로 구한다.
이제 Camera Coordinates의 각 축들을 구했으니 회전 Matrix도 구해, World Coordinates를 회전시켜주면 된다.
Xview = u
Yview = v
Zview = n
P0 = (x0, y0, z0)
로 표기해보자.
이 때 Translation Matrix와 Rotation Matrix를 구하면 다음과 같다.
따라서 Camera에 대한 상대적인 위치를 정의해주기 위해선,
1. Camera의 위치를 World Coordinates로 이동시켜주고,
2. Camera에 맞춰 World 에 있는 물체를 회전시켜주면 된다.
즉 R*T 의 Transformation 연산을 적용하면 된다.
정리
Camera Coordinates 를 정의하기 위해 알고 있어야 할 것
1. Camera의 위치
2. Camera가 보는 방향
3. Camera Coordinates의 View-Up vector (Yview) -> Camera가 roll 되는 것을 방지.
이것들로 Transformation Matrix를 만들고, Camera에 대해 상대적인 위치를 정의해주면 된다.
OpenGL
glm::lookAt(vec3 eye, vec3 center, vec3 up)
eye : Camera의 World Coordinates 상의 위치
center : 화면 가운데의 world Coordinates 상의 위치
up : Yview Vector
#include <glm/gtc/matrix_transform.hpp> 에 존재.
mat4 viewingMatrix = lookAt(eye, center, up);
이렇게 만들어진 viewingMatrix는 Shader한테 보내져서 연산하게 된다.
[참고]
Interactive Computer Graphics: A Top-Down Approach with Shader-based OpenGL 6th edition / 저자: Edward Angel, Dave Shreiner / 출판사: Pearson Education
'IT > 컴퓨터 그래픽스' 카테고리의 다른 글
Rasterization (0) | 2021.01.31 |
---|---|
Perspective Projection (0) | 2021.01.18 |
GPU와 Buffer (0) | 2021.01.17 |
GPU에 data를 전달하기 (0) | 2021.01.17 |
[ 3D Rotation ] 임의의 축으로 회전하기 (4) | 2020.12.04 |
댓글