グラフィックスカードは、ベクトルの4番目の要素を最終位置として何をしますか?


25

この質問から、行列乗算で位置を変更する方が簡単なので、4要素の位置ベクトルが必要になります。

これは、4D要素を3Dポイントの表現と見なす場合(変換なしと仮定した場合)、4番目の要素を単に無視することを意味しますが、4番目の要素がvector4をGPUに供給する場合、要素は1つではなく、レンダリングされません-なぜですか?

ラスタライザに配置された4番目の要素の意味は何ですか?

編集:レビューの際、この質問の言葉遣いはやや不十分でした。2番目の段落が「4番目の要素の値が特定の範囲内にない場合、「正しく」/「期待どおり」にレンダリングされない」と言う方が正確です。


座標(x、y、z、0.5)のvector4は、座標(2x、2y、2z、1)のvector4と同じ結果になりませんか?
FxIII

@FxIII、私はそれを正確に再現することができませんでしたが、あなたが正しいことは、私がそれを更新したいくつかの実験の後、私の元の投稿で行われた間違ったブランケットステートメントでした。
sebf

回答:


23

4番目のコンポーネントは、透視投影を追跡するためのトリックです。透視投影を行う場合、zで除算する必要があります。x '= x / z、y' = y / zですが、これはxのベクトルで動作する3x3行列で実装できる演算ではありません。 y、z。これを行うための標準になったトリックは、4番目の座標wを追加し、すべての変換が適用されてからラスタライズされる前に、x、y、zが常にwで除算されることを宣言することです。

透視投影は、zをwに移動する行列を持つことで達成され、その結果、zで除算されます。ただし、除算を行いたくない場合は、w = 1.0のままにしておくこともできます。たとえば、平行投影や回転などが必要な場合。

位置をw = 1としてエンコードし、方向をw = 0としてエンコードし、行列の4番目の行/列を変換に使用できることは、副次的な利点ですが、wを追加する主な理由ではありません。アフィン変換(3x3マトリックスと3コンポーネントの変換ベクトル)を使用して、wが見えない状態で変換を実行できます。(位置と方向を追跡し、それぞれに異なる変換関数を適用する必要があります。これは少し不便ですが、大したことではありません。)

(数学的には、wで補われたベクトルは同次座標と呼ばれ、射影空間と呼ばれる場所に住んでいます。しかし、3Dグラフィックスを行うために高度な数学を理解する必要はありません。)


ポイントとベクトルの間に同型性があるため、これらの用語でベクトルとポイントについて話すのは少し間違っています(原点とそのポイントに移動するポイントとベクトルは同じエンティティです)。ポイント/ベクトル(w!= 0)および(射影)方向(w = 0)について話す方が正しいでしょう。とにかく、「ベクター」という用語の誤用は、3Dライブラリー言語の非常に統合された標準です。
FxIII

@FxIII:修正されました。標準的な数学の意味で「ベクター」を使用し、同じ投稿で「方向」の同義語として使用することは混乱を招きました。
ニコルボラス

@FxIIIとニコルボーラス:私は同意しません。あなたは本当にベクトルをw = 0としてエンコードします-単に方向を表すベクトルと、長さが重要な実際のベクトルの両方を含みます。たとえば、オブジェクトのマトリックスを使用して、ローカル空間とワールド空間の間でオブジェクトの角速度ベクトル(方向=回転軸、長さ=速度)を変換できます。角速度にオブジェクトの平行移動を追加したくない場合。回転させたいだけです。したがって、w = 0に設定します。問題は表示されませんか?
ネイサンリード

@NathanReed私の投稿がポイントの明確化に役立つことを願っています。とにかく、私のポイントの大部分は、用語ベクトルの定義と誤用に加えて、標準3Dライブラリ用語に対する線形代数の優位性にあります。もちろん、すべての定義と優位性の主張は
-FxIII

@ Nathan、4番目の要素の目的と、それに含まれる情報がラスタライザによってどのように使用されるかが明確にわかりました。どうもありがとう!
sebf

10

Natanの適切なコメントに答えるために、Affine Spaceでベクターを使用して標準ユークリッド空間で3Dベクターを表す場合に実際に何が起こるかを理解するのに役立ついくつかの考慮を行いました。

最初に、座標を持つものは何でもvectorを呼び出すので、ポイントとベクトルは同じエンティティです。ベクトルは2点の差として見ることができます:V = B - A ; A + V = A + B - A = Bであるため、VABに移動し ます。入れてA = 0(原点)と、あなたはそれが得るV = B - 0 = B:ポイントBとベクトル移動していること0Bは同じものです。

アフィン空間のベクトルがw = 0である場合、大部分の3Dライブラリで使用される意味で「ベクトル」を呼び出します。

行列は、線形関数をコンパクト/エレガント/効率的な形式で表すことができるために使用されますが、線形関数には、原点を変換できない大きな欠点があります:F が線形になりたい場合はF (0)= 0 amog他のもの、例えばF(λ X)=λF(X)とF(A + B)= F(A)+ F(B))

これは、0ベクトルを移動することはないため、変換を行う行列を構築できないことを意味します。ここに登場するのがアフィンスペースです。アフィン空間は、ユークリッド空間に次元を追加するため、スケーリングと回転で移動を行うことができます。

Affine Spaceは、AffineとEuclideanのベクトルの間に同値関係を構築できるという意味で射影空間であるため、それらを混同することができます(ポインとベクトルで行ったように)。同じ方向で原点に投影されるすべてのアフィンベクトルは、同じユークリッドベクトルとして見ることができます。

これは、座標内で同じ比率を持つすべてのベクトルを同等と見なせることを意味します。

数学的に:

等価

つまり、すべてのアフィンベクトルは、w = 1のキヤノンバージョンに減らすことができます(すべての同等のベクトルの中から、最適なベクトルを選択します)。

視覚的に(2Dユークリッド-3Dアフィン):

視覚的同等性

したがって、「投影」空間の平均。ここで、ユークリッド空間は2D(シアン領域)であることに注意してください。

(ハイパー)平面w = 0にある正規バージョンに(簡単に)配置できないアフィンベクトルの特定のセットがあります。

視覚的に表示できます。

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

w-> 0のとき、ユークリッド空間への射影ベクトルは無限になりますが、特定の方向では無限になります。

射影空間に2つのベクトルを加算すると、和ベクトルをユークリッド空間の射影ベクトルと見なすと問題が発生することが明らかです。これは、アフィン空間のWコンポーネントを合計してから、ユークリッド(ハイパー)平面。

これは、「ベクトル」が「ポイント」のw座標を変更しないため、「ポイント」のみを「ベクトル」に加算できる理由です。これは、w = 1の「ポイント」にのみ当てはまります。

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

ご覧のとおり、緑色の点はシアンの「点」Vの「ベクトル」を表す2つのアフィンベクトルを加算したものですが、キヤノン1とは異なる形式ですべてのアフィンベクトルにVを適用すると、間違った結果(赤い「 "ポイント"」)。

あなたはそれを見アフィン空間を透過的に使用することはできませんユークリッド空間と上の動作を説明する「ベクター」という用語の誤用計算和の(厳格な)制約の下で意味を持っているだけキヤノン射影ベクトル

つまり、GPUがVector4にはw = 0 または w = 1 が必要であると想定していると考えるのは非常に合理的です。


すべてが4番目のコンポーネントの関係がどのように使用され、なぜそれが必要なのかを理解するのに貢献したため、この質問に対する答えを1つ選ぶのは非常に困難でした。ユークリッド空間とアフィン空間についてのあなたの説明は非常に役に立ちます。詳細レベルがなければ今は理解できません。どうもありがとうございました!
sebf

射影空間の適切な説明(および図!)のために+1。ただし、アフィン空間と射影空間は同じものではありません(アフィン空間のウィキペディアの定義を参照)。これを言う良い方法かもしれません:射影3空間とアフィン3空間はどちらもR ^ 4に埋め込むことができますが、埋め込みは完全に子音ではありません。アフィン空間からのベクトルをw = 0としてエンコードすることは可能かつ有用ですが、射影の観点からは意味がありません。同様に、射影方向(無限遠のポイント)は、アフィンの観点からは意味がありません。
ネイサンリード

1

(x、y、z、w)のようなベクトルを想定します。このベクトルには、4つのコンポーネントx(空間内のx座標)、y(空間内のy座標)、z(空間内のz座標)、および興味深く神秘的なw成分があります。実際、ほとんどの3Dゲームは4D空間で動作します。4D同種空間とも呼ばれます。それにはいくつかの明らかな利点があります->

1>平行移動と回転の行列を1つにまとめるのに役立ちますが、平行移動と回転の行列を乗算するだけでよいのですが、それだけではありません。すべてのベクトルのwコンポーネント次に、3dベクトル(xyz)を平行移動と回転の結合行列に乗算すると、x、yまたはzで値を無意識にスケーリングします(これが行列乗算の動作方法です)。この問題を修正するために、4番目の成分ベクトルが導入され、vector(w)のこの成分はケースの99%で値1.0を保持します。この4番目の成分により、スケーリングされていない位置の値(変換)を持ちます。行列は次のように表されます->

 [x y z w] [rx1 rx2 rx3 1]
           [ry1 ry2 ry3 1]
           [rz1 rz2 rz3 1]
           [px  py  pz  1]

そして、シンプルでありながら強力なマトリックスがあります。:)

2>透視投影ステージでz値をwコンポーネントにコピーし、x、yをそれで分割します。このようにして、オブジェクトがスクリーンから離れるにつれて短くなります。


ありがとうございました!3D空間内のエンティティの実際に役立つ表現で4番目のコンポーネントを使用する必要性がますます高まっています。
sebf
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.