行列は何を表していますか?


19

私は最近OpenGLを学び始めましたが、コンピューターグラフィックスにおけるマトリックスとその役割を視覚化するのに問題があります。次のような4x4マトリックスのテンプレートを考えます:

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

このような各マトリックスは、ワールド空間の頂点の座標であると想定します。そして、それらのいくつかがまとめられ、影が付けられてオブジェクトを与えますか?

しかし、なぜそこにaがあるXxXyXz?私はそれが異なる軸(上、左、前)であることを読みましたが、それでも重要な頭や尾を作ることはできません。

回答:


19

コンピューターグラフィックスの行列は、モデル内の各座標に与えられる変換です。各マトリックスは、座標(3空間の点)に適用する複数の変換の組み合わせです。

変換の構築は、変換、回転、スケールの3つの変換タイプのいずれかに基づいています。

翻訳行列は次のようなものです。

翻訳マトリックス

そしてスケール行列: スケール行列

回転行列は次のようになります。

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

これらの行列のいずれかを組み合わせるには、それらを乗算します。変換を頂点に適用するには、頂点に乗算するだけです(変換図を参照)。


4
Oマトリックスはポイントを表さないので。今恥ずかしい
悲しいCRUD開発者14年

多くの場合、オブジェクトまたはビューポート全体に適用されます(オルソビューとパースビューの取得方法)
アレックスシェパード14年

3
@BDillan:いいえ、しかし確かにポイントを含めることができます。たとえば、ModelViewマトリックスの最後の列(GL /列メジャー)は、原点の変換方法を定義します。あるいは、これを別の言い方をすれば、目がワールド空間のどこに位置するかを定義し、文字通り単独でポイントとして使用できます。
アンドンM.コールマン14年

あなたのコーディネート3タプル。マトリックスが3×3ではないのはなぜですか?3つのタイプの変換を単一のマトリックスに結合し、それでも十分なスペースがある場合、右下隅が何をしているのか、常に1のように見えますか?
n611x007

4番目の行/列は、特に翻訳用にあります。行列演算の最も優れた機能の1つは、達成したいすべての変換と回転を1つの行列に結合できることです。これは、非常に複雑な変換(理論的には無限)のセットを1つのマトリックスに圧縮できることを意味します。はい、その最後のセルは1のままですが、残りの計算を行うことができます。
アレックスシェパード

10

コンピューターグラフィックスでは、マトリックスを使用して変換をエンコードします

変換、回転、またはスケーリング変換のみを含む行列は、一般的に悪用される解釈があります。マトリックスの左上の3x3には回転またはスケーリングデータのみが含まれ、下の行または右の列には翻訳データが含まれます。これは一般的なことではありませんが、コンピューターグラフィックスで表現された変換のサブセットに対して十分な頻度で使用されます。

同様に、マトリックスの値と、マトリックスが表す対応する座標フレームの間に関係があります(常に「ワールドスペース」とは限りません)。左上の3x3列(または行)は、座標フレームのX、Y、Z軸を表します。

行が軸を表すか列が表すかは、row vector * matrixまたはとして乗算する規則を使用しているかどうかによって異なりますmatrix * column vector。行列の乗算を実行する場合、2つの行列の内側の次元が一致する必要があるため、ベクトルを行行列または列行列として表現するかどうかは、その選択に影響します(OpenGLと従来の数学は列ベクトルを好む傾向があります)。

線形代数に関する優れた本を入手するか、少なくともMatrix and Quaternion FAQ、DirectXおよびOpenGLのマトリックスレイアウトに関するこの投稿を参照することをお勧めします


線形代数に関する「良い」本がたくさんありますが、そのうちのいくつかを読んで理解しました。それは少し助けにならないということであり、私が理解していないということでもありません。あなたの最後のアドバイスは間違った仮定に答えていると感じています。
n611x007

9

マトリックスとは何ですか?

m列とn行を持つ行列は、要素(または座標)を持つベクトル*を消費し、m要素を持つベクトルを生成する関数を表しnます。

これから、行列が正方行列である場合にのみ、ベクトルの次元が変化しないことがわかります。例えば。3Dベクトルの変換から3Dベクトル、2Dから2Dなどを取得します。

*:物理学では、ベクトルは通常、速度や加速度などを「移動」する力やその他の「影響」を示すために使用されます。しかし、点または任意の数の配列を表すためにベクターを使用することを妨げるものは何もありません(一部のライブラリーおよびプログラミング言語は、「ベクター」を使用して「1D配列」を意味します)。行列で使用する場合、行列の要素が何であれ、それらを加算、減算、乗算する方法がある限り、何でもベクトルの要素(文字列または色さえ)にできます。したがって、名前のベクトル「キャリア」を意味し、 -それが運ぶか、保持しているあなたのための値を。

行列の乗算とはどういう意味ですか?

行列が関数の場合、どのような関数ですか?関数は何をしますか?そのためのレシピは、マトリックスの要素によって定義されます。input u、output v、matrix M(乗算M*u=vf(u)=v)と呼ばれu(i)ithの要素u(2番目の要素はy座標など)を呼び出します。マトリックスの場合、M(i,j)row i、columnを意味しますj

v(1)結果の最初の要素であるelementの構築は、行列の最初の行で記述されます。u(1)M(1,1)、プラスu(2)時間M(1,2)、...プラスu(i)時間M(1,i)。マトリックスは、非常に単純なプログラミング言語に少し似ています。これは、入力をシャッフルしたり、入力を追加するなどして機能するプログラミング関数にのみ適しています。**

一度に出力の1つの要素で作業しているため、一度に1行のマトリックスのみを使用していると想像しておくと役立ちます。u水平に書きます。そのM下のi行目を書きます。上/下のペアをすべて乗算し、以下の製品を記述してから、製品を合計します。すべての行について繰り返し、のすべての要素を取得しvます。(mby nマトリックスがmベクトルに作用してベクトルを生成しなければならない理由がわかりましたn。)

これについて考える別の方法-3Dから3Dへの変換を行うとしましょう。3x3マトリックス(または、この「関数」を装うことができるため、よく呼ばれる3D変換は、実際には3Dポイントを「移動」することです)数字を変更するだけです)。最初の行がであるとしましょう[1 2 0]。つまり、結果のxを取得するには、入力のxを1、入力のyを2、入力のzを0に設定します。それは本当にレシピです。

**:マトリックスがプログラミング言語である場合、チューリングも完全ではありません。

2つの行列を乗算するとはどういう意味ですか?

それらが両方とも適切なサイズの行列である場合、「A*B最初に適用する関数」を意味します。サイズが入力と出力のサイズを決定し、1つのマトリックスが他のマトリックスの出力を消費するため、乗算のサイズに制約が存在する理由がわかります。乗算が関数の組み合わせを意味するのはなぜですか?それが必要であることに気付くのは簡単です。if がであり、かつである場合、then は、である、と同じです。BAA*uf(u)B*ug(u)f(g(u))f(B*u)A*(B*u)

同様に、同じ関数の繰り返し適用は、3回A*A*AA表す関数の適用を意味するため、べき乗として表示できます。

マトリックスはどのように役立ちますか?

new_x = 1*x+2*y+0*z(最初の行が[1 2 0]である場合)のような変換を行うのは何ですか?それはあまり明白ではありませんが、それを説明するために別の2Dマトリックスを見てみましょう。マトリックスは次のとおりです。

[ 0 1
  1 0 ]

または[0 1; 1 0]、便利なMatlab表記を使用します。このマトリックスは何をしますか?次のように2Dベクトルを変換します。結果のxに対して、入力のyの1を使用します。結果のyに対して、入力のxの1を使用します。入力のx座標とy座標を入れ替えました-この行列、x = y線に関する点を反映しています。それは一種の便利です!拡張すると、SW - NE線に沿って1を持つすべての行列が反映されることがわかります。また、単位行列が入力を返す理由を確認できます(出力のxの場合は入力のxを、出力のyの場合は入力のyを取得...)。

これで、シンボルがなぜなのかがわかります。XxYx-彼らはどのくらいの入力の意味XYなどの出力になりますx

マトリックスは他にどのように役立ちますか?

他にどんな変換ができますか?単位行列を取得することでサイズを変更できますが、対角線に沿って1以外の数を使用します。たとえば[2.5 0; 0 22.5]、入力のすべての座標に2.5を掛けます。このマトリックスを画像内のすべてのポイントに適用すると、画像は2.5倍になります。2.5を1つの行([2.5 0; 0 1])にのみ配置すると、x座標のみが乗算されるため、xに沿ってのみストレッチします。

他のマトリックスは、さまざまな程度の有用性を持つ「スキュー」などの他の変換を与えることができます。個人的には、行列は非常にシンプルに見えますが、変換自体は画像をマングルする以外のことをほとんど行わないため、スキューは私が最も好きではありません。便利なのは「回転」です-ポイントをどのように回転させるのですか?原点を中心に反時計回りに角度を(x, y)回転させた後、ポイントの位置を計算してみてくださいtheta。新しいx座標とy座標の両方が、古いxとyにシータのサインとコサインを掛けたものであることがわかります。この関数に対応するサインとコサインを使用して、回転行列を簡単に書くことができるはずです。

非正方行列では、入力の次元を変更することもできます。2D入力を3Dに変換することは、新しい座標に入れるものを「製造」するのが難しいため、あまり有用ではありませんが、3Dを2Dに変換することは非常に便利です。とりわけ、これはコンピューターが*** 3Dシーンを2D画像に投影してモニターに描画する方法です。

ベクトルはさまざまなものを保持できるため、文字列をシャッフルまたは「乗算」することで、一度にn文字の文字列を暗号化する行列を記述することもできます(乗算/加算関数を考え出す必要があります)。

***投影するときに、彫刻のような3Dオブジェクトを撮影し、それに光を当てて、どのような2Dシャドウが壁に落ちるかを確認します。

行列の制限は何ですか?

すべての機能を行列で実行できますか?いいえ。グラフィカルに考えると、マトリックスではできなかったことを想像するのは困難です(ただし、それは存在します。たとえば、「渦巻き」効果は実行できません)。ただし、簡単な例を次に示します。関数fすべての要素がsquaredでf(u)返されるようなものだとしましょう。マトリックスを書くことはできないことがわかります。マトリックスでは、座標に定数を掛けるレシピを記述する機能しかありません。パワーのような他の派手な関数は表現できません。u

****:これが線形代数と呼ばれる理由でもあります-べき関数は非線形で、プロットされたときに直線を作成しません。

4Dマトリックスの奇妙な余分な行

さて、なぜあなたの例のマトリックスは4×4ですか?これは4次元空間を意味しませんか?4Dコンピューターがないので、なぜですか?これは、実際には、線形演算に関する以前のポイントに関連するマトリックスを使用した興味深いトリックです。

マトリックスではどの機能を実行できないかについて:2Dポイントを2単位右に移動するためのマトリックスは何ですか(ポイントを生成します(x+2, y)か?再び、行き詰まります。入力を乗算する方法はありますが、追加する方法はありません。 2D作業の場合、トリックは実際には2D空間ではなく3D空間にいるふりをすることです。ただし、すべての高さ(z座標または3番目の要素)は常に1です(2D宇宙のように少し似ています) 3Dユニバースの床に沿って平らに置かれた「プレート」-この場合、3番目の座標は常に0)。その後、この魔法の最後の座標を定数として使用できます。

同様に、3Dポイントを移動するには、4D座標が必要です。また、これが、表示されるすべての3D変換行列が[0 0 0 1]最後の行として表示される理由でもあります。4次元を変更してはなりません。


それでは、どのように行列を追加しますか?行はXx Yx Zx Tx...と言い、最後の行は実際に0t 0t 0t 1tはから置換されXt Yt Zt Ttます。あなた(x+2, y)から作るために(x, y)行く1x 0y 0z 2tことができます1*x + 0*y + 0*z + 2*1から、それはあなたにt=1正しいでしょうか?これはほとんどx + 2に相当します。おお、これで面白いT値でレンダリングを台無しにすることができますよね?-grin-(長い読み取り、依然として最適な値、thx)
-n611x007

2

これは4x4の列優先行列であり、その外観からはビュー行列です。

最初の3列は基底ベクトルの方向(上、左、それらを呼び出したときに前方)を定義し、最後の列は視点の移動を定義します。それらをまとめると、カメラの向きを説明できます。さらに重要なことは、このマトリックスを使用して、ポイントを「目空間」、「ビュー空間」、または「カメラ空間」と呼ばれる座標空間に変換できることです。

これらはすべて同じ座標空間の同義語です。残念ながら、コンピュータグラフィックスを扱うときは、同義語をすべて学習する必要があります。異なる本や人が異なる名前でそれらを呼び出すからです。ほとんどの座標空間には複数の名前があります。

ちなみに、ビューマトリックスの3つの列は一般に直交しています。つまり、互いに直角を形成しています。これは必須ではありませんが、従来のカメラを構築する際に非常に一般的なプロパティです。


1

TL; DRバージョン:

[x y z]各行の最初の3つの要素は、変換された座標系の単一の基底ベクトルを表します。最後の要素wは翻訳コンポーネントです。

ロングバージョン

頂点に適用されたときに、原点を中心に頂点をたとえば45度回転するマトリックスが必要な場合、変換された軸を表す3つのベクトルでマトリックスを塗りつぶします。

  • i上の点ですが、45度回転します。これは単にです。ここでおよびは、X軸に対して45度の内角を持つ三角形の脚です。x[1 0 0][i_x i_y i_z]i_xi_y[cos(45) sin(45) 0]
  • jy軸上の点ですが、[0 1 0]その軸から45度回転します。一枚の紙にスケッチすると、反時計回りに回転すると、コンポーネントがになることがわかります[-sin(45) cos(45) 0]
  • k上のポイントz。この例でzは、(画面に整列した)xy平面で回転しているため、影響を受けません

したがって、3つの新しいベクトルi、j、kがあります。これを視覚化する簡単な方法は、X軸とY軸を取り、十字配列全体を回転させることです。

これらをどのように行列に入れるのですか?

i_x i_y i_z
j_x j_y j_z
k_x k_y k_z

または

 cos(45)  sin(45)    0
-sin(45)  cos(45)    0
    0        0       1

頂点にその行列を掛けると、次のようになります

v1_x = v_x cos(Θ)     - v_y sin(Θ) + v_z * 0
V1_y = v_x*sin(Θ)    + v_y cos(Θ) + v_Z * 0
V1_z = v_x * 0        + v_y * 0    + v_z * 1

以下のためv = [1 0 0]、そしてΘ = 90°、次のようになりv1 = [0 1 0]

翻訳のために、4番目の行と列を追加し、最後の列に翻訳コンポーネントを配置します。w通常、頂点に4番目のコンポーネントを追加します1。これは、頂点にマトリックスを掛けると、wコンポーネントが最後の列を入力頂点に追加し、頂点が移動または変換されるようにするためです。これらを「均質な座標」と呼びます。(私たちの目的では、「均質」とはw、各ベクトルに4番目のコンポーネントがあることを意味し、3 x 3ではなく4 x 4マトリックスを使用します。貴重なメモリと帯域幅を消費するGPUに。4行目は透視投影に必要ですが、それ以外はあまり必要ありません。

お役に立てれば。


2
あなたはわずか3年前から既に答え質問に答えてきたあなたが気付いたときにその瞬間...
3Dave

:P答える前に必ず質問日を見てください
...-HolyBlackCat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.