일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 유니티 시야 가림
- Quaternion.Euler
- c++
- 유니티 오브젝트 풀링
- 너비 우선 탐색
- 이진트리
- 유니티 Vector3
- 알고스팟
- LFS
- 유니티 Rotate
- git-lfs
- 유니티
- 유니티 InputManager
- Mathf.Clamp
- 깊이 우선 탐색
- 유니티 ResourceManager
- 코드블럭 테마
- 유니티 리소스매니저
- 유니티 머신러닝
- 소스코드 줄번호
- 유니티 Collision
- unity
- InputManager
- LookRotation
- ML-Agents
- 오브젝트 풀링
- Raycast
- c++ 문자열 자르기
- LayerMask
- eulerAngles
- Today
- Total
무민은귀여워
짐벌락(gimbal lock)과 사원수(쿼터니언, quaternion) 본문
짐벌락(gimbal lock)
오일러각을 이용한 회전(=순서가 있는 3회의 회전축 회전)은 세 개의 숫자로 나타낼 수 있어 단순하고 이해하기 쉽지만 문제도 있다. 짐벌락(gimbal lock)이라는 현상이다.
항공기나 선박, 우주선에는 자이로스코프라는 기기로 각도와 각속도를 측정하여 자세 제어를 한다. 자이로스코프 내부에는 짐벌이라는 부품이 있어, 세 개의 고리가 각 축의 회전을 표현한다. 안쪽 고리는 바깥 고리의 회전에 연동해서 위치를 바꿈으로써 롤-피치-요와 같은 3축 자유도의 회전에 대응한다.
그런데, 보통은 3축의 자유도로 회전을 표현할 수 있는 짐벌 고리가 겹쳐지면서, 첫 번째 회전과 세 번째 회전의 두 개 축이 거의 일치하여 자유도가 2축으로 한정되는 사태가 발생한다. 이것이 짐벌락 현상이다.
사원수(quaternion)
여기서, 3차원 공간에서의 회전을 표현하고자 도입된 것이 바로 사원수(쿼터니언, quaternion)다.
사원수에 의한 회전의 특징은 다음과 같다.
- 짐벌락이 발생하지 않는다.
- 행렬보다 점유 메모리 영역이 작고 계산 부하도 낮다.
- x, y, z 축에 국한되지 않는 임의의 회전축에서의 회전을 손쉽게 할 수 있다.
- 회전을 간단히 합성할 수 있고 오차도 쉽게 발생하지 않는다.
- 두 개 회전사이의 매끄러운 보간을 표현할 수 있다.
사원수는 복소수의 확장으로 생각할 수 있다.
복소수로는 실수부와 허수부의 두 개의 실수를 사용하여 2차원 복소평면 좌표로서의 벡터를 나타낼 수 있었다.
수학자 해밀턴은 2차원 평면상의 위치를 나타낼 수 있는 복소수와 마찬가지로, 3차원 공간 내의 좌표를 표현하면서 복소수처럼 다룰 수 있는 세 개의 실수를 발견하고자 했다.
네 개의 실수를 이용하면(교환법칙은 성립하지 않지만) 곱셈과 나눗셈을 정의할 수 있다는 사실을 알아냈고 여기서 사원수의 개념이 탄생했다.
사원수 q는 네 개의 기저를 사용한다. 실수 1과, 복소수로부터 확장된 허수축(imaginary axes)으로서의, 실수가 아닌 i, j, k다(이 경우 i는 복소수의 허수 단위와는 다르다). 이 네 개의 기저와 실수 w, x, y, z를 사용해 사원수 q를 다음처럼 정의한다.
x = y = z = 0 일 때 q 는 실수(real)이고, w = 0 일 때 q 는 순허수(pure imaginary)다. 또한 w 부분을 스칼라부(scalar part), xi + yj + zk 부분을 벡터부(vector part)라고 한다.
실제로 스칼라와 벡터라는 개념은 사원수에서의 구분에서 비롯되었다.
복소수는 1과 i라는 두 개의 선형독립인 기저벡터로 평면을 표현할 수 있었지만, 사원수는 1, i, j, k라는 네 개의 선형독립인 기저벡터로 4차원 공간을 나타낸다.
사원수 q = w + xi + yj + zk는 w, x, y, z의 조합으로 다음처럼 표기한다.
q = [w x y z]
스칼라부의 w와 나머지 벡터부를 구별해서 다음과 같이 표기할 수도 있다.
q = [w (x y z)]
또한, 스칼라부를 나타내는 스칼라 s 와 벡터부를 나타내는 벡터 v로 표기하기도 한다.
============================================================================
(참고) 유니티에서...
오일러각에도 장점은 있다. 그것은 세 개 각도의 조합이라는, 단순하면서도 인간이 이해할 수 있는 수치로 회전을 표현할 수 있다는 점이다. 유니티의 Transform의 UI는 그 점을 중시하여, 인간이 직관적으로 오브젝트의 기울기를 설정할 수 있도록 오일러각을 Rotation으로서 Inspector UI에 공개한다. 그 대신, 유니티 내부에서는 회전은 항상 사원수로 정리된다. 한편, 모델 뷰 변환 행렬로서 유니티에서 GPU상의 셰이더 프로그램에 전달될 때는, 회전은 행렬로 변환된다.
'IT > 기타' 카테고리의 다른 글
[그래픽스] 빛 조명 프레넬 효과 (0) | 2021.05.18 |
---|---|
Readme 파일에 이미지 넣기 (마크다운 이미지) (6) | 2021.05.18 |
memo) redis 패턴으로 데이터 삭제 (0) | 2021.05.17 |
stack 구현 (0) | 2021.05.17 |
list 구현 (0) | 2021.05.17 |