標準ビューボリュームの目的は何ですか?


15

私は現在OpenGLを学んでいますが、この質問に対する答えを見つけることができませんでした。

投影行列がビュースペースに適用された後、すべてのポイントが範囲[-1、1]内に収まるように、ビュースペースが「正規化」されます。これは一般に、「標準ビューボリューム」または「正規化デバイス座標」と呼ばれます。

私はこれがどのように起こるかを教えてくれる多くのリソースを見つけましたが、なぜ起こるのかについては何も見ていません。

このステップの目的は何ですか?

回答:


7

最も重要なのは、ポイント(頂点)を3Dワールド空間から2Dスクリーン空間に変換することです。

つまり、頂点にこのマトリックスを掛けると、XとYの座標は画面上の位置([-1、1]の間)になり、Zは深度になります。Zは深度バッファに使用され、平面からカメラまでの頂点(またはフラグメント)の距離を識別します。

投影は、近くの平面からより近い頂点が画面の中央からより遠くにあることを意味します->カメラにより近い三角形は、遠くにあるものよりも大きく見える。そしてこれはあなたの視野に基づいています-あなたはいくつかのcreateProjectionMatrix関数またはcreateFrustumでそれを入力しています。それはあなたのカメラの錐台とその中の頂点を単位立方体に剪断し、スケーリングするように機能します。1より大きく-1より小さい値は表示されません。

また、ピクセルのアスペクト比を維持するため、ピクセルを正方形にすることができます。それは簡単です。次のようにカメラの錐台をせん断します:より広い画面->より垂直方向のせん断、およびその逆。

簡単な答え:
それはあなたのカメラの錐台を定義し、以下に適しています:

  • 近くにあるオブジェクトを遠くにあるオブジェクトより大きく見せます。
  • ピクセルのアスペクト比を維持する-誰もが正方形のピクセルが好きですか?:)

私は彼が投影行列が何をするかを尋ねる部分を見ません。彼は、正規化されたデバイス座標が何のためにあるのか疑問に思っているようです。
クリスは、モニカを復活させる

射影行列は、カメラ錐台を規定します。しかし、これは標準的な表示ボリュームとして[-1,1]を持つ理由を説明しません。代わりに[-100,100]を使用しないのはなぜですか?
ボボボボ

1
1は100よりも「一般的な数」であるため:D(0はさらに一般的ですが、立方体0x0x0はあまりおもしろくない...)
イヴァンクッキル

5

この答えは事実のずっと後にありますが、Googleでこれを見つけたので、おそらくこれは誰かを助けるでしょう。JasonDとNotabeneが言っていることを明確にしたいだけです:クリッピング計算を行う方がはるかに簡単です(あなたが見ているもの、見ているもの、遠く離れている、見るべきものを見てください) 。)。視錐台の境界で平面と交差するかどうかをチェックする代わりに、すべてのx、y、zをxMax、xMin、yMax、ectと単純に比較します。、単純にキューブがあるためです。何かの一部だけを表示したい場合は少し複雑ですが、錐台よりも単位立方体の方が数学は優れています。

他の回答で誤解を招くことがわかったいくつかのこと:

-視錐台の側面を切断するのではなく、同種のマトリックス変換を使用して立方体にワープします。

-このステップでは2D画面に変換していません。このステップはそうする必要はありません。理論的には、錐台を最初に立方体に変換せずにすべての作業を行うことができます。これは、より直感的ですが難しい数学です-しかし、グラフィックスは、平均的なゲーム/何でも毎秒の計算がたくさんあるため、計算を本当に高速にすることです。

詳細:変換先の単位立方体である必要はありません。最大最小計算を行うには、長方形のボックスである必要があります。実際、クラスでは、カメラがz軸を下に向け、zが0から1、xが-1から1、yが-1から1になるボックスを使用しました。一般的に、数学1、0、 -1は計算を簡単にするのに適した数値です。そのため、-100から100などにならないのです。

TLDR:クリッピングを簡単にします。

編集:boboboboにはその要点があります。すべてが三角形、一般的には:D。

出典:大学のグラフィッククラスを受講


おもしろいですが、あなたのポイントは部分的に真実のようです。同種のマトリックスを使用していません。クリップ空間では、点は同種の空間で定義されています。2)true、クリップスペースポントはまだスクリーンに投影されていません。これは、パースペクティブの分割後に発生しますが、クリップ空間からデカルト空間に戻るときに必ず発生することに注意してください。3)はい、いいえ。ポイント座標をNDC空間に変換することは、まだ何らかの形で必要です。必要ではないのは、GPUに固有のクリップスペースです。...
user18490

...ユニットキューブへの再マッピングではなく、クリップスペースステージが必要です。最後の仮定も正しくありません。NDC空間からラスター空間(ビューポート変換)に移動する方が簡単なので、-1から1に再マップします。NDCスペースが[0,1]の範囲にある場合、実際にはさらに簡単です。これは、一部の実装の場合です。ただし、最後はすべて数学なので、他の規則を使用できることを確認してください。詳細については、優れたscratchapixelのWebサイトを参照してください。
user18490


1

これは、OpenGLが画像の表示方法(アスペクト比または解像度、ハードウェアの詳細など)を推測できないためだと思います。オペレーティングシステムまたはドライバー、または正しい解像度/サイズにスケーリングされる中間形式にレンダリングおよび画像化します。


あなたがハードウェアの詳細についてのぞいているとき、あなたは正しくありません。ありません。また、cpuで独自のrastarizatorを書いている場合(それを行う理由は何ですか?この機能の仕組みを学ぶために:))、gpuと同じ行列を使用しています。あなたは私がまだ投票する特権を持っていないことを幸運です:)
Notabene

アスペクト比を知る必要はありませんか?私が理解していることから、それはXとYのスケーリング係数を保存して、後で画像が正しいアスペクト比を持つようにします。
パンジェス

3
私が間違っている場合は修正してください。しかし、ポイントを投影した後、彼は話しているので、2Dを話します。この場合、OpenGLはこの画像を画面のどこに配置するか、どのように表示されるかを知りません。スケーリングと配置が簡単な画像を作成しますが、それはあなたのために行いません。ハードウェアの詳細が悪い名前であったことに同意します。私は単に上記を意味しました。また、アスペクト比で投影行列を指定できますが、その比率はモニターの比率と同じである必要はありません。
歯ごたえガムボール

3
私はこの会話を本当に楽しんでいると言わなければなりません。あなたは正しいのです。深く行きましょう。projMatによる多重配置頂点の後に画像はありません。結果は、2Dポイントと深さのセットです。ラスター化が始まり、画像が作成されるより。(CPUで三角形の頂点の間に線を描画して塗りつぶします(そして、それを何でもシェーディングします)... GPUでピクセル/フラグメントシェーダーの直前に実行されます)。また、アスペクト比は、「スケールアウト」する必要があるポイントを1より大きい値または-1より小さい値に設定するため、表示されません。
ノタベン

2
ああ!ここに問題があります。彼は、「これは一般に「標準ビューボリューム」または「正規化されたデバイス座標」と呼ばれます。」私は彼が正規化されたデバイス座標について尋ねているかのように答えていましたが、彼は実際にはそれらについてまったく尋ねていませんでした。実際には、それらは2つのまったく異なるものであり、それがここで私たちが対立している理由です。おそらく私がやったのと同じ間違いをしないように、それを明確にする必要があります。
歯ごたえガムボール

1

回答はすでに受け入れられていますが、一般的には、視錐台をユニットキューブに変換するとクリッピングに役立ちます。


確かに、このことをより明確にするために少し答えを編集しました。
ノタベン

ところで、ユニットキューブはサイド1のキューブです。したがって、名前は不適切です。代わりに、標準表示ボリュームと呼ばれるべきです。
user18490

1

私もこれを疑問に思っていました。考慮すべきことがいくつかあります。

まず、はい、世界のすべてが、原点を中心にした単位立方体[-1,1]に変換されます。そのユニットキューブに何かが含まれていない場合は、表示されません。

これの良いところは、三角形を簡単にカリングできることです。(三角形の3つの頂点すべてにある場合、x > 1またはx < -1その三角形をカリングできる場合)。


0

Scratchapixelの透視投影行列のレッスンを確認することをお勧めします

http://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix/build-basic-perspective-projection-matrix

理由は、視錐台空間を単位立方体にワープすることであることが明確に説明されています。どうして?本質的には、キャンバス上の3Dポイントを投影するプロセスがNDCスペースの変換に関与するためです。NDCスペースは、画面上のポイントが[-1,1]の範囲に再マップされるスペースです(画面が正方形であると仮定)。また、ポイントZ座標を範囲[0,1](または[-1,1])に再マップします。したがって、最終的には立方体になります。事実は、ポイントがキューブに含まれている場合、ビューフラストラム(奇妙なスペース、角錐台)で定義されている場合よりも、ポイントを処理する方が簡単です。もう1つの理由は、CGで想像できるあらゆる種類の射影変換を同じ空間(単位立方体)にもたらすことです。したがって、たとえば透視投影を使用するか正投影を使用するかに関係なく、

多分あなたはその理由に集中しすぎているかもしれませんが。単位立方体は、実際には、頂点を画面に投影し、座標をラスター空間に再マッピングするために使用または使用される数学のプロセスの結果です。

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