3 차원에서 회전 및 배율을 나타내는 데 쿼터니언을 언제 사용해야합니까?


13

쿼터니언 (복소수의 4 차원 확장)은 3D 벡터의 회전 및 스케일링을 나타내는 데 사용될 수 있으며, 3D 벡터에 쿼터니언을 적용하는 데는 2 개의 쿼터니언 곱셈이 포함되므로 해당 변환 행렬에 의한 곱셈보다 연산이 적게 필요합니다. 그러나 특히 셰이더 코드에서 선형 및 아핀 변환 행렬이 대신 사용되는 경우가 많습니다.

해당 변환 행렬 대신 쿼터니언을 사용하여 3 차원으로 스케일링 및 회전을 나타내는 것이 적절하고 바람직한 경우 (속도, 안정성 등으로 인해)?


답변:


8

나는 오해로 시작하고 싶습니다 :

최신 GPU (NVIDIA, 그리고 남섬 이후 AMD)는 기본적으로 하드웨어에서 벡터 / 매트릭스 연산을 의미있게 지원하지 않습니다. 그것들은 다른 방향의 벡터 아키텍처입니다 : 벡터의 각 구성 요소 (x, y, z)는 일반적으로 레인의 각 요소에 대한 값을 포함하는 32 또는 64 값입니다. 따라서 3D 내적은 일반적으로 지침이 아니며 곱하기와 곱하기 2 개입니다.

또한 곱하기-덧셈과 같은 기본 연산 계산, 벡터를 쿼터니언으로 변환하는 것은 벡터를 행렬로 변환하는 것보다 비용이 많이 듭니다. 3x3 행렬로 벡터를 변환하는 것은 3 곱하기와 6 곱하기 덧셈이고, 쿼터니언으로 벡터를 변환하는 것은 두 쿼터니언 곱입니다. 각 쿼터니언 곱은 4 곱하기 12와 곱하기 덧셈으로 구성됩니다. (이보다 더 순진한 방법으로 얻을 수 있습니다. 여기에는 더 빠른 방법으로 작성된 글이 있지만) 벡터에 행렬을 곱하는 것만 큼 저렴하지는 않습니다.

그러나 수행하는 ALU 조작 수를 계산하여 성능을 항상 판별하지는 않습니다. 쿼터니언은 동등한 매트릭스보다 적은 공간을 필요로하며 (순수한 회전 / 스케일 만 수행한다고 가정), 이는 스토리지 공간과 메모리 트래픽이 적다는 의미입니다. 이것은 애니메이션에서 종종 중요합니다 (편리한 쿼터니언의 보간 속성이 나타나는 경우도 편리합니다).

그 이외의:

  • 행렬은 더 많은 작업을 지원하기 때문에 더 많은 공간을 사용합니다. 3x3 행렬에는 비 균일 스케일, 기울기, 반사 및 직교 투영이 포함될 수 있습니다.
  • 행렬은 기본적으로 기본 벡터로 생각할 수 있으며 이러한 벡터로 쉽게 구성 할 수 있습니다.
  • 하나의 쿼터니언에 다른 쿼터니언을 곱하면 (두 회전 구성) 한 매트릭스에 다른 매트릭스를 곱하는 것보다 작업이 줄어 듭니다.

재미 있고 Intel Haswell GPU에서 ARBfp의 DP3명령은 3 곱하기 2 추가로 구현 된 것으로 보입니다 . INTEL_DEBUG=fsIntel Linux 드라이버 출력 : paste.ubuntu.com/23150494를 참조하십시오 . 드라이버가 열악한 지 또는 HW에 특별한 벡터 mul 명령어가 없는지 확실하지 않습니다.
Ruslan

@Ruslan 하드웨어에는 특별한 벡터 mul 명령어가 없을 가능성이 큽니다. 보다 정확하게 는 그렇게 하지만 vec3 / vec4 차원에서는 벡터화되지 않고 아키텍처의 SIMD 너비 (레인)에 걸쳐 벡터화됩니다.
John Calsbeek

4

(여기에 많은 정보가 joojaa 's and ratchet freak 's answer에서 뻔뻔스럽게 빌려 왔습니다.)

매트릭스 장점

  • 비 균일 스케일링 및 회전, 기울이기, 투영
  • 번역 (이중 쿼터니언을 사용하지 않는 경우)
  • 기본 하드웨어 지원
  • 쿼터니언에는 종종 초월 함수가 필요합니다.
  • 이해하기 쉬움

쿼터니언의 장점

  • 벡터를 변형하려면 더 적은 연산이 필요합니다 (또는 John의 답변 참조).
  • 다른 쿼트에 의한 변환에는 훨씬 적은 작업이 필요합니다
  • 쿼터니언은 4 개의 플로트를 차지하지만 (듀얼 인 경우 8 개) 매트릭스는 9-16 개의 플로트를 차지합니다.

균일 한 강체 변환 만 수행한다는 것을 알고 있다면 벡터 / 쿼트 쌍은 일반적으로 저장 공간 측면에서 3x4 매트릭스에서 확실한 승리입니다 (벡터 / 쿼트 : 7 또는 8 플로트 대 mat3x4 : 12 플로트). 처리 속도. 쿼터니언이 여전히 당신에게 신비로운 부두교라면, 이 웹 시리즈를 사용해보십시오 .


3

매트릭스는 쿼터니언보다 더 많은 변형을 제공하며 매트릭스를 비대칭, 비틀림 및 비 균일하게 스케일링 할 수 있습니다. 추가 변환 기능이 필요하지 않은 경우 엔진이 쿼터니언 기반 변환 만 수행하도록 할 수는 없습니다.

행렬은 기본 벡터를 알고있는 공간을 만들어야 할 때 매우 편리합니다. 직교로 투영 할 때와 같이. 또한 행렬 공간에서 원근 변환을 수행하는 것은 쉽습니다. 매트릭스는 물건을 투사 할 때 우수합니다.

어떤 방식으로 매트릭스는 가장 일반적인 명칭을 나타내며 마스터하고 이해하기에 너무 복잡하지 않기 때문에 일반적으로 사용됩니다. 표준화의 이점은 사용자 정의 워크 플로에서 얻는 이점보다 훨씬 큽니다. 매트릭스 연산을 수행하는 방법은 잘 알려져 있습니다. 쿼트는 가장 보편적 인 것은 아니지만 uni에 즉시 소개됩니다. 쿼터니언을 뒤집는 방법을 아는 사람이 몇 명인지 물어보십시오. 반면 고등 교육 기관에서는 행렬을 뒤집는 방법을 모르는 많은 학생들을 찾지 않습니다.

그래픽 카드에는 매트릭스 작업을위한 전용 파이프도 있습니다.


나는 실제로 이것에 대해 생각하고 있었다. 필자는 또한 매트릭스 및 쿼트 계층 구조 이외의 다른 모델링 파이프에 대한 접근 방식을 묻습니다.
joojaa

3

쿼터니언은 균일 한 스케일링과 회전 만 나타낼 수 있으므로 다른 것이 필요한 경우이를 나타내는 무언가를 추가해야합니다.

하나의 추가 vec3 또는 이중 쿼터니언을 사용하여 번역 할 수 있습니다 . 그러나 균일하지 않은 스케일링과 깎임은 mat4로 더 잘 표현됩니다. 프로젝션 변환 (실질적으로 비 균일 스케일링 및 스와핑 z 및 w)은 쿼터니언으로 나타낼 수 없습니다.

쿼터니언은 보간 할 때 큰 이점이 있습니다. slerp은 쿼터니언을 사용하여 가장 쉽게 계산됩니다.

쿼터니언 (또는 듀얼 쿼터니언) 적용은 GPU에 내장되어 있지 않으므로 벡터 연산을 사용하여이를 구현해야합니다. 대부분의 쿼터니언 라이브러리는 스케일을 나타 내기 위해 쿼터니언을 사용하지 않을 것이라 가정합니다.

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