OpenGL Camera Euler Angle 카메라 오일러각 [Learn OpenGL 쉬운 번역]

728x90
반응형
※ 본 포스팅은 learnopengl.com을 번역 및 가감한 포스팅이며, learnopengl에서는 번역 작업 참여를 적극 장려하고 있습니다!
아래 링크에서 원문을 확인할 수 있습니다.

 

Look around

입력 방식에 키보드 말고 마우스도 있으면 좋겠네요. 마우스로 scene을 둘러보려면 마우스를 움직일 때 cameraFront vector를 변경해야되겠죠. 하지만 마우스 회전에 따른 direction vector는 좀 복잡합니다. 삼각법이 좀 필요한데, 이해하지 않고 코드 사용법만 알아도 충분합니다.

 

Euler angles

Euler angles(오일러 각도)는 3D에서 회전을 나타내는 3개로 이루어진 값입니다. 오일러 각도는 pitch, yaw, roll 세 개의 각도가 있는데 그림으로 그 뜻을 봅시다.

pitch는 위나 아래를 보는 각도입니다. yaw는 왼쪽이나 오른쪽 각도입니다. roll은 원래 우주비행 카메라에서 사용되는 값으로 정면축을 기준으로 회전한 정도입니다. 각각 x,y,z 축 기준 회전으로 보면 됩니다. 이 오일러 각 세 개를 조합하면 모든 rotation vector를 계산 가능합니다.

 

현재 카메라에서는 yaw와 pitch만 있으면 충분합니다. roll은 다루지 않으려 합니다. pitch와 yaw를 direction vector로 변환합시다. 이 과정에서 삼각법이 필요한데 기본부터 해봅시다.

 

직각 삼각형을 하나 봅시다.

빗변의 길이를 1이라고 합시다. 삼각법에서 밑변의 길이는 \( \cos x/h=\cos x/1=\cos x \) 이고, 높이는 \(\sin y/h=\sin y/1=\sin y\) 입니다. 이렇게 각도에 따라 x,y 축 변들의 길이를 구하는 공식이 나옵니다. 이 공식으로 vector의 요소를 계산해봅시다.

 

삼각형을 더 멀리서 내다본다고 생각해보세요. 밑변과 높이는 각각 scene의 x축과 z축에 평행한 상태입니다. y축은 지금 화면을 향하고 있는 상태구요.

yaw angle을 x축을 시작으로 반시계 방향으로 좀 돌려서 빗변을 만들었고, 위와 같은 삼각형이 나왔다고 합시다. 삼각형의 x축 변의 길이는 cos(yaw)의 영향을 받고, z축 변의 길이는 sin(yaw)의 영향을 받겠죠. 

 

이걸 바탕으로 yaw 값으로 camera direction vector를 만들어냅니다. 

여기서 이해가 어려울 수 있습니다. yaw라는 각도를 이용해서 x축 변의 길이를 구한 cos yaw는 원점에서 시작하는 direction vector의 x값의 크기에 해당합니다. 마찬가지로 z축 변의 길이는 sin yaw는 direction vector의 z값의 크기에 해당하죠. 이걸 코드로 표현한 것 뿐입니다. 

glm::vec3 direction;
direction.x = cos(glm::radians(yaw)); // 각도를 먼저 라디안으로 변환하는 것에 유의하세요
direction.z = sin(glm::radians(yaw));

이렇게 yaw 값을 3D direction vector으로 변환하였습니다. 이제  pitch도 포함시켜야합니다. 이제 x,z 평면이 누워있도록 y축이 보이게 하겠습니다.

 

여기서는 삼각형의 y축 즉 높이고 sin(pitch)에 해당합니다. x축이 화면을 향하고 있는 거죠.

direction.y = sin(glm::radians(pitch));

삼각형에서 xz 평면에 속한 변은 cos(pitch)에 해당합니다. 이것도 direction vector에 포함합니다. 이렇게 yaw와 pitch에 대해 오일러 각도를 direction vector로 변환하면 다음과 같아집니다.

direction.x = cos(glm::radians(yaw)) * cos(glm::radians(pitch));
direction.y = sin(glm::radians(pitch));
direction.z = sin(glm::radians(yaw)) * cos(glm::radians(pitch));

이렇게 yaw와 pitch 값을 3D direction vector로 변환했습니다. 

 

scene을 구성할 때 object가 -z축을 방향도록 했었는데, yaw에 대한 삼각형을 보면 θ=0이면 direction vector는 +x축을 향합니다. 따라서 카메라가 -z축을 향하도록 기본설정하기 위해서는 yaw를 시계 방향으로 90도 회전한 상태로 설정해야합니다. 설정 할 때 오일러 각은 시계 방향은 (-)각도, 반시계 방향은 (+)각도이므로 시계 방향으로 회전하려면 음의 방향입니다.

yaw = -90.0f;

설정을 하긴 했는데, 이 yaw와 pitch 값을 어떻게 수정하죠?

728x90
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유