OpenGLのクリップスペースに4つの次元があるのはなぜですか?


13

これは一般的なリファレンスとして使用しますが、ブラウザのオンラインドキュメントや書籍が多ければ多いほど、これについてはあまり理解できません。

const float vertexPositions[] = {
    0.75f, 0.75f, 0.0f, 1.0f,
    0.75f, -0.75f, 0.0f, 1.0f,
    -0.75f, -0.75f, 0.0f, 1.0f,
};

このオンラインブックには、三角形の作成に関するOpenGLの最初の古典的なこんにちは世界を描く方法の例があります。

三角形の頂点構造は、上記のコードで述べられているように宣言されます。

この本は、これに関する他のすべての情報源と同様に、クリップスペースは、ラスタライズされて画面にレンダリングされるものを基本的に決定するために使用される4D構造であるという点を強調します。

ここに私の質問があります:

  • 私は4Dで何かを想像することはできません、私は人間がそれを行うことができるとは思わない、このクリップスペースの4Dは何ですか?
  • 私が読んだ中で最も人間が読めるドキュメントはカメラについて語っていますが、これはクリッピングの概念を単に抽象化したものです。おなじみの3D構造?カメラのコンセプトに関する唯一の問題は、他の方法で見込み客を定義する必要があることです。したがって、基本的に、どのようなカメラを持ちたいかについて別のステートメントを追加する必要があります。
  • これをどのように読むの0.75f, 0.75f, 0.0f, 1.0fですか?私が得るすべては、それらがすべてfloat値であり、最初の3つの値の意味を得るということですが、最後の値はどういう意味ですか?

4
第4章では、4番目のコンポーネントの機能を正確に説明します。実際、それをスクラッチします。第1章では、ラスタライズセクションの途中までのクリップからNDCへの変換について説明します
ニコルボーラス

2
@NicolBolas作者は最初の章で説明を行い、次の章で参照することはありません。また、C ++コードをコメントするときに次に何が起こるかを説明するふりをします。特に1章の内容を解読するためにこの概念が必要な場合は、1章は最初に知っておくべきことを章番号4に入れても意味がありません。私はこれを今一度読んでおり、1回だけではなく、答えをさらに探すことになっていることを知っています。さまざまな章をトラフします。
-user827992

1
何もデコードする必要はありません。第1章では、Wコンポーネントは他の3つのコンポーネントに分割されていますが、これも導入部で述べられています。第4章まで延期されるのは OpenGLがこれを行う理由です。それは手元のタスクとは無関係であるため、後まで延期されます。
ニコルボーラス

3
それは、手元の問題にとっては無関係な情報です(つまり、三角形のレンダリング)。あなたはそれについて興味がありますが、これがそれがどのように機能するかを理解するのがなぜそうなのかを理解する必要ありません。何かを学ぶ際の最初のステップは、それが何であるかを理解することです。何が起こっているのかを理解したら、なぜそのようになっているのについて議論することができます。
ニコルボーラス

1
この回答が役立つ場合があります。
iammilind

回答:


9

魔法の用語は「同種座標」であり、これは特定の要素が重要なシステムで使用されます。wikiで概要を確認してください。しかし、それを本当に理解するのは長い学習コースです(私にはわかりません)。


10

あなたが読んだ本の紹介を読んで、あなたは驚かれることでしょう;)

http://arcsynthesis.org/gltut/Basics/Intro%20Graphics%20and%20Rendering.htmlラスタライズの概要

「w」値(最初の3つの値はx、y、z)は、基本的にクリップスペースの寸法を示します。これは1つのスカラー値であるため、クリップスペースの3次元すべてが等しくなります(これが、クリップスペースが立方体である理由です)。すべての頂点には、それが存在する独自のクリップスペースがあり(基本的には「収まる」必要があり、そうでない場合はCLIPS:D)、クリップスペースである「ワールド」は1つではありません(すべてのクリップスペースは同じ「私は、これでも問題を抱えていると思います; P)。

たとえば、頂点の座標が[1,1,1]の場合、クリップスペースが1の場合、頂点は画面の隅近くの右上にあります(すべてがデフォルトの場合、方向がわからない変更することができます)。しかし、頂点のクリップスペースが2の場合、座標[1,1,1]はどこか、たとえば画面の3分の4が右側、画面の3分の4が上部、3番目の次元が自分を推測できます。

たとえば、クリップスペースが5であるとは、キューブが5x5x5である代わりに、すべてのディメンションでそのクリップスペース内の位置が-5〜5の範囲にあることを意味すると思います。しかし、それはおそらく、単純に次の理由によるものです。すべてのxy座標とz座標はクリップスペースの次元で除算されるため、基本的に頂点は次のようになります。

x = x / w

y = y / w

z = z / w

そして、それがすべてを可能にするものです。これが存在する理由は、簡単に比較できるためだと思います。座標がクリップスペースの次元で分割されている場合、1より大きい値を持つ1つ以上のコンポーネントを持つ座標は、クリップスペースの外側に存在します。たとえば、クリップスペースが1024で、座標が[2000,3、-100]である場合、x(2000)コンポーネントはクリップスペースの外にあります(範囲は-1024〜1024のみです)。

計算上、あなたがしなければならないのがクリップスペースの中にあるかどうかは簡単にわかります(非常に大雑把に言えばofc):(x / w)<1 &&(x / w)>-1 then render。また、すべての頂点のすべてのクリップスペースが同じサイズであるため(すべての次元で-1から1の範囲のすべてのクリップスペースキューブ)、正規化プロセスの後に来るものすべてが簡単になり、すべての座標のその瞬間から0から1の範囲の浮動小数点数(切り取られたものは無視)。


問題はクリップスペースの意味ではなく、クリップスペースがそのままである理由でした。つまり、W除算のポイントは何ですか。
ニコルボラス

2
それは3つの箇条書き項目の3番目の質問に答えますが、=)
dammkewl

8

TL; DR 4D空間ではなく、3Dに加えて実質的に常に1のスケーリング数です。1の場合、無視できます。最初の3つの数値はx、y、zです。そうでない場合は、より複雑になります。

以下に簡単な説明を示します。3Dの頂点には3つのコンポーネントのみが必要です

⌈x⌉ v = |y| ⌊z⌋

それらを操作したい場合(例えば、回転、スケーリングなど)、マトリックスを使用します。最も一般的な例は、ワールド座標をクリップスペースに変換するModel-View-Projection(MVP)マトリックスです。このような:

⌈m11 m12 m13⌉ ⌈x⌉ c = |m21 m22 m23| * |y| ⌊m31 m32 m33⌋ ⌊z⌋

ただし、これには大きな欠陥があります。翻訳を行うことはできません。[x,y,z]がゼロの場合m、結果が何であっても常にゼロになるため、変換を含むMVPを作成できません。明らかにそれが欲しい。解決策は、ベクトルの末尾に1を追加し、マトリックスを4x4に拡張することです。

⌈cx⌉ ⌈m11 m12 m13 tx⌉ ⌈x⌉ |cy| = |m21 m22 m23 ty| * |y| |cz| |m31 m32 m33 tz| |z| ⌊ 1⌋ ⌊ 0 0 0 1⌋ ⌊1⌋

(たとえば、直交MVP行列を見ると、たとえばglOrtho()、4行目が見つかります0 0 0 1。暗黙的に残されていることもあります。)数学を調べてみると、同じことがわかります。

⌈cx⌉ ⌈m11 m12 m13⌉ ⌈x⌉ ⌈tx⌉ |cy| = |m21 m22 m23| * |y| + |ty| ⌊cz⌋ ⌊m31 m32 m33⌋ ⌊z⌋ ⌊tz⌋

4番目のコンポーネントはと呼ばれw、1である必要はありません、ほぼ常に1です(とにかく変換 ;その後は通常、ベクトル全体をw再び1で割ることで再均質化されます)。変換マトリックスに翻訳を含めることは、一種のハックです。

編集

元々の動機は、3D座標では不可能な透視投影にあったと思います。4Dベクトルでしかできない変換は他にもありますが、変換が最も簡単に理解できます。


2
ダウン票について説明してください。
Timmmm

+1、情報が正しいと仮定すると、これは良い説明であり、私にとって役に立ちました。ありがとう
ルーク

1

また、私が見るもう1つの理由があり、それは前の回答で言及されていませんでした。

翻訳マトリックスは4x4であるため、「世界」周辺のオブジェクトを翻訳することもできます。3x3マトリックスを使用すると、3d座標を回転およびスケーリングできますが、4x4マトリックスでのみ3d座標を変換できるため、ここから4dベクトルで3d座標を表現する必要があります。


そのような定義の下で4dベクトルのみが「必要」になります。4x4マトリックスは、誰もが他の人を引き受けて主張するのが好きなように追加するためだけの目的ではありません。回転後に(3Dポイントに)変換を追加するだけであれば、4x3マトリックスを定義するだけです。後はこれで十分です。きれいに見えるだけの理由で、他のさまざまな理由で作成されたルールに制限する必要はありません。笑
水たまり
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.