4x4マトリックスを使用して3Dで物事を変換するのはなぜですか?


36

X方向に10単位でベクトルを変換するには、なぜマトリックスを使用する必要があるのですか?

ここに画像の説明を入力してください

mat [0] [0]に10を追加するだけで、同じ結果が得られます。

回答:


28

はい、翻訳の場合はベクトルを追加できます。マトリックスを使用する理由は、異なる組み合わせの変換を処理するための統一された方法を持つことに要約されます。

たとえば、回転は通常行列を使用して行われます(回転を処理する他の方法については@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はマトリックス/ベクトル演算に適合するように設計されました)。


はい、私は行列が回転に役立つことを知っています。しかし、すべてのチュートリアルは、マトリックスを使用してこのような単純な計算を行うようにガイドします:D
ngoaho91 14年

1
マトリックスでのみ回転ができると言うのは正しくありません。頭上ではクォータニオンと三角法もうまく機能します
MickLH 14年

17
さらに、4x4マトリックスとして回転と変換の両方を行ったら、それらを掛け合わせて、1つのマトリックスで結合変換を行うことができます。異なるコンストラクトを使用して、数千の異なる変換ですべての頂点を変換する必要はありません。4x4マトリックスが単一の平行移動または単一の回転に対して過剰であるという事実は、通常、単一の平行移動または単一の回転によって頂点を変換するだけではないという事実よりも重要です。
クリスは、モニカーを復活させる14

1
@ concept3dええ、私は知っています、答えは良いです。しかし、マトリックスを使用する均一な方法から得られるさらに大きな利点は、均一であるだけでなく、単一の操作で変換チェーン全体を表現できることです。それが暗示されたかもしれないが、私はそれを明確に言及するのに十分に不明確で重要であることがわかった。しかし、とにかく答えはまだ良かった、それは批評ではなかった。
クリスは、モニカーを復活させる14

1
はい、trigは回転行列を計算しますが、ベクトル演算は実際にはtrigを注入したデータセットを使用してポイントを「回転」させます。三角法と言ったとき、単純なものを生成するために、マトリックスを介さずに直接使用することを意味していました。
MickLH

6

単一の軸に沿って移動するだけで、他の変換を適用しない場合は、提案していることで問題ありません。

マトリックスを使用する本当の力は、一連の複雑な操作を簡単に連結し、同じ一連の操作を複数のオブジェクトに適用できることです。

ほとんどの場合はそれほど単純ではなく、オブジェクトを最初に回転させ、ワールド軸の代わりにローカル軸に沿って変換したい場合、数字の1つに10を追加して正しく動作させることはできません。


5

「なぜ」という質問に簡潔に答えるのは、4x4マトリックスが回転、平行移動、スケーリングの操作を一度に記述できるからです。これらのいずれかを一貫した方法で説明できると、多くのことが簡単になります。

異なる種類の変換は、異なる数学演算でより簡単に表すことができます。ご指摘のとおり、翻訳は追加するだけで実行できます。スカラーを乗算することによる均一なスケーリング。しかし、適切に作成された4x4マトリックスは何でもできます。したがって、4x4を一貫して使用すると、コードとインターフェイスがずっと簡単になります。これらの4x4を理解するには多少の複雑さを払いますが、それにより多くのことがより簡単かつ迅速になります。


2
これが選択された答えであるはずです。
エンジニア

4

4x4マトリックスを使用する理由は、操作が線形変換になるようにするためです。これは同次座標の例です。同じことが2Dの場合にも行われます(3x3マトリックスを使用)。同種の座標を使用する理由は、3つの幾何学的変換すべてを1つの操作で実行できるようにするためです。そうでない場合は、3x3行列の乗算と3x3行列の加算(変換のため)を行う必要があります。cegprakashからのこのリンクは便利です。


2
詳しく説明する必要があります。簡潔な説明は、ウィキペディアにリンクするよりも優れています。
セスバティン

3

翻訳は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倍小さく見せます。

まず、glOrthovs に関するいくつかの直観を得ますglFrustumhttps : //stackoverflow.com/questions/2571402/explain-the-usage-of-glortho/36046924#36046924

glOrtho変換とスケーリングだけで実行できますがglFrustum、マトリックスを使用してどのように実装できますか?

仮定:

  • 私たちの目は原点にあり、-zを見ています
  • スクリーン(平面に近い)は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 |

最後に捨てるzw、次のようになります。

  • x_proj = x / -z
  • y_proj = y / -z

まさに私たちが望んでいたものです!一部の値については、たとえば次のことを確認できます。

  • の場合z == -1、投影する平面上でx_proj == xy_proj == y
  • ifの場合z == -2x_proj = x/2オブジェクトは半分のサイズです。

glFrustum変換がアフィン形式ではないことに注意してください。回転と平行移動だけでは実装できません。

を加算してwそれを除算する数学的な「トリケリー」を同次座標と呼びます

関連するスタックオーバーフローの質問:https : //stackoverflow.com/questions/2465116/understanding-opengl-matrices


@Downvoters、私が学び、改善できるように説明してください。
Ciro Santilli新疆改造中心法轮功六四事件

個人的には、これは長くてとりとめのないものだと思います。元の質問に対処する部分は新しいものではなく(他の回答で十分にカバーされていない)、残りは無関係で、歩き回るのは本当に難しいです。
ジョシュ

@JoshPetrieフィードバックありがとう!まだ理解していない人は、より例示的で視覚的なので、私の答えから理解する可能性が高いと思います。特定のエラーや完全に無関係なポイントを見つけた場合は、それらをポイントして改善してください。乾杯。
Ciro Santilli新疆改造中心法轮功六四事件

私が言ったように、私は答えのほとんどが無関係であると思います。質問は、「4x4マトリックスを使用する理由、なぜ追加できないのですか?」その答えは、「はい、追加できますが、マトリックスでも変換/回転/スケールできますが、マトリックス演算の仕組みにより、3x3は変換をエンコードできませんが、4x4できます。」このテキストの壁でそれをすべてカバーする場合、見つけるのは非常に困難です。残りは質問されなかったマトリックス数学の入門書であり、おそらく別の質問への答えとしては問題ないでしょうが、私はそれが良いとは思いませんこの質問には。
ジョシュ

1
私は細部への注意に感謝しました。前のユーザーの懸念に対処するには、「翻訳を3Dマトリックスで表すことはできません」で始まるように回答を再配置する必要があります。これは提起された当面の質問に答え、OPは提供されたさらによく書かれた熱心な詳細に進むことができます。ここで興味を持っているのはこれらの細かい詳細なので、偏見があるかもしれませんが、これは確かに「とりとめのない」ものではありません。
dskinner

1

モデル、ビュー、投影の概念を理解するには、このビデオをご覧ください。

4x4マトリックスは、3Dオブジェクトの翻訳に使用されるだけではありません。しかし、他のさまざまな目的にも。

これを参照して、世界の頂点が4Dマトリックスとしてどのように表され、どのように変換されるかを理解してください。


1
これは、実際にはOPの質問には答えません。
concept3d 14年

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