쿼터니언이란 무엇입니까?


50

쿼터니언이란 무엇이며 어떻게 작동합니까? 또한 2D 평면에서 세 점을 사용하면 어떤 이점이 있습니까? 마지막으로 쿼터니언을 사용하는 것이 좋은 습관으로 간주되는 시점은 언제입니까?



역사적으로, 쿼터니언이 먼저 왔고 나중에 닷 및 크로스 곱은 쿼터니언에서 파생 된 것 같습니다.

2
나는이 애니메이션 문서는 매우 유익한 발견 acko.net/blog/animate-your-way-to-glory-pt2/#quaternions
AShelly

순수 수학, 나는 사원 수는 I² = j² = k² = IJK로 3 개 복잡한 숫자를 믿는다
Vinz243

쿼터니언은 회전을 부드럽게 보간하는 가장 좋은 방법입니다. 회전 행렬을 항상 보간하는 것은 아니기 때문에 회전 행렬 보간만으로는 작동하지 않습니다. 오일러 각도를 보간해도 부드럽게 회전하지 않습니다. 따라서 컴퓨터 그래픽이나 로봇 공학에서와 같이 회전 애니메이션에 쿼터니언이 필요합니다. 유용하지만, 종종 자주 사용되지 않는 확장 기능인 이중 쿼터니언 (dual quaternions)을 사용하여 변환 및 회전을 나타낼 수 있습니다.
Tobias B

답변:


43

수학적으로 쿼터니언은 4 차원의 복소수입니다. 그러나 게임 개발에서 Quaternions는 종종 인코딩을 통해 3D 공간에서의 회전을 설명하는 데 사용됩니다.

  1. 회전축 (3 차원 벡터 형태)
  2. 그 축을 얼마나 멀리 돌릴 지

이 정보는 쿼터니언 내부의 사인과 코사인으로 인코딩되므로 일반적으로 쿼터니언의 내부 구성 요소 (xyzw)를 개별적으로 명시 적으로 설정하거나 읽지 않아야합니다. 그런 식으로 실수를 저지르면 의미없는 결과를 얻을 수 있습니다. 쿼터니언 수학 라이브러리는 일반적으로 쿼터니언 (예 : 오일러 각도 또는 축 각도로 변환)을 수행하는 함수를 제공하여 수학이 정확하고 코드를 더 쉽게 읽고 이해할 수 있도록하는 부작용이 있습니다.

회전을 설명하는 다른 방법은 3 대신 고정 된 x, y 및 z (일명 오일러 각) 주위를 얼마나 멀리 회전시키는지를 설명하는 것입니다. 여기에는 4 대신 3 개의 숫자 만 필요하며 일반적으로 사용하기가 더 직관적입니다. 그러나 오일러 각도에는 짐벌 잠금 이라는 문제가 있습니다. 한 축을 중심으로 90 ° 회전하면 다른 두 축이 동일 해집니다. 쿼터니언에서는이 문제가 발생하지 않습니다.

3D 공간에서 회전을 표현하는 또 다른 방법은 4x4 변환 행렬을 사용하는 것 입니다. 그러나 변환 행렬을 사용하면 회전뿐만 아니라 크기 조절, 변환 및 기울이기도 할 수 있습니다. 회전 원할 경우 행렬은 과도하고 쿼터니언은 훨씬 빠르고 간단한 솔루션입니다.

이 문제는 3D 공간에서만 관련이 있습니다. 2D 공간에는 하나의 회전 축만 있습니다. 하나의 부동 소수점 숫자 또는 하나의 복소수로 회전을 표현할 수 있으므로이 문제가 발생하지 않습니다. 축이 평면을 향하거나 그 바깥을 향하는 쿼터니언으로 2d 평면에서 회전을 이론적으로 표현할 수 있지만 일반적으로 과잉입니다.


6
쿼터니언에서 시작하여 쿼터니언으로 끝나는 경우 짐벌 잠금은 쿼터니언에서 문제가되지 않습니다. 짐벌 잠금은 오일러 각도 또는 다시 변환하는 단계가있을 때 설정됩니다.
ratchet freak

2
쿼터니언은 축 + 각도 가 아니며 3 개의 복소수와 스케일입니다.
트랜지스터

11
@ transistor09 당신이 둘 다 맞다고 생각하십니까? 단위 쿼터니언의 3 성분 허수 부분은 회전 각도를 따르는 사인 벡터로 스케일링 된 회전 축을 따르는 단위 벡터로 해석 될 수 있습니다. 단위 쿼터니언의 실제 부분은 절반 회전 각도의 코사인입니다. 따라서 정확히 각도 축 형식은 아니지만 쿼터니언의 구성 요소를 축과 그 축 주위로 얼마나 멀리 돌릴 지에 대한 비선형 측정 값으로 해석 할 수 있습니다.
DMGregory

2
쿼터니언이 회전 행렬에 비해 어떤 이점이 있는지 언급 할 수도 있습니다. 결합 속도가 더 빠릅니다. 회전을 결합 할 때 두 개의 쿼터니언을 곱하면 행렬을 곱하는 것보다 적은 연산이 필요합니다.
Monica Monica 복원

3
실제로 2D 공간에서 복소수는 정확한 아날로그입니다. 복소수에 2D 점을 곱하고 회전 시켰습니다. 실제로 일반적인 sin / cos 회전과 정확히 동일합니다 (복수를 충분히 이해하면 분명해야 함). 이것은 약간 악용 될 수 있지만, 결국 2D 그래픽은 오늘날 성능을 많이 사용하지는 않으므로 복잡한 숫자를 사용하는 것이 편안하지 않으면 대부분의 개선이 이루어지지 않습니다 (대부분의 사람들은 결정하지 않았습니다) -엄청나게 열악한 쿼터니언 기반 코드에서 알 수 있듯이 : D).
Luaan

13

이것은 @Philipp의 답변에 추가하는 것입니다.

또한 2D 평면에서 세 점을 사용하면 어떤 이점이 있습니까?

당신이 관심있는 모든 회전에 있다면 당신은 정말 쿼터니언이 필요하지 않습니다 즉, 비행기 에 대한 z 축. 이 경우 요 각도 만 있으면되고 z 축을 중심으로 연속적인 회전이 출퇴근한다는 사실을 활용할 수 있습니다. 따라서 원하는 순서대로 회전을 적용 할 수 있습니다.

XY 평면이 아닌 평면에서 회전하는 경우 상황이 다릅니다. 이 회전은 임의의 3D 축을 중심으로 회전하는 것과 같습니다. 이제 두 가지 선택이 있습니다.

  • XY 평면과 일치하도록 평면을 3D로 회전 한 다음 요 (yaw)하고 다시 변환 하거나

  • 회전은 3D로 시작한다고 생각하십시오.

두 번째 선택은 코딩하기가 더 쉽습니다. @Philipp이 말했듯이 쿼터니언은 짐벌 잠금을 피합니다 (중간 RPY 또는 축 / 각도 변환을 피하는 경우).

마지막으로 쿼터니언을 사용하는 것이 좋은 습관으로 간주되는 시점은 언제입니까?

3D 회전이있을 때마다 쿼터니언을 사용하는 것이 좋습니다.

예 :

  • 에서 Qt는 . 쿼트는 slerp 함수 에서와 같이 회전 사이를 쉽게 보간 할 수 있습니다.

  • ROS 는이를 로봇 포즈 변환에 사용합니다.

  • 에서 총알 역학 엔진

  • 매우 정교한 응용 프로그램 은 고전적인 3D 역학에 사용하기 위해 여기 를 참조 하십시오 .


" 3D 회전이있을 때마다 쿼터니언을 사용하는 것이 좋습니다." 그냥 약간 너무 강하다. 거의 항상 좋습니다. 대안이 적절한 상황이 있습니다. (불완전의 예로서, 쿼터니언의 n 번째 근은 여러 값을
갖습니다

1
쿼터니언은 사용하는 상품이며 구현하기가 어렵다. 짐 벌락을 알고 있다면 그들 없이도 잘 지낼 수 있습니다.
Hatoru Hansou
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.