OpenGLの透視投影行列を理解する


7

Open GL(OpenGL ES 2.0を含む)での透視投影行列の設定には、次の一般的な形式があります。

glm::mat4 perspective(float fovy, float aspect, float zNear, float zFar);

最後の2つのパラメータに注意してください。1つ目は、カメラに近い平面であるzNear平面を指定します。2つ目は、カメラから遠いzFar平面を指定します。

OpenGLでは、さらに遠い、つまり「画面の奥深く」にあるものは、負のZ軸を持っていることはよく知られています。(OpenGL SuperBibleやsimmilar などの信頼できるソースから取得した)設定された透視投影行列のすべてのOpenGLの例が、透視投影関数の上記の2つのパラメーター(zNear、zFar)が交換されているように見えるのはなぜですか?

この例は、GLM(OpenGL Math)webisteからの抜粋です。

glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.f); 

zNearパラメータはzFarパラメータよりも実際にはカメラから遠いことがわかります。これは、カメラ/ビューアに100ポイント近い距離です。

あなたは提供することができます説明が理解しやすい、してください?私はこれが1つだけではなく、zFarをzNearよりも高い正の値として渡すすべての例です。ありがとう。


私の例:

私のコードでは、設定すると:

glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 1000.0f, -500.0f); 

私の錐台はz正方向に1000ポイント、z負方向に500ポイントと想定しています。

このように設定すると、少なくとも一部のオブジェクトが表示されますが、完璧ではありません。何らかの理由で、負のz座標に配置されたオブジェクトのみが表示されます。

これは、透視投影関数についての私の誤った理解に関連している可能性があります。


1
zNearとzFarは、平面からの距離であり、カメラからの距離を指定するためです...または、私はあなたの質問を誤解していますか?
jeffythedragonslayer '26年

@da code monkey:+1、いや、あなたはまったく誤解されていません。つまり、上記の2つのパラメータには物理的な平面座標は含まれていませんが、カメラからのオフセット値を表しています。カメラを動かすと、錐台がそれに追従します。これはOpenGLの本で強調されるべきでした。
Bunkai.Satori

それはそれらの本のほとんどでかなり明確に綴られています。値が絶対であることを示すパッセージの具体例はありますか?

また、慣例により、「より深い」ものは「より否定的な」深さを持っているとは限らない。好きなようにアレンジできます。

@da code monkey:わかっている場合は、このスレッドに通常の回答として回答を再入力してください。その後、それを承認済みの回答としてマークすることができます。助けてくれてありがとう、私はこれから多くの頭痛がしました。
Bunkai.Satori、2011年

回答:


5

問題のメソッド(glm::perspective)とそのilkは、本質的にはgluPerspectiveのラッパーまたは再実装です。その関数のドキュメントからわかるように、near / far値はビュープレーンからの距離であり、常に正です。


役立つ回答の+1。こんにちはジョシュ、そして説明をありがとう。それは私のテキストの誤解でした。ちなみに、この知識は、私のOpenGLグラフィックの予測できない動作を解決するための鍵でした。追加するものは何もないので、これをAccepted Answerとしてマークしましょう。
Bunkai.Satori
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.