回答:
はい、翻訳の場合はベクトルを追加できます。マトリックスを使用する理由は、異なる組み合わせの変換を処理するための統一された方法を持つことに要約されます。
たとえば、回転は通常行列を使用して行われます(回転を処理する他の方法については@MickLHコメントを確認してください)。それらを行列にエンコードする必要があります。
技術的に言えば、変換は、ポイント/ベクトルを別のポイント/ベクトルにマッピングしています。
p` = T(p);
ここで、p`は変換されたポイントであり、T(p)は変換関数です。
マトリックスを使用しない場合、これを実行して複数の変換を組み合わせる必要があります。
p1 = T(p);
p final = M(p1);
マトリックスは、複数のタイプの変換を単一のマトリックス(アフィン、線形、射影など)に結合できるだけではありません。
マトリックスを使用すると、変換のチェーンを結合してから、それらをバッチ乗算する機会が得られます。これにより、通常はGPUによるサイクルを大幅に節約できます(指摘してくれた@ChristianRauに感謝します)。
T final = T * R * P; // 回転プロジェクトを翻訳します
p final = T final * p;
また、GPUや一部のCPUでさえベクトル操作に最適化されていることを指摘しておくと良いでしょう。SIMDを使用するCPUおよびGPUは、設計によりデータ駆動型並列プロセッサであるため、マトリックスの使用はハードウェアアクセラレーションに完全に適合します(実際、GPUはマトリックス/ベクトル演算に適合するように設計されました)。
「なぜ」という質問に簡潔に答えるのは、4x4マトリックスが回転、平行移動、スケーリングの操作を一度に記述できるからです。これらのいずれかを一貫した方法で説明できると、多くのことが簡単になります。
異なる種類の変換は、異なる数学演算でより簡単に表すことができます。ご指摘のとおり、翻訳は追加するだけで実行できます。スカラーを乗算することによる均一なスケーリング。しかし、適切に作成された4x4マトリックスは何でもできます。したがって、4x4を一貫して使用すると、コードとインターフェイスがずっと簡単になります。これらの4x4を理解するには多少の複雑さを払いますが、それにより多くのことがより簡単かつ迅速になります。
翻訳は3Dマトリックスで表すことはできません
単純な引数は、翻訳が原点ベクトルを取ることができるということです:
0
0
0
原点から離れて、言うx = 1
:
1
0
0
ただし、次のようなマトリックスが必要になります。
| a b c | |0| |1|
| d e f | * |0| = |0|
| g h i | |0| |0|
しかし、それは不可能です。
もう1つの引数は、特異値分解定理です。これは、すべての行列を2つの回転操作と1つのスケーリング操作で構成できることを示しています。翻訳はありません。
なぜマトリックスを使用できるのですか?
多くのモデル化されたオブジェクト(車のシャーシなど)またはモデル化されたオブジェクトの一部(車のタイヤ、駆動輪など)はソリッドです。頂点間の距離は決して変化しません。
それらに対して行う唯一の変換は、回転と平行移動です。
行列乗算は、回転と平行移動の両方をエンコードできます。
回転行列には明示的な式があります。たとえば、角度の2D回転行列a
は次の形式です。
cos(a) -sin(a)
sin(a) cos(a)
3Dには類似した式がありますが、3Dの回転には1つではなく3つのパラメーターが必要です。
翻訳はそれほど簡単ではないので、後で説明します。これらが4Dマトリックスが必要な理由です。
マトリックスを使用するのがなぜクールなのですか?
なぜなら、複数のマトリックスの構成は、マトリックス乗算によって事前に計算できるからです。
たとえば、v
マトリックスT
を使用して車のシャーシの1000個のベクトルを変換し、matrix を使用して回転する場合R
、次のようにします。
v2 = T * v
その後:
v3 = R * v2
各ベクトルについて、事前計算できます:
RT = R * T
そして、すべての頂点に対してただ1つの乗算を行います:
v3 = RT * v
さらに良いのは、タイヤと駆動輪の頂点を車に対して配置する場合、前の行列RT
に車自体に対する行列を掛けるだけです。
これにより、当然、行列のスタックが維持されます。
1つの次元を追加することで問題を解決する方法
視覚化が容易な1Dから2Dへのケースを考えてみましょう。
1Dのマトリックスは1つの数字に過ぎず、3Dで見たように、変換はできず、スケーリングのみが可能です。
ただし、次のように追加のディメンションを追加すると、
| 1 dx | * |x| = | x + dx |
| 0 1 | |1| | 1 |
そして、新しい余分な次元を忘れてしまいます:
x + dx
私たちが望んだように。
この2D変換は非常に重要であるため、せん断変換という名前が付けられています。。
この変換を視覚化するのはクールです。
すべての水平線(固定y
)がどのように変換されるかに注意してください。
たまたまそのラインy = 1
を新しい1Dラインとして、2Dマトリックスで変換しました。
物事は3Dで類似しており、4Dせん断行列の形式は次のとおりです。
| 1 0 0 dx | | x | | x + dx |
| 0 1 0 dy | * | y | = | y + dy |
| 0 0 1 dz | | z | | z + dz |
| 0 0 0 1 | | 1 | | 1 |
そして、古い3D回転/スケーリングは次の形式になりました。
| a b c 0 |
| d e f 0 |
| g h i 0 |
| 0 0 0 1 |
このJamie Kingのビデオチュートリアルも見る価値があります。
アフィンスペース
アフィン空間は、すべての3D線形変換(行列の乗算)と4Dせん断(3D変換)によって生成される空間です。
せん断行列と3D線形変換を乗算すると、常に次の形式が得られます。
| a b c dx |
| d e f dy |
| g h i dz |
| 0 0 0 1 |
これは最も一般的な可能なアフィン変換であり、3D回転/スケーリングおよび変換を行います。
1つの重要な特性は、2つのアフィン行列を乗算する場合です。
| a b c dx | | a2 b2 c2 dx2 |
| d e f dy | * | d2 e2 f2 dy2 |
| g h i dz | | g2 h2 i2 dz2 |
| 0 0 0 1 | | 0 0 0 1 |
私たちは常に、フォームの別のアフィン行列を取得します:
| a3 b3 c3 (dx + dx2) |
| d3 e3 f3 (dy + dy2) |
| g3 h3 i3 (dz + dz2) |
| 0 0 0 1 |
数学者はこのプロパティをクロージャーと呼び、スペースを定義する必要があります。
私たちにとって、それはマトリックス変換を続けて最終的な変換を楽しく計算できることを意味します。そのため、使用されたマトリックスを最初に使用するのは、アフィンではないより一般的な4D線形変換を取得することなくです。
錐台投影
しかし、待ってください。常に重要な変換がもう1つglFrustum
あります。オブジェクトをさらに2倍にし、2倍小さく見せます。
まず、glOrtho
vs に関するいくつかの直観を得ますglFrustum
:https : //stackoverflow.com/questions/2571402/explain-the-usage-of-glortho/36046924#36046924
glOrtho
変換とスケーリングだけで実行できますがglFrustum
、マトリックスを使用してどのように実装できますか?
仮定:
z = -1
、長さ2の正方形ですz = -2
より一般的なタイプの4ベクトルを許可した場合のみ:
(x, y, z, w)
with w != 0
、さらにすべての(x, y, z, w)
with を識別する(x/w, y/w, z/w, 1)
と、マトリックスの錐台変換は次のようになります。
| 1 0 0 0 | | x | | x | | x / -z |
| 0 1 0 0 | * | y | = | y | identified to | y / -z |
| 0 0 1 0 | | z | | z | | -1 |
| 0 0 -1 0 | | w | | -z | | 0 |
最後に捨てるz
とw
、次のようになります。
x_proj = x / -z
y_proj = y / -z
まさに私たちが望んでいたものです!一部の値については、たとえば次のことを確認できます。
z == -1
、投影する平面上でx_proj == x
、y_proj == y
。z == -2
、x_proj = x/2
オブジェクトは半分のサイズです。glFrustum
変換がアフィン形式ではないことに注意してください。回転と平行移動だけでは実装できません。
を加算してw
それを除算する数学的な「トリケリー」を同次座標と呼びます
関連するスタックオーバーフローの質問:https : //stackoverflow.com/questions/2465116/understanding-opengl-matrices
モデル、ビュー、投影の概念を理解するには、このビデオをご覧ください。
4x4マトリックスは、3Dオブジェクトの翻訳に使用されるだけではありません。しかし、他のさまざまな目的にも。
これを参照して、世界の頂点が4Dマトリックスとしてどのように表され、どのように変換されるかを理解してください。