회전에 쿼터니언이 사용되는 이유는 무엇입니까?
저는 물리학 자이며 프로그래밍을 배우고 있으며 행렬 / 벡터 형식으로 작성하는 대신 회전에 쿼터니언을 사용하는 많은 사람들을 만났습니다.
물리학에서 우리가 쿼터니언을 사용하지 않는 아주 좋은 이유가 있습니다 (때때로 Hamilton / Gibbs 등에 대해 이야기하는 기괴한 이야기에도 불구하고). 물리학은 우리의 설명이 좋은 분석적 행동을 가져야합니다 (정확하게 정의 된 의미가 있지만 일반적인 인트로 수업에서 가르치는 것보다 훨씬 더 기술적 인 방식이므로 자세히 설명하지 않겠습니다). 쿼터니언에는 이처럼 좋은 동작이 없기 때문에 유용하지 않으며 벡터 / 행렬도 그렇기 때문에 사용합니다.
그러나 해석 적 구조를 사용하지 않는 고정 회전 및 설명으로 제한되어 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 느슨한 순위)과 동일). 이는 로컬 문제 일 뿐이며 좌표를 전환하고 축 퇴성에서 회전하여 해결할 수 있음을 의미합니다. 또는 두 개의 겹치는 좌표계를 사용합니다.
이 두 가지 (및 대안)가 어떻게 구현되는지 자세히 알지 못하기 때문에 수치 문제에 대해서는 확신이 없습니다. 쿼터니언을 다시 정규화하는 것이 회전 행렬에 대해 수행하는 것보다 쉽다는 것을 읽었지만 이것은 일반 행렬에만 해당됩니다. 회전에는이를 사소하게 만드는 추가 제약이 있습니다 (쿼터니언 정의에 내장 됨) (사실 동일한 자유도를 갖기 때문에 이것은 사실이어야합니다).
그렇다면 벡터 또는 다른 대안보다 쿼터니언을 사용하는 이유는 무엇입니까?
짐벌 잠금은 하나의 이유이지만 오일러 각도의 문제 일 뿐이며 쉽게 해결할 수 있습니다. 오일러 각도는 3 개의 숫자 만 저장하면되므로 메모리가 문제 일 때 계속 사용됩니다.
쿼터니언 대 3x3 회전 행렬의 경우, 쿼터니언은 크기 (스칼라 4 개 대 9)와 속도 (쿼터니언 곱셈이 3x3 행렬 곱셈보다 훨씬 빠름)에서 이점이 있습니다.
참고 모든 회전이 표현이 실제로 사용된다. 오일러 각도는 최소한의 메모리를 사용합니다. 행렬은 더 많은 메모리를 사용하지만 Gimbal 잠금을 사용하지 않으며 훌륭한 분석 속성을 가지고 있습니다. 쿼터니언은 가볍지 만 짐벌 잠금 장치가 없어 두 가지의 균형을 잘 맞 춥니 다.
물리학에서 우리가 쿼터니언을 사용하지 않는 아주 좋은 이유가 있습니다 (때때로 Hamilton / Gibbs 등에 대해 이야기하는 기괴한 이야기에도 불구하고). 물리학은 우리의 설명이 좋은 분석적 행동을 가져야합니다 (정확하게 정의 된 의미가 있지만 일반적인 인트로 수업에서 가르치는 것보다 훨씬 더 기술적 인 방식이므로 자세히 설명하지 않겠습니다). 쿼터니언에는 이처럼 좋은 동작이 없기 때문에 유용하지 않으며 벡터 / 행렬도 그렇기 때문에 사용합니다.
글쎄요, 저도 물리학 자입니다. 그리고 쿼터니언이 단순히 흔들리는 상황이 있습니다! 예를 들어 구형 고조파. 전자를 교환하는 두 개의 원자 산란이 있습니다. 궤도 스핀 전달이란 무엇입니까? 쿼터니언에서는 단지 곱셈입니다. 즉, 쿼터니언으로 표현 된 SH 기본 함수의 지수를 합산하는 것입니다. (레전드 르 다항식을 쿼터니언 표기법으로 가져 오는 것은 약간 지루합니다).
그러나 나는 그것들이 보편적 인 도구가 아니며 특히 강체 역학에서 사용하기가 매우 번거 롭다는 데 동의합니다. 그러나 물리학자가 얼마나 많은 수학을 알아야 하는가에 대한 질문에서 Bertrand Russell의 대답을 인용하기 위해 : "최대한 많이!"
어쨌든 : 왜 우리는 컴퓨터 그래픽에서 쿼터니언을 좋아할까요? 매력적인 속성이 많이 있기 때문입니다. 첫 번째는 그것들을 멋지게 보간 할 수 있습니다. 이것은 관절 주위의 팔다리와 같이 회전하는 것을 애니메이션하는 경우 중요합니다. 쿼터니언은 스칼라 곱셈과 정규화입니다. 이것을 행렬로 표현하려면 sin과 cos를 평가 한 다음 회전 행렬을 만들어야합니다. 그런 다음 벡터에 쿼터니언을 곱하는 것은 전체 벡터-행렬 곱셈을 수행하는 것보다 여전히 저렴하며 나중에 번역을 추가하는 경우에도 여전히 저렴합니다. 많은 수의 정점에 대해 많은 변환 / 회전을 평가해야하는 인간 캐릭터의 스켈 레탈 애니메이션 시스템을 고려한다면 이것은 큰 영향을 미칩니다.
쿼터니언 사용의 또 다른 좋은 부작용은 모든 변환이 본질적으로 직교한다는 것입니다. 변환 행렬을 사용하면 숫자 반올림 오류로 인해 모든 애니메이션 단계를 다시 정규화해야합니다.
no gimbal lock 인수는 오일러 각도의 문제 일 뿐이므로 이상하게 보입니다. 또한 좌표 문제 일뿐입니다 (극좌표에서 r = 0의 특이점 (Jacobian 느슨한 순위)과 동일). 이는 로컬 문제 일 뿐이며 좌표를 전환하고 축 퇴성에서 회전하여 해결할 수 있음을 의미합니다. 또는 두 개의 겹치는 좌표계를 사용합니다.
객체의 방향을 정의하기 위해 오일러 각도를 사용하는 것과 같은 많은 3D 응용 프로그램이 있습니다. 특히 flight-sims의 경우 쉽게 수정할 수있는 방식으로 방향을 저장하는 이론적으로 유용한 방법을 나타냅니다.
또한 "좌표 전환, 축퇴에서 회전 또는 두 개의 겹치는 좌표계 사용"과 같은 모든 작업에는 노력이 필요합니다. 노력은 코드를 의미합니다. 그리고 코드는 성능을 의미합니다. 당신이하지 않는 성능을 잃고 있는 것은 많은 3D 응용 프로그램에 대한 좋은 것은 아니다. 결국 쿼터니언을 사용하는 것만으로도 필요한 모든 것을 얻을 수 있다면이 모든 트릭으로 얻을 수있는 것은 무엇입니까?
이 두 가지 (및 대안)가 어떻게 구현되는지 자세히 알지 못하기 때문에 수치 문제에 대해서는 확신이 없습니다. 쿼터니언을 다시 정규화하는 것이 회전 행렬에 대해 수행하는 것보다 쉽다는 것을 읽었지만 이것은 일반 행렬에만 해당됩니다. 회전에는이를 사소하게 만드는 추가 제약이 있습니다 (쿼터니언 정의에 내장 됨) (사실 동일한 자유도를 갖기 때문에 이것은 사실이어야합니다).
방향의 여러 연속 회전을 처리 할 때 숫자 문제가 발생합니다. 우주에 물체가 있다고 상상해보십시오. 그리고 모든 타임 슬라이스에 약간의 요 변화를 적용합니다. 변경할 때마다 방향을 다시 정규화해야합니다. 그렇지 않으면 정밀 문제가 발생하여 문제가 발생합니다.
If you use matrices, each time you do matrix multiplication, you must re-orthonormalize the matrix. The matrix that you are orthonormalizing is not yet a rotation matrix, so I wouldn't be too sure about that easy orthonormalization. However, I can be sure about this:
It won't be as fast as a 4D vector normalization. That's what quaternions use to normalize after successive rotations.
Quaternion normalization is cheap. Even specialized rotation matrix normalization will not be as cheap. Again, performance matters.
There's also another issue that matrices don't do easily: interpolation between two different orientations.
When dealing with a 3D character, you often have a series of transformations defining the location of each bone in the character. This hierarchy of bones represents the character in a particular pose.
In most animation systems, to compute the pose for a character at a particular time, one interpolates between transformations. This requires interpolating the corresponding transformations.
Interpolating two matrices is... non-trivial. At least, it is if you want something that resembles a rotation matrix at the end. After all, the purpose of the interpolation is to produce something part-way between the two transformations.
For quaternions, all you need is a 4D lerp followed by a normalize. That's all: take two quaternions and linearly interpolate the components. Normalize the result.
If you want better quality interpolation (and sometimes you do), you can bring out the spherical lerp. This makes the interpolation behave better for more disparate orientations. This math is much more difficult and requires more operations for matrices than quaternions.
Opinion: Quaternions are nice.
Rotation matrix: Minor disadvantage: Multiplication of matrices is ~2 times slower than quaternions. Minor Advantage: Matrix-vector multiplication is ~2 times faster, and large. Huge disadvantage: Normalization! Ghram-Shmit is asymmetrical, which does not give a higher order accurate answer when doing differential equations. More sophisticated methods are very complex and expensive.
Axis (angle = length of axis) Minor advantage: Small. Moderate disadvantage: Multiplication and applying to a vector is slow with trig. Moderate disadvantage: North-pole singularity at length = 2*pi, since all axis directions do nothing. More code (and debugging) to automatically rescale it when it gets near 2pi.
Generally, we just want a mapping of a point X=(x,y,z) to a new point X'=(x',y',z') subject to the constraint that X^2 = X'^2. And there are lots of things that do this.
We absolutely do not just want that. There is a very important subtlety that lots of people miss. The construction you're talking about (draw the triangles and use trig, etc.) will correctly rotate one vector into the other. But there are infinitely many rotations that will do this. In particular, I can come along after you've done your rotation, and then rotate the whole system around the X' vector. That won't change the position of X' at all. The combination of your rotation and mine is equivalent to another single rotation (since rotations form a group). In general, you need to be able to represent any such rotation.
It turns out that you can do this with just a vector. (That's the axis-angle representation of rotations.) But combining rotations in the axis-angle representation is difficult. Quaternions make it easy, along with lots of other things. Basically, quaternions have all the advantages of other representations, and none of the drawbacks. (Though I'll admit that there may be specific applications for which some other representation may be better.)
It's worth bearing in mind that all the properties related to rotation are not truly properties of Quaternions: they're properties of Euler-Rodrigues Parameterisations, which is the actual 4-element structure used to describe a 3D rotation.
Their relationship to Quaternions is purely due to a paper by Cayley, "On certain results related to Quaternions", where the author observes the correlation between Quaternion multiplication and combination of Euler-Rodrigues parameterisations. This enabled aspects of Quaternion theory to be applied to the representation of rotations and especially to interpolating between them.
You can read the paper here: https://archive.org/details/collmathpapers01caylrich . But at the time, there was no connection between Quaternions and rotation and Cayley was rather surprised to find there was:
In fact the formulae are precisely those given for such a transformation by M. Olinde Rodrigues Liouville, t. v., "Des lois géométriques qui régissent les déplacements d'un système solide [...]" (or Comb. Math. Journal, t. iii. p. 224 [6]). It would be an interesting question to account, a priori, for the appearance of these coefficients here.
However, there is nothing intrinsic about Quaternions that gives any benefit to rotation. Quaternions do not avoid gimbal lock; Euler-Rodrigues parameterisations do. Very few computer programs that perform rotation are likely to truly implement Quaternion types that are first-class complex mathematical values. Unfortunately, a misunderstanding of the role of Quaternions seems to have leaked out somewhere resulting in quite a few baffled graphics students learning the details of complex math with multiple imaginary constants and then being baffled as to why this solves the problems with rotation.
The usual reasons I see are no gimble lock, or numerical issues.
And they are good reasons.
As you already seem to understand, quaternions encode a single rotation around an arbitrary axis as opposed to three sequential rotations in Euler 3-space. This makes quaternions immune to gimbal lock.
Also, some forms of interpolation become nice and easy to do, like SLERP.
...or using two overlapping coordinate systems.
From a performance perspective, why is your solution better?
I could go on, but quaternions are just one possible tool to use. If they do not suit your needs, then do not use them.
참고URL : https://stackoverflow.com/questions/8919086/why-are-quaternions-used-for-rotations
'code' 카테고리의 다른 글
클래스와 유형의 차이점 (0) | 2020.08.22 |
---|---|
JVM이 테일 호출 최적화를 방지합니까? (0) | 2020.08.22 |
Visual Studio 2013을 사용할 때 TFVC (TFS 버전 제어)와 소스 제어용 Git의 큰 차이점은 무엇인가요? (0) | 2020.08.22 |
Git으로 파일 권한 유지 (0) | 2020.08.22 |
GitHub에 공개 저장소의 비공개 브랜치가 있나요? (0) | 2020.08.22 |