■ 배경
3차원 공간에서의 이동과 크기 변환 행렬은 각 축들이 서로 독립적으로 직교하기 때문에 어렵지 않게 적용이 가능하다.
하지만 회전 변환 행렬 같은 경우에는 훨씬 복잡해진다. x, y, z 세 축이 서로 연관이 되어있기 때문에 크기, 이동 변환같이 단순히 차원을 추가하는 것만으로 해결이 안된다.
■ 회전의 방향에 따른 범용적 명칭
(출처: 링크)
3D 프로그램마다 다른 형태의 좌표계를 갖고있기 때문에 서로 다른 응용프로그램들의 오일러각(x, y, z)의 정보를 그대로 넘기면 원하는 방향대로 진행되지 않을 것이다. 예로 Unity의 x, y, z와 Unreal의 x, y, z의 축의 방향은 서로 다르다.
이런 호환성을 해결하기 위해 표준기저벡터를 축으로 하는 회전 방향에 따라 Yaw, Roll, Pitch로 나눠 불린다.
[생각해본 예시]
(1) Yaw는 사람에 빗대어 표현하면 고개를 절레절레 거부 표시를 할때 일어나는 회전
(2) Roll은 고개를 갸우뚱 할때 일어나는 회전
(3) Pitch는 긍정의 의미로 고개를 끄덕일 때 일어나는 회전
Unity 좌표계에서 Yaw, Roll, Pitch에 대응하는 축은 아래와 같다
Unity | 회전 |
X | Pitch |
Y | Yaw |
Z | Roll |
■ 각 기저 축의 회전 행렬
위와 같이 공간의 회전을 표현할 수 있는 명칭을 알게 되었다. 허나, 우리가 물체를 렌더링하려면 뷰행렬과 모델링 행렬 등을 통해 표현해야하는데 이때 사용할 회전행렬을 구해줘야한다.
각 표준기저벡터를 기준으로 세번의 연속적인 회전이 진행되는데 3D 공간에서는 x->y->z->x ... 순서로 세 축이 순환되기 때문에 아래와 같이 기저 축에 따른 회전행렬의 모습이 구별되는 것을 볼 수 있다.
(1) X축 기준의 회전 yz 평면의 회전을 의미한다.
(2) Y축 기준의 회전 zx 평면의 회전을 의미한다.
(3) Z축 기준의 회전 xy 평면의 회전을 의미한다.
여기서 주목할 점은 x축과 z축의 회전은 우리가 알고있듰이 기적베터에 정상적으로 [(cosθ, sinθ), (-sinθ, cosθ)]만큼 회전이 적용된 것을 알 수 있다. 하지만, y축 기준의 회전은 [(cosθ, -sinθ), (sinθ, cosθ)]로 전치행렬의 모습을 띄고있다.
처음엔 왜 그런가 싶었는데 그림을 그려 설명해주는 유투브 영상을보니 이해가 잘되었다.
출처(링크)
■ 최종 회전 행렬
위에서 구한 기저 축의 회전 행렬을 순서대로 적용하면 최종 회전행렬이 만들어진다. 이를 오일러 각에 대응하여 적용하면 되는데. Rotx 행렬, Roty 행렬, Rotz 행렬의 연산 순서를 정해야한다.
보편적으로 정해진 순서가 있는데 z -> x -> y 축 순서대로 회전을 적용해야한다. 이는 언리얼과 유니티 등 상용 엔진에서 도 적용되어있는 순서다. 이를 회전 방향에 따른 명칭으로 치환하면
Roll -> Pitch -> Yaw의 순서가 된다.
[기호]
[식]
위 행렬곱을 통해 회전행렬을 구하였다.
이 회전행렬의 열벡터는 표준기저벡터가 회전 변환된 로컬 축을 의미한다. 따라서 오일러 각으로 변환된 각 로컬축의 값은 다음 과 같이 계산해 얻을 수 있다.
Xlocal = (cosα cosγ + sinα sinβ sinγ, cosβ sinγ, -sinα cosγ + cosα sinβ sinγ)
Ylocal = (-cosα sinγ + sinα sinβ cosγ, cosβ cosγ, sinα sinγ + cosα sinβ cosγ)
Zlocal = (sinα cosβ, -sinβ, cosα cosβ)
위 식을 이용하면 사용자 임의로 정해준 오일러 각으로부터 세 개의 로컬 축을 계산해줘 벡터값을 변경해줄 수 있다.
(▼ 위 이론을 기반으로 회전 행렬을 구현해봤다)
https://yjhdevelopdiary.tistory.com/164
[OpenGL] 모델 행렬, 원근투영행렬 구현 및 적용
■ 모델 행렬 먼저 모델 행렬(Model Matrix 혹은 World Transform Matrix라고 칭함)은 아래와 같이 구성되어있다. 위 T, R, S는 순서대로 이동(Translation), 회전(Rotation), 크기(Scale) 변환 행렬을 뜻한다. 위 조합
yjhdevelopdiary.tistory.com
하지만 위와 같이, 유니티 엔진에서 사용자가 편하게 각도를 정할 수 있도록 인터페이스를 제공하는, 오일러 각으로 물체를 회전하다보면 짐벌락(Gimbal-lock) 현상이 일어나는데 이는 다음 포스팅에 업데이트할 로드리게스 공식과 사원수를 통해 다른 방식의 회전을 구현하여 해결해볼 예정이다.
[참고]
이득우의 게임 수학 | 이득우 - 교보문고
이득우의 게임 수학 | 39가지 실시간 렌더링 게임 프로그래밍 실습 예제를 하나씩 따라 해보며 독자가 직접 체득하는 흥미로운 게임 수학의 세계! 게임 개발자와 그래픽 아티스트들이 궁금해 했
product.kyobobook.co.kr
'Computer Graphics > Math' 카테고리의 다른 글
[Math] 비판정법, 매클로린 급수, 오일러 공식 (0) | 2023.12.31 |
---|---|
[Math] 외적, 백페이스 컬링, 로드리게스 회전 (3) | 2023.12.18 |
[Math] 브레젠험 알고리즘 with Unity (0) | 2023.12.09 |
[Math] 브레젠험 알고리즘 (Bresenham's algorithm) (0) | 2023.12.07 |
[Math] 내적, 램버트 반사, 시야각 판별 (1) | 2023.12.06 |