回答:
最も重要なのは、ポイント(頂点)を3Dワールド空間から2Dスクリーン空間に変換することです。
つまり、頂点にこのマトリックスを掛けると、XとYの座標は画面上の位置([-1、1]の間)になり、Zは深度になります。Zは深度バッファに使用され、平面からカメラまでの頂点(またはフラグメント)の距離を識別します。
投影は、近くの平面からより近い頂点が画面の中央からより遠くにあることを意味します->カメラにより近い三角形は、遠くにあるものよりも大きく見える。そしてこれはあなたの視野に基づいています-あなたはいくつかのcreateProjectionMatrix関数またはcreateFrustumでそれを入力しています。それはあなたのカメラの錐台とその中の頂点を単位立方体に剪断し、スケーリングするように機能します。1より大きく-1より小さい値は表示されません。
また、ピクセルのアスペクト比を維持するため、ピクセルを正方形にすることができます。それは簡単です。次のようにカメラの錐台をせん断します:より広い画面->より垂直方向のせん断、およびその逆。
簡単な答え:
それはあなたのカメラの錐台を定義し、以下に適しています:
この答えは事実のずっと後にありますが、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。
出典:大学のグラフィッククラスを受講
これは、OpenGLが画像の表示方法(アスペクト比または解像度、ハードウェアの詳細など)を推測できないためだと思います。オペレーティングシステムまたはドライバー、または正しい解像度/サイズにスケーリングされる中間形式にレンダリングおよび画像化します。
Scratchapixelの透視投影行列のレッスンを確認することをお勧めします
理由は、視錐台空間を単位立方体にワープすることであることが明確に説明されています。どうして?本質的には、キャンバス上の3Dポイントを投影するプロセスがNDCスペースの変換に関与するためです。NDCスペースは、画面上のポイントが[-1,1]の範囲に再マップされるスペースです(画面が正方形であると仮定)。また、ポイントZ座標を範囲[0,1](または[-1,1])に再マップします。したがって、最終的には立方体になります。事実は、ポイントがキューブに含まれている場合、ビューフラストラム(奇妙なスペース、角錐台)で定義されている場合よりも、ポイントを処理する方が簡単です。もう1つの理由は、CGで想像できるあらゆる種類の射影変換を同じ空間(単位立方体)にもたらすことです。したがって、たとえば透視投影を使用するか正投影を使用するかに関係なく、
多分あなたはその理由に集中しすぎているかもしれませんが。単位立方体は、実際には、頂点を画面に投影し、座標をラスター空間に再マッピングするために使用または使用される数学のプロセスの結果です。