본문 바로가기
그래픽스ㆍDirectX

짐벌락과 쿼터니언 + Spherical Linear Interpolation

by imagineer_jinny 2022. 5. 21.

쿼터니언과 3차원 회전 | Quaternion | 사원수 - YouTube

 

 

쿼터니언

그래픽스나 로보틱스에서 3차원 회전을 표현할 때 많이 사용함

특히 캐릭터 애니메이션 같은 경우 각 관절들이 상대적인 회전을 표현할 때 필수적으로 사용됨

 

 

3차원 회전은 3자유도

 

Gimbal Lock

 

회전을 표현하려면 3자유도가 필요한데 앵글들이 조합이 잘못되면 자유도 하나가 사라져버려서 표현력이 떨어져버림

 

Euler (gimbal lock) Explained - YouTube

 

쿼터니언

쿼터: 4. 4원수

  • 쿼터니언은 복소수를 확장한 x, y, z, w 성분을 갖는 4차원 벡터로 세 개의 축을 동시에 회전시켜 축에 대한 종속 관계를 없앴으며 하나의 축이 소실되는 문제점을 방지할 수 있다.

참고자료: "게임 프로그래머를 위한 수학과 OpenGL 프로그래밍" / 강영민, 2015, GS인터비전

 

a, b, c 뒤에 i, j, k는 허수

얘를 표현을 할 때 a, b, c를 묶어서 vector 하나로 표현함

4자유도로 볼 수도 있고 뒤에 괄호를 보면 스칼라 하나 3차원 벡터 하나로 볼 수 있음

 

 

쿼터니언과 회전

3차원에서 회전을 표현할 때는 회전 축과 회전 각을 이용해서 하나의 회전을 표현함

이때 회전축은 3차원 벡터고 회전각은 스칼라 하나니까 4자유도가 됨

이 때 제약조건이 하나 더 붙게 되는데 회전축 벡터의 절댓값이 1이어야 함

1이면 유닛 쿼터니언이 됨

 

 

쿼터니언 왜 써?

마우스 이용해서 FPS 같은 경우 시점 조작할 때 회전을 반복해서 하게 되는데

이때 쿼터니언에 쿼터니언 곱하며 회전을 누적시킬 수 있다.

4 x 4 메트릭스 곱하는거나 그중에서 로테이션 메트릭스만 빼내서 곱한다고 쳐도 

3 x 3 메트릭스 두개 곱하는건데  

쿼터니언은 그거에 비해 속도가 빨라서 더 많이 씀

단순히 짐벌락 문제 없는 것 말고도 속도가 빨라서

 

 

쿼터니언을 이용해서 점 하나를 회전시킬 수 있다

내부적으로 구현된걸 보면 켤레복소수가 들어가있다

그래픽스 파이프라인에서는 내부적으로는 쿼터니언을 사용하고 있더라도 결국 그래픽스 파이프라인에 들어갈때는(GPU로 보내줄 때는) 결국 transformation matrix를 하나 만들어서 보내줌

그래서 쿼터니언 회전을 다시 회전 메트릭스로 만들어서 model transformation matrix나 view transformation matrix와 같이 변환을 합쳐서 그래픽스 파이프라인에 넣게 된다

 

 

Spherical Linear Interpolation

쿼터니언 두개를 Interpolation 시켜야 할 때가 있음

예를 들어 캐릭터 애니메이션을 하는데 두 시점에 대해 쿼터니언 두개가 따로 있으면 

두 키프레임 사이에 어떤 동작을 표현하고 싶다면  Interpolation을 많이 사용함

 

쿼터니언을 우리가 보통 사용하는 Linear Interpolation으로 Interpolation을 시켜버리면 

회전을 표현하는 구 위로 떨어지는게 아니고 unit length constraint가 깨지면서(SLERP) 안쪽으로 들어와버림(LERP) 

이때 LERP를 밖으로 다시 빼는 방법도 있겠지만 

보통 Spherical Linear Interpolation을 사용해서 Interpolation된 결과가 항상 Sphere 위에 있도록 하는 (SLERP) 방법을 사용함

 

 

댓글