본문 바로가기
Etc

카메라 lookAt 함수의 이용 - Yaw, Pitch, Roll

by ses jeon 2019. 11. 12.

lookAt 이용을 하면서 왜 Yaw-Pitch-Roll에 대해서 이야기할까요?

그것은 3d 환경에서 회전은 3가지 요소를 가지고 있기 때문입니다.

 

사람이 이해하기 좋게 설명하자면 Yaw/Pitch/Roll 순이 됩니다. 각 요소가 어떤 것인지 봅시다.

 

1. Yaw

Yaw는 물체가 사람이라고 하면 동-서-남-북 어떤 방향을 바라보는 행동을 말합니다.

이런식으로 돌죠. 바로 이해되실겁니다. 인간의 관점에서 그래서 Yaw는 가장 큰 회전을 의미합니다.

 

2. Pitch

피치는 이렇게 몸의 기본 방향이 정해진후에 상하 관계를 나타내는 겁니다. 다음 그림처럼 말이죠.

이때의 눈의 시야가 회전방향이라고 보면 됩니다.

 

3. Roll

그렇다면 roll은 무엇일까요. 롤은 큰방향-상하방향 이 정해진 후에 좌우방향을 정한다고 보면 됩니다.

다음처럼 고개를 좌우로 돌린다고 생각하면 되죠.

 

==================================================

 

보통 카메라 lookAt 함수를 이용할때는 다음과 같습니다.

 

function lookAt( eye, target, up ) { ....

 

혹은

 

function lookAt( target ) { ...

 

이런식으로 eye, target, up 벡터만 넣고 정의하는 경우, 혹은 up도 없이 정의하는 경우도 있습니다.

 

이런 정보로 완벽한 회전 정보를 만들수 있을까요? 만들수 없습니다.

 

3d 회전을 나타내는 Quaternion의 정의를 봅시다.

 

쿼터니언 정의에 따르면 3D 회전은 하나의 벡터와 그 벡터를 기준으로한 하나의 회전이 필요합니다.

 

그렇다면 lookAt 함수는 회전을 어떻게 정의하는 걸까요? 그것은 Yaw-Pitch-Roll 에서 Roll을 일반적으로 없다고 생각하는 것입니다. 그것은 우리가 보통 카메라를 흔들지 않는 상태가 정상적이라고 생각하기 때문입니다.

 

특별한 상황이 아닌 다음에는 카메라의 좌우를 흔들지 않는것이 더 자연스럽다고 생각합니다. 그래서 카메라의 실제 up 벡터가 대부분 (0, 1, 0) 처럼 중력 반대방향을 상정합니다. 그래서 up가 아예 없는 함수도 쓰입니다.

 

그래서 eye와 target에서 구해진 방향 벡터와 (0,1,0) 벡터의 외적으로 right 벡터를 먼저 구하고, 그런후 그 구해진 right 벡터로 다시 실제 up 벡터를 구하는겁니다.

 

우리가 특수한 실제 up벡터를 입력하지 않는 이상(예를 들어 좌우가 30도 정도 기울어진) 카메라는 좌우로 흔들리지 않을 것입니다. 일반적인 경우는 이게 더 자연스럽습니다.

people like

people don't like usually

 

============== 다음 포스트에 이어집니다 ==================

 

 

댓글