-
오일러각 입력에 따라 Forward, Up, Right 벡터를 구하고 이를 토대로 3차원 회전 행렬 구하기이러저런 이야기 2019. 12. 19. 10:44
오일러 각이란? - 오일러 각의 3개의 각도만으로 회전을 표현한 것을 말합니다.
위의 큐브를 예로 들자면 z축 기준의 회전각을 roll, x축 기준의 회전각을 pitch, y축 기준의 회전각을 yaw라고 가정하겠습니다. 이 때 오일러각으로 물체의 forward, up, right 벡터를 구하려면 삼각 함수를 사용합니다.
[Yaw, Pitch값을 알 때]
위 사진 처럼 빗변의 길이를 1이라고 가정한다면, 밑변의 길이는 = cosθ = x/h -> x/1 ->cosθ = x가 나옵니다.
높이도 마찬가지로 sinθ = y/h -> y/1 -> sinθ = y가 나오게 됩니다. 물체의 방향 벡터를 계산하기 위해 이 공식을 사용합니다.
위 그림과 같이 물체가 xz평면 위에 앉아 있고 y축을 바라본다면, 이 물체의 up 벡터는 sin(Pitch)가 됩니다.
물체의 방향 벡터
Forward : cos(Pitch)
Up : sin(Pitch)
Right : cos(Pitch)
이렇게 표현을 했지만 Forward, Right도 정확히 알기 위해 다시 x축, z축으로 나뉘어야 합니다.
x축, z축으로 나뉜다면 z 방향 벡터(Forward) : sin (Yaw) / x축 방향 벡터(Right) : cos(Yaw) 가 됩니다.
물체의 방향 벡터
Forward : cos(Pitch) * sin(Yaw)
Up : sin(Pitch)
Right : cos(Pitch) * cos(Yaw)
이렇게 오일러각을 통해 3차원 방향 벡터들을 얻을 수 있습니다.
실제 오일러 각을 적용하기 위해서는 최종적으로 회전 행렬로 변환하여야 합니다. 회전 행렬로 변환에는 3차원 회전 행렬을 사용합니다. x, y, z축 기준의 회전각을 각각 a, b, r이라고 하면 x, y, z축을 기준으로 순차적으로 회전한 결과는 다음과 같습니다.
처음에 회전 행렬을 만들 때 x, y, z축 순서의 회전 행렬인 Pitch - Yaw - Roll 순서로 만들었습니다. 회전각의 순서에 따라 밑줄 친 부분은 달라지며 최종적으로 만들어질 회전 행렬 또한 달라집니다.
'이러저런 이야기' 카테고리의 다른 글
벡터의 내적 공식 유도하기 (0) 2019.12.19 카메라의 뷰 좌표계와 LookAt 행렬 유도하기 (0) 2019.12.19 [선형 변환과 행렬의 관계] (0) 2019.12.19 프리스텀 컬링 (0) 2019.12.17 [STL Vector] push_back과 emplace_back의 차이 (0) 2019.11.29