四元数を使用して3Dで回転とスケーリングを表すのはいつですか?


13

クォータニオン(複素数の4次元拡張)は、3Dベクトルの回転とスケーリングを表すために使用でき、3Dベクトルへのクォータニオンの適用には2つのクォータニオン乗算が含まれるため、対応する変換行列による乗算よりも少ない操作で済みます。ただし、特にシェーダーコードでは、代わりに線形およびアフィン変換行列がよく使用されます。

対応する変換マトリックスの代わりに、クォータニオンを使用してスケーリングと回転を3次元で表現するのが適切で望ましい(速度、安定性などのため)のはいつですか?


回答:


8

私は誤解から始めたい:

最新のGPU(かなり長い間NVIDIA、および南諸島以降のAMD)は、ハードウェアでネイティブにベクトル/行列演算を有意にサポートしていません。これらは異なる方向のベクトルアーキテクチャです。ベクトルの各コンポーネント(x、y、z)は通常、レーンの各要素の値を含む32または64の値です。したがって、3Dドット積は通常、命令ではなく、乗算と2つの乗算加算です。

さらに、乗加算のようなプリミティブ演算を数え、四元数によるベクトルの変換は、行列によるベクトルの変換よりもコストがかかります。3x3行列によるベクトルの変換は3つの乗算と6つの積和であり、四元数によるベクトルの変換は2つの四元数乗算であり、それぞれ4つの乗算と12の積和で構成されます。(これよりもナイーブは少なくなります。ここではより高速な方法を説明しますが、それでもベクトルに行列を掛けるほど安くはありません。)

ただし、パフォーマンスは、実行するALU操作の数を単にカウントするだけでは必ずしも決定されません。クォータニオンは、同等のマトリックスよりも必要なスペースが少なく(純粋な回転/スケールのみを実行していると想定)、ストレージスペースとメモリトラフィックが少なくなります。これは多くの場合アニメーションで重要です(クォータニオンの優れた補間プロパティが現れる場合にも便利です)。

それ以外:

  • 行列はより多くの操作をサポートするため、より多くのスペースを使用します。3x3マトリックスには、不均一なスケール、スキュー、反射、および正射影を含めることができます。
  • 行列は基本的に基底ベクトルと考えることができ、それらのベクトルから簡単に構築できます。
  • 1つのクォータニオンと別のクォータニオンの乗算(2つの回転の合成)は、1つの行列の別の乗算よりも少ない操作です。

おかしい、とインテルハスウェルGPU ARBfpの上のDP3命令3つの乗算と2つの加算として実装され、参照表示されますINTEL_DEBUG=fsインテルのLinuxドライバからの出力を:paste.ubuntu.com/23150494。貧弱なドライバーなのか、HWが特別なベクトルmul命令を実際に持っていないのかはわかりません。
ルスラン

@Ruslanハードウェアに特別なベクトルmul命令がないだけの可能性が非常に高いです。ただし、より正確に、しかし、それらアーキテクチャ(レーン)のSIMD幅にわたってベクトル化され、vec3 / vec4次元にわたってベクトル化されません。
ジョンカルスベーク16

4

(ここでの多くの情報は、私自身のメモとともに、joojaaとラチェットフリークの回答から恥知らずに借りました。)

マトリックスの利点

  • 不均一なスケーリングと回転、傾斜、投影
  • 翻訳(二重四元数を使用しない場合)
  • ネイティブハードウェアサポート
  • 四元数はしばしば超越関数を構築する必要があります
  • 理解しやすい

クォータニオンの利点

  • ベクトルの変換に必要な操作は少なくなります(またはそうではありません-ジョンの答えを参照)
  • 別のquatによる変換では、はるかに少ない操作で済みます
  • クォータニオンは4つのフロートを占有します(デュアルの場合は8)が、マトリックスは9〜16のフロートを占有します

ユニフォームリジッドボディ変換のみを実行することがわかっている場合、ベクトル/クアットペアは通常、ストレージスペースの観点から3x4マトリックスで確実に勝ちます(ベクトル/クアット:7または8フロートvs mat3x4:12フロート)および処理速度。四元数がまだ神秘的なブードゥーである場合は、このWebシリーズを試してください


3

行列は四元数よりも多くの可能な変換を提供し、行列を歪めたり、鏡像化したり、不均一にスケーリングしたりすることができます。追加の変換機能が必要ない場合、エンジンにクォータニオンベースの変換だけを実行させることはできないと述べるものは何もありません。

基底ベクトルを知っている空間を構築する必要がある場合、行列は非常に便利です。正投影への投影を行うときなど。また、マトリックス空間で透視変換を行うのは簡単です。投影は、行列が優れています。

ある意味では、マトリックスは最も一般的な種類を表し、習得して理解するのに複雑すぎないため、通常使用されます。標準化のメリットは、カスタムワークフローから得られるメリットをはるかに上回ります。行列演算の実行方法はよく知られています。一方、quatsはuniですぐに紹介されるものではありません。四元数を反転する方法を知っている人がどれくらいいるのかを尋ねてください。一方、マトリックスを反転する方法を知らない高等教育の多くの学生を見つけることはできません。

グラフィックカードには、マトリックス操作専用のパイプもあることに注意してください。


私は実際にこれについて考えてきました。私は、パイプをモデル化する他のアプローチとして、マトリックスやクォートの階層以外にどのようなアプローチを使用できるかを問うことにも挑戦しました。
-joojaa

3

クォータニオンは均一なスケーリングと回転のみを表すことができるため、他に何かが必要な場合は、それを表すために何かを追加する必要があります。

単一の追加vec3で(またはデュアルクォータニオンを使用して)翻訳を行うことができます。ただし、不均一なスケーリングとシアリングはmat4でより適切に表されます。投影変換(本質的に不均一なスケーリングとzとwの交換)は、クォータニオンで表すことはできません。

四元数は、補間時に大きな利点があります。スラップは、クォータニオンを使用して最も簡単に計算されます。

クォータニオン(またはデュアルクォータニオン)の適用はGPUに組み込まれていないため、ベクトル演算を使用してそれを実装する必要があります。ほとんどのクォータニオンライブラリは、スケールを表すためにクォータニオンを使用しないことを前提としているため、注意が必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.