回答:
私は誤解から始めたい:
最新のGPU(かなり長い間NVIDIA、および南諸島以降のAMD)は、ハードウェアでネイティブにベクトル/行列演算を有意にサポートしていません。これらは異なる方向のベクトルアーキテクチャです。ベクトルの各コンポーネント(x、y、z)は通常、レーンの各要素の値を含む32または64の値です。したがって、3Dドット積は通常、命令ではなく、乗算と2つの乗算加算です。
さらに、乗加算のようなプリミティブ演算を数え、四元数によるベクトルの変換は、行列によるベクトルの変換よりもコストがかかります。3x3行列によるベクトルの変換は3つの乗算と6つの積和であり、四元数によるベクトルの変換は2つの四元数乗算であり、それぞれ4つの乗算と12の積和で構成されます。(これよりもナイーブは少なくなります。ここではより高速な方法を説明しますが、それでもベクトルに行列を掛けるほど安くはありません。)
ただし、パフォーマンスは、実行するALU操作の数を単にカウントするだけでは必ずしも決定されません。クォータニオンは、同等のマトリックスよりも必要なスペースが少なく(純粋な回転/スケールのみを実行していると想定)、ストレージスペースとメモリトラフィックが少なくなります。これは多くの場合アニメーションで重要です(クォータニオンの優れた補間プロパティが現れる場合にも便利です)。
それ以外:
DP3
命令3つの乗算と2つの加算として実装され、参照表示されますINTEL_DEBUG=fs
インテルのLinuxドライバからの出力を:paste.ubuntu.com/23150494。貧弱なドライバーなのか、HWが特別なベクトルmul命令を実際に持っていないのかはわかりません。
(ここでの多くの情報は、私自身のメモとともに、joojaaとラチェットフリークの回答から恥知らずに借りました。)
ユニフォームリジッドボディ変換のみを実行することがわかっている場合、ベクトル/クアットペアは通常、ストレージスペースの観点から3x4マトリックスで確実に勝ちます(ベクトル/クアット:7または8フロートvs mat3x4:12フロート)および処理速度。四元数がまだ神秘的なブードゥーである場合は、このWebシリーズを試してください。
行列は四元数よりも多くの可能な変換を提供し、行列を歪めたり、鏡像化したり、不均一にスケーリングしたりすることができます。追加の変換機能が必要ない場合、エンジンにクォータニオンベースの変換だけを実行させることはできないと述べるものは何もありません。
基底ベクトルを知っている空間を構築する必要がある場合、行列は非常に便利です。正投影への投影を行うときなど。また、マトリックス空間で透視変換を行うのは簡単です。投影は、行列が優れています。
ある意味では、マトリックスは最も一般的な種類を表し、習得して理解するのに複雑すぎないため、通常使用されます。標準化のメリットは、カスタムワークフローから得られるメリットをはるかに上回ります。行列演算の実行方法はよく知られています。一方、quatsはuniですぐに紹介されるものではありません。四元数を反転する方法を知っている人がどれくらいいるのかを尋ねてください。一方、マトリックスを反転する方法を知らない高等教育の多くの学生を見つけることはできません。
グラフィックカードには、マトリックス操作専用のパイプもあることに注意してください。
クォータニオンは均一なスケーリングと回転のみを表すことができるため、他に何かが必要な場合は、それを表すために何かを追加する必要があります。
単一の追加vec3で(またはデュアルクォータニオンを使用して)翻訳を行うことができます。ただし、不均一なスケーリングとシアリングはmat4でより適切に表されます。投影変換(本質的に不均一なスケーリングとzとwの交換)は、クォータニオンで表すことはできません。
四元数は、補間時に大きな利点があります。スラップは、クォータニオンを使用して最も簡単に計算されます。
クォータニオン(またはデュアルクォータニオン)の適用はGPUに組み込まれていないため、ベクトル演算を使用してそれを実装する必要があります。ほとんどのクォータニオンライブラリは、スケールを表すためにクォータニオンを使用しないことを前提としているため、注意が必要です。