OpenGL

[OpenGL] LookAt Approach

usingsystem 2024. 5. 7. 16:05
728x90

카메라를 설정할 때 필요한 월드 프레임에서의 카메라 포지션(p 좌표), 유닛 벡터 (n 좌표), view up vector(v좌표)

n좌표와 v좌표를 설정하는 View Transform 설정에 대한 직접 계산을 보다 직관적인 방법으로 쉽게 계산하기 위한 대안으로 나온 것 이 LookAt Approach 방법이다.

 

OpenGL의 LookAt Approach는 3D 그래픽스에서 카메라의 위치와 방향을 지정하는 데 사용되는 방법입니다. 이 방법은 보통 OpenGL의 카메라 시스템을 설정하는 데 쓰이며, 보다 정확하게는 시점 변환(Transformations)을 수행하기 위해 사용됩니다.

OpenGL에서는 세 가지 주요 변환을 사용하여 객체를 표시합니다: 이동(Translation), 회전(Rotation), 및 확대/축소(Scaling). LookAt Approach는 이러한 변환 중 하나인 시점 변환(Transformations)에 해당됩니다.

LookAt Approach를 사용하면 우리는 세 가지 정보를 제공해야 합니다:

  1. 카메라의 위치(Position)  - at world(look at the point)
  2. 카메라가 바라보는 지점(Target) - eye world(from the view point)
  3. 카메라의 상단 방향(Up Direction) - up world(with the film up vector)

OpenGL에서는 이러한 정보를 바탕으로 카메라 행렬(Camera Matrix)을 생성합니다. 이 행렬은 세계 공간(World Space)에서 보는 것을 카메라가 보는 것으로 변환해줍니다.

간단히 말해, LookAt Approach는 카메라를 세계 공간에서 특정 위치로 이동시키고, 특정 지점을 바라보게끔 회전시키는 것입니다. 이를 통해 우리는 원하는 시점에서 장면을 볼 수 있게 됩니다.

계산 공식

p : VRP(view reference point) : 3D point. camera position

  • 가상 카메라의 위치를 의미함.

n : VPN(view plane normal) : view plane 에 수직

  • 카메라의 뒤쪽을 가리키는 수직인 벡터를 의미하며 어느 방향으로 볼지를 결정 (z 축 방향)

VRP : p = eye

VPN : n = -normalize(at - eye)

u = normalize (up * n)

v = normalize (n*u)

 

OpenGL GLM 함수

OpenGL의 lookAt 함수는 3D 그래픽스에서 카메라의 위치와 방향을 설정하는 데 사용됩니다. 이 함수는 세 가지 주요 매개변수를 사용합니다: 카메라 위치(Position), 목표(Target) 위치, 그리고 위쪽을 나타내는 벡터(Up vector). 이러한 정보를 기반으로 OpenGL은 카메라를 올바른 위치와 방향으로 설정하여 원하는 시점에서 장면을 보여줍니다.

 

lookAt 함수는 오른손 좌표계(lookAtRH)와 왼손 좌표계(lookAtLH)를 지원합니다.

glm::mat4 viewMatrix = glm::lookAtRH(glm::vec3 eye, glm::vec3 target, glm::vec3 up);
glm::mat4 viewMatrix = glm::lookAtLH(glm::vec3 eye, glm::vec3 target, glm::vec3 up);
glm::mat4 viewMatrix = glm::lookAt(glm::vec3 eye, glm::vec3 target, glm::vec3 up);

 

  • eye: 카메라의 위치를 나타내는 벡터입니다.
  • target: 카메라가 바라보는 지점을 나타내는 벡터입니다.
  • up: 카메라의 위쪽 방향을 나타내는 벡터입니다.
glm::vec3 eye = glm::vec3(0.0f, 0.0f, 5.0f);
glm::vec3 target = glm::vec3(0.0f, 0.0f, 0.0f);
glm::vec3 up = glm::vec3(0.0f, 1.0f, 0.0f);
glm::mat4 viewMatrix = glm::lookAt(eye, target, up);
728x90