회전에 쿼터니언이 사용되는 이유는 무엇입니까?


107

저는 물리학 자이며 프로그래밍을 배우고 있으며 행렬 / 벡터 형식으로 작성하는 대신 회전에 쿼터니언을 사용하는 많은 사람들을 만났습니다.

물리학에서 우리가 쿼터니언을 사용하지 않는 아주 좋은 이유가 있습니다 (때때로 Hamilton / Gibbs / etc에 대해 이야기하는 기괴한 이야기에도 불구하고). 물리학은 우리의 설명이 좋은 분석적 행동을 가져야합니다 (정확하게 정의 된 의미가 있지만 일반적인 인트로 수업에서 가르치는 것보다 훨씬 더 기술적 인 방식이므로 자세히 설명하지 않겠습니다). 쿼터니언에는 이처럼 좋은 동작이 없기 때문에 유용하지 않으며 벡터 / 행렬도 그렇기 때문에 사용합니다.

그러나 해석 적 구조를 사용하지 않는 고정 회전 및 설명으로 제한되어 3D 회전은 어느 쪽이든 (또는 몇 가지 다른 방법) 동등하게 설명 될 수 있습니다.

일반적으로 X 2 = X ' 2 라는 제약 조건에 따라 점 X = (x, y, z)를 새로운 점 X'= (x ', y', z ')로 매핑하기를 원합니다 . 그리고 이것을하는 많은 일들이 있습니다.

순진한 방법은 이것이 정의하고 삼각법을 사용하는 삼각형을 그리거나 점 (x, y, z)과 벡터 (x, y, z)와 함수 f (X) = X '사이의 동형을 사용하는 것입니다. 행렬 MX = X ', 또는 쿼터니언을 사용하거나 다른 방법 (x, y, z)을 사용하여 새 벡터를 따라 이전 벡터의 구성 요소를 투영합니다 . T. (a, b, c) (x', y ', z ') 등

수학의 관점에서 이러한 설명은이 설정에서 모두 동일합니다 (정리로서). 그것들은 모두 동일한 수의 자유도, 동일한 수의 제약 조건 등을 갖습니다.

그렇다면 쿼터니언이 벡터보다 선호되는 이유는 무엇입니까?

내가 보는 일반적인 이유는 짐벌 잠금이 없거나 숫자 문제입니다.

no gimbal lock 인수는 오일러 각도의 문제 일 뿐이므로 이상하게 보입니다. 또한 좌표 문제 일뿐입니다 (극좌표에서 r = 0의 특이점 (Jacobian 느슨한 순위)과 동일). 이는 로컬 문제 일 뿐이며 좌표를 전환하고 축 퇴성에서 회전하여 해결할 수 있음을 의미합니다. 또는 두 개의 겹치는 좌표계를 사용합니다.

이 두 가지 (및 대안)가 어떻게 구현되는지 자세히 알지 못하기 때문에 수치 문제에 대해서는 확신이 없습니다. 쿼터니언을 다시 정규화하는 것이 회전 행렬에 대해 수행하는 것보다 쉽다는 것을 읽었지만 이것은 일반 행렬에만 해당됩니다. 회전에는이를 사소하게 만드는 추가 제약 조건이 있습니다 (쿼터니언 정의에 내장 됨) (사실 동일한 자유도를 갖기 때문에 이것은 참이어야합니다).

그렇다면 벡터 또는 다른 대안보다 쿼터니언을 사용하는 이유는 무엇입니까?


2
"짐벌 잠금 장치 없음"은 어쨌든 거짓말입니다. 쿼터니언으로 두 개의 직교 회전을 사용하는 경우 오일러 각도에서 발생하는 것과 동일한 짐벌 잠금 문제가 있습니다. 3 번이 아닌 1 번의 로테이션에 대한 문제가 없습니다.
Damon

2
@Damon 이것은 완전히 사실이 아닙니다. mathoverflow.net/a/95908/97344
plasmacel

답변:


61

짐벌 잠금은 하나의 이유이지만 오일러 각도의 문제 일 뿐이며 쉽게 해결할 수 있습니다. 오일러 각도는 3 개의 숫자 만 저장하면되므로 메모리가 문제 일 때 계속 사용됩니다.

쿼터니언 대 3x3 회전 행렬의 경우 쿼터니언은 크기 (스칼라 4 개 대 9)와 속도 (쿼터니언 곱셈이 3x3 행렬 곱셈보다 훨씬 빠름)에서 이점이 있습니다.

참고 모든 회전이 표현이 실제로 사용된다. 오일러 각도는 최소한의 메모리를 사용합니다. 행렬은 더 많은 메모리를 사용하지만 Gimbal 잠금을 사용하지 않으며 훌륭한 분석 속성을 가지고 있습니다. 쿼터니언은 가볍지 만 짐벌 잠금 장치가 없어 두 가지의 균형을 잘 맞 춥니 다.


그러나 회전 행렬에는 많은 독립적 인 구성 요소가 없습니다. 2 차원 회전은 표현에 관계없이 3 차원의 세 좌표로 지정됩니다. 행렬은 회전보다 더 많은 일을 할 수 있기 때문에 일반적으로 더 많은 구성 요소를 가지고 있습니다. 그러나 회전의 경우 추가 구성 요소는 다른 구성 요소와 관련하여 결정됩니다.
JMP

1
@JMP : 당신 말이 맞아요. 많은 사람들이 매트릭스를 "압축"하여 필요한만큼의 정보 만 저장하지만 압축 된 매트릭스는 처리하기가 더 어렵 기 때문에 성능이 저하됩니다. 그것은 모두 메모리와 성능의 절충에 관한 것입니다.
Peter Alexander

10
@JMP 표준 행렬 곱셈 루틴에는 9 개의 값이 모두 필요합니다. 그들 중 3 개만이 독립적이지만 실제로 수학을 수행 할 때 여전히 9 개의 숫자에 해당하는 메모리가 필요합니다 (다시 말하지만 실제로 컴퓨터에서 행렬 곱셈을 수행하는 경우).
David Z

1
"쿼터니언 곱셈은 3x3 행렬 곱셈보다 훨씬 빠릅니다."정말? 쿼터니언 회전에는 24 개의 추가 / 멀티 작업 (2 배의 교차 곱 및 추가 작업으로 인해)이 필요하고 3x3 매트릭스에는 15 개의 추가 / 멀티 작업 만 필요합니다.
Marat Buharov

3D 방향을 완전히 표현하기 위해 2 개의 벡터 (6 개의 부동 소수점)를 사용할 수 있습니다. 세 번째 벡터는 십자형입니다. 매트릭스의 장점은 이미 많은 애플리케이션에 사용할 준비가 된 형태라는 것입니다. Euler와 Quats는 모두 추가 처리를 소비하는 패킹 (매트릭스에서) 및 풀기 (매트릭스로)가 필요합니다. Euler 및 Quats는 컴팩트 한 장기 보관에 유용 할 수 있습니다.
user3015682

39

물리학에서 우리가 쿼터니언을 사용하지 않는 아주 좋은 이유가 있습니다 (때때로 Hamilton / Gibbs / etc에 대해 이야기하는 기괴한 이야기에도 불구하고). 물리학은 우리의 설명이 좋은 분석적 행동을 가져야합니다 (정확하게 정의 된 의미가 있지만 일반적인 인트로 수업에서 가르치는 것보다 훨씬 더 기술적 인 방식이므로 자세히 설명하지 않겠습니다). 쿼터니언에는 이처럼 좋은 동작이 없기 때문에 유용하지 않으며 벡터 / 행렬도 그렇기 때문에 사용합니다.

글쎄요, 저도 물리학 자입니다. 그리고 쿼터니언이 단순히 흔들리는 상황이 있습니다! 예를 들어 구형 고조파. 전자를 교환하는 두 개의 원자 산란이 있습니다. 궤도 스핀 전달이란 무엇입니까? 쿼터니언에서는 단지 곱셈입니다. 즉, 쿼터니언으로 표현 된 SH 기본 함수의 지수를 합산하는 것입니다. (레전드 르 다항식을 쿼터니언 표기법으로 가져 오는 것은 약간 지루합니다).

그러나 나는 그것들이 보편적 인 도구가 아니며 특히 강체 역학에서 사용하기가 매우 번거 롭다는 데 동의합니다. 그러나 물리학자가 얼마나 많은 수학을 알아야 하는가에 대한 질문에서 Bertrand Russell의 대답을 인용하기 위해 : "최대한 많이!"

어쨌든 : 왜 우리는 컴퓨터 그래픽에서 쿼터니언을 좋아할까요? 매력적인 속성이 많이 있기 때문입니다. 첫 번째는 그것들을 멋지게 보간 할 수 있습니다. 이것은 관절 주위의 팔다리와 같이 회전하는 것을 애니메이션하는 경우 중요합니다. 쿼터니언은 스칼라 곱셈과 정규화입니다. 이것을 행렬로 표현하려면 sin과 cos를 평가 한 다음 회전 행렬을 만들어야합니다. 그런 다음 벡터에 쿼터니언을 곱하는 것은 전체 벡터-행렬 곱셈을 수행하는 것보다 여전히 저렴하며 나중에 번역을 추가하는 경우에도 여전히 저렴합니다. 많은 수의 정점에 대해 많은 변환 / 회전을 평가해야하는 인간 캐릭터의 스켈 레탈 애니메이션 시스템을 고려한다면 이것은 큰 영향을 미칩니다.

쿼터니언 사용의 또 다른 좋은 부작용은 모든 변환이 본질적으로 직교한다는 것입니다. 변환 행렬을 사용하면 숫자 반올림 오류로 인해 모든 애니메이션 단계를 다시 정규화해야합니다.


1
쿼터니언이있는 구형 고조파 / Legendre 다항식에 대한 참조가 있습니까? 나는 관련 주제를 다루는 논문을 제출할 예정이며 이에 대한 다른 작업을보고 싶습니다 (인용 할 수 있음).
Mike

4
@Mike : 불행히도 아무것도 게시되지 않았습니다. 불행히도 쿼터니언은 물리학 자들에게 여전히 다소 모호합니다. Quantum Mechanic 2의 강사가 이것을 연습으로 만들었고 나는 그것에 깜짝 놀랐습니다. 우리가 본질적으로 한 것은 exp ((a · iω + b · jθ + c · kη + d) r)라는 용어를 사용하는 것이 었는데, 여기서 r 자체는 복잡한 변수였습니다. 이것을 플로팅하면 3 차원 분포를 얻게됩니다 (먼저 쿼터니언 변수에 대한 지수 계열을 개발해야했습니다). 이것은 "푸리에"변환을 수행 할 수있게하여 알려진 SH 용어로 바꿀 수있는 결과를 가져옵니다.
datenwolf 2013

31

no gimbal lock 인수는 오일러 각도의 문제 일 뿐이므로 이상하게 보입니다. 또한 좌표 문제 일뿐입니다 (극좌표에서 r = 0의 특이점 (Jacobian 느슨한 순위)과 동일). 이는 로컬 문제 일 뿐이며 좌표를 전환하고 축 퇴성에서 회전하여 해결할 수 있음을 의미합니다. 또는 두 개의 겹치는 좌표계를 사용합니다.

객체의 방향을 정의하기 위해 오일러 각도를 사용하는 것과 같은 많은 3D 응용 프로그램이 있습니다. 특히 flight-sims의 경우 쉽게 수정할 수있는 방식으로 방향을 저장하는 이론적으로 유용한 방법을 나타냅니다.

또한 "좌표 전환, 축퇴에서 회전 또는 두 개의 겹치는 좌표계 사용"과 같은 모든 작업에는 노력이 필요하다는 점을 알고 있어야합니다. 노력은 코드를 의미합니다. 그리고 코드는 성능을 의미합니다. 당신이하지 않는 성능을 잃고 있는 것은 많은 3D 응용 프로그램에 대한 좋은 것은 아니다. 결국 쿼터니언을 사용하는 것만으로도 필요한 모든 것을 얻을 수 있다면이 모든 트릭으로 얻을 수있는 것은 무엇입니까?

이 두 가지 (및 대안)가 어떻게 구현되는지 자세히 알지 못하기 때문에 수치 문제에 대해서는 확신이 없습니다. 쿼터니언을 다시 정규화하는 것이 회전 행렬에 대해 수행하는 것보다 쉽다는 것을 읽었지만 이것은 일반 행렬에만 해당됩니다. 회전에는이를 사소하게 만드는 추가 제약 조건이 있습니다 (쿼터니언 정의에 내장 됨) (사실 동일한 자유도를 갖기 때문에 이것은 참이어야합니다).

방향의 여러 연속 회전을 처리 할 때 숫자 문제가 발생합니다. 우주에 물체가 있다고 상상해보십시오. 그리고 모든 타임 슬라이스에 약간의 요 변화를 적용합니다. 변경할 때마다 방향을 다시 정규화해야합니다. 그렇지 않으면 정밀 문제가 발생하여 문제가 발생합니다.

행렬을 사용하는 경우 행렬 곱셈을 수행 할 때마다 행렬을 다시 정규화해야합니다. 당신이 직교 정규화하는 행렬은 아직 회전 행렬이 아니기 때문에 저는 그 쉬운 직교 정규화에 대해 너무 확신 할 수 없습니다. 그러나 이에 대해 확신 할 수 있습니다.

4D 벡터 정규화만큼 빠르지는 않습니다. 이것이 쿼터니언이 연속적인 회전 후 정규화하는 데 사용하는 것입니다.

쿼터니언 정규화는 저렴합니다. 심지어 전문 회전 행렬의 정상화가되지 않습니다 으로 저렴. 다시 말하지만 성능이 중요합니다.

행렬이 쉽게 수행 할 수없는 또 다른 문제가 있습니다. 두 개의 서로 다른 방향 간의 보간입니다.

3D 캐릭터를 다룰 때 캐릭터의 각 뼈의 위치를 ​​정의하는 일련의 변형이있는 경우가 많습니다. 이 골격 계층은 특정 포즈의 캐릭터를 나타냅니다.

대부분의 애니메이션 시스템에서 특정 시간에 캐릭터의 포즈를 계산하기 위해 하나는 변형 사이를 보간합니다. 이를 위해서는 해당 변환을 보간해야합니다.

두 행렬을 보간하는 것은 간단합니다. 적어도 마지막에 회전 행렬과 비슷한 것을 원하는 경우입니다. 결국 보간의 목적은 두 변환 사이에 무언가를 생성하는 것입니다.

쿼터니언의 경우 4D lerp와 정규화 만 있으면됩니다. 그게 다입니다. 두 개의 쿼터니언을 취하고 성분을 선형으로 보간합니다. 결과를 정규화하십시오.

더 나은 품질의 보간을 원하면 (때로는 그렇게 할 수도 있습니다) 구형 lerp를 가져올 수 있습니다 . 이렇게하면 서로 다른 방향에서 보간이 더 잘 작동합니다. 이 수학은 훨씬 더 어렵고 쿼터니언보다 행렬에 더 많은 연산이 필요합니다.


7

의견 : 쿼터니언은 좋습니다.

회전 행렬 : 사소한 단점 : 행렬의 곱셈이 쿼터니언보다 ~ 2 배 느립니다. 사소한 이점 : 행렬-벡터 곱셈이 ~ 2 배 빠르고 큽니다. 단점 : 정규화! Ghram-Shmit은 비대칭이므로 미분 방정식을 수행 할 때 더 높은 차수의 정확한 답을 제공하지 않습니다. 더 정교한 방법은 매우 복잡하고 비용이 많이 듭니다.

축 (각도 = 축 길이) 사소한 이점 : 작음. 보통의 단점 : 삼각법을 사용하면 곱셈과 벡터 적용이 느립니다. 보통의 단점 : 모든 축 방향이 아무 작업도하지 않기 때문에 길이 = 2 * pi에서 북극 특이점. 2pi에 가까워지면 자동으로 크기를 다시 조정하는 더 많은 코드 (및 디버깅).


5

일반적으로 우리는 X ^ 2 = X '^ 2라는 제약 조건에 따라 점 X = (x, y, z)를 새로운 점 X'= (x ', y', z ')로 매핑하기를 원합니다. 그리고 이것을하는 많은 일들이 있습니다.

우리는 절대적으로 그것을 원하지 않습니다 . 많은 사람들이 그리워 하는 매우 중요한 미묘함이 있습니다. 당신이 말하는 구조 (삼각형을 그리고 삼각을 사용하는 등)는 한 벡터를 다른 벡터로 올바르게 회전시킬 것입니다. 그러나 이것을 할 무한히 많은 회전이 있습니다. 특히, 당신이 회전을 마친 후에 함께 가서 전체 시스템을 X '벡터를 중심으로 회전시킬 수 있습니다. 그것은 X '의 위치를 ​​전혀 바꾸지 않을 것입니다. 회전과 내 회전의 조합은 다른 단일 회전과 동일합니다 (회전 이 그룹을 형성하기 때문에 ). 일반적으로 이러한 회전을 나타낼 수 있어야합니다.

벡터만으로 이것을 할 있다는 것이 밝혀졌습니다 . (이것이 회전축 각도 표현입니다 .) 그러나 축 각도 표현에서 회전을 결합하는 것은 어렵습니다. Quaternions는 다른 많은 것들과 함께 쉽게 만듭니다. 기본적으로 쿼터니언은 다른 표현의 모든 장점을 가지고 있으며 단점은 없습니다. (하지만 다른 표현이 더 좋을 수있는 특정 응용 프로그램이있을 수 있음을 인정하겠습니다.)


4

내가 보는 일반적인 이유는 김블 잠금이나 숫자 문제가 없기 때문입니다.

그리고 그들은 좋은 이유입니다.

이미 이해하고있는 것처럼 쿼터니언은 오일러 3 공간에서 3 개의 순차적 회전과는 반대로 임의의 축을 중심으로 단일 회전을 인코딩합니다. 이렇게하면 쿼터니언이 짐벌 잠금에 영향을받지 않습니다 .

또한 SLERP 와 같은 일부 형태의 보간은 멋지고 쉽게 할 수 있습니다.

... 또는 두 개의 겹치는 좌표계를 사용합니다.

성능 측면에서 솔루션이 더 나은 이유는 무엇입니까?

계속할 수는 있지만 쿼터니언은 사용할 수있는 도구 중 하나 일뿐입니다. 필요에 맞지 않으면 사용하지 마십시오.


그러나 회전 행렬은 동일한 기능을 수행 할뿐만 아니라 깔끔하게 사용할 수있는 더 많은 대수적 속성을 가지고 있습니다. 매트릭스 조작 외에도 컴퓨터가 특히 잘하는 것 중 하나입니다.
paul23

3

회전과 관련된 모든 속성은 쿼터니언의 진정한 속성이 아니라는 점을 명심할 가치가 있습니다 . 3D 회전을 설명하는 데 사용되는 실제 4 개 요소 구조 인 Euler-Rodrigues Parameterisations의 속성입니다 .

Quaternions와의 관계는 순전히 Cayley의 "Quaternion과 관련된 특정 결과"라는 논문에 기인합니다. 여기에서 저자는 Quaternion 곱셈과 Euler-Rodrigues 매개 변수화의 조합 간의 상관 관계를 관찰합니다. 이를 통해 쿼터니언 이론의 측면을 회전 표현 및 특히 회전 사이의 보간에 적용 할 수있었습니다.

https://archive.org/details/collmathpapers01caylrich 에서 논문을 읽을 수 있습니다 . 그러나 당시에는 쿼터니언과 로테이션 사이에 연관성이 없었고 Cayley는 다음과 같은 사실을 알고 놀랐습니다.

사실 공식은 M. Olinde Rodrigues Liouville, tv, "Des lois géométriques qui régissent les déplacements d' un système solide [...]"(또는 Comb. Math. Journal, t. iii. 224 쪽 [6]). 여기서 이러한 계수의 출현에 대해 선험적으로 설명하는 것은 흥미로운 질문이 될 것입니다.

그러나 회전에 이점을 제공하는 쿼터니언에는 본질적인 것이 없습니다. 쿼터니언은 짐벌 잠금을 피하지 않습니다. Euler-Rodrigues 매개 변수화가 가능합니다. 회전을 수행하는 컴퓨터 프로그램은 일류 복잡한 수학적 값인 Quaternion 유형을 실제로 구현할 가능성이 거의 없습니다. 불행히도 쿼터니언의 역할에 대한 오해는 어딘가에서 유출 된 것으로 보이며 많은 수의 당황한 그래픽 학생들이 여러 가상 상수를 사용하여 복잡한 수학의 세부 사항을 배우고 왜 이것이 회전 문제를 해결하는지에 대해 당혹스러워했습니다.


1

누군가 읽을 수있는 대답 : 모든 표현에는 지루한 문제가 있습니다. 쿼터니언은 행렬보다 작지만 쿼터니언 곱셈은 단순한 벡터 내적 등이 아니며 실제로 두 개의 3x3 행렬의 내적보다 컴퓨터에서 더 많은 시간이 걸립니다. (컴퓨터는 일반 행렬로 작동하는 데 매우 능숙합니다)

매트릭스에는 다른 성가신 기능이 있습니다. 예를 들어, 그들은 장기적으로 안정된 생물이 아닙니다. 3D 공간에서 회전을 모델링 할 때 일반적으로 회전을 서로의 위에 누적하여 방향 행렬, 즉 참조 프레임의 방향을 저장하는 단일 회전 행렬입니다. 이 프로세스는 수백만 번의 추가 과정에 걸쳐 O- 매트릭스가 엄격한 회전 매트릭스 형태에서 벗어나게합니다. 이것은 행렬을 주기적으로 재구성하여 피할 수 있지만 이것이 사소하지 않은 조건이 있습니다. 즉, 단위 행렬의 회전이없는 경우입니다.

회전의 축 각도 표현 (또는 쿼터니언 표현)을 찾은 다음이를위한 행렬을 재현 할 수 있습니다. 대부분의 알고리즘은 제로 벡터를 생성 한 다음이 경우 제로 분할이 발생합니다. 이러한 종류의 경우에는 일반적으로 "if 0 then ..."-유형의 솔루션을 사용하여 이러한 경우를 피하는 것은 좋지 않습니다. a) 포크가 느리고 b) 다음과 별도로 기계 엡실론을 끝낼 수 있기 때문입니다. 특이점은 끔찍한 오류로 끝납니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.