錐台カリング長方形問題

culling frustum opengl rectangles
錐台カリング長方形問題

OpenGL 2dゲームに錐台カリングを実装しようとしています。 この時点でのゲーム内の幾何学的オブジェクトの種類は長方形だけなので、これは非常に簡単だと思いましたが、予期しない結果が得られています。 45度の視野角と、それぞれ0.01および50の近平面と遠平面で対称透視投影を設定しました。 視線ベクトルは常にz軸に平行で、カメラはx軸とy軸に沿ってのみ移動できます。

私が考えたのは、カリングしようとしている長方形のz座標で、カメラに現在表示されているワールド空間の長方形領域を取得することでした。 カメラは錐台の中心を見ているため、次のように、この目に見える長方形の領域の端までの距離を計算します。

GLfloat maxDistance = givenRectangle.z * tanf(0.5 * (fovAngle * M_PI/180) );

次に、この距離をカメラのx座標とy座標に追加してから最大および最小のxとyを取得し、指定された長方形をテストしてこれらの値の間にあるかどうかを確認します。

私の質問は、私がここで正しい軌道に乗っているかどうか、そしてz = 5にオブジェクトがあるときに上記の式がなぜとてつもなく小さな値(何か* 10 ^ -37)を返すかです。これはカメラで( 0,0,0)?

  1  1


ベストアンサー

問題を上から見て、数式をチェックしました。スケッチを見て、正しく理解できたことを確認してください。

image:https://i.stack.imgur.com/j5Usy.png [ここに画像の説明を入力]

AとZを知っていて、Xを解くために、最初に次のように書きました。

tan(A)= X / Z

再配置、私は得る:

X = Z tan(A)

Z = 5およびA = 22.5度なので…​

X = 5 * tan(22.5度)

X = 2.07106781

したがって、数学は正しいがコードが間違っているように見えます-tan関数はラジアンではなく度を期待しているのでしょうか、または* fovAngle *が設定されていないのでしょうか? 各値をデバッグして手動でチェックする必要があると思います。

” ” ‘

錐台内にあるものとないものを理解するというより広範な問題に戻ると、同じ質問にもっとエレガントに答えるために別のテストを使用できることがわかります。 多くのグラフィックスコーダーは、「サイドオブプレーン」テストを使用します。 視錐台は、6つの平面のセット(ビューポートの側面に4つ、ニアクリッピングプレーン、ファークリッピングプレーン)で囲まれた空間のボリュームであると考えてください。

平面上の点と平面の法線が与えられると、平面の方程式を非常に簡単に計算できます。 「内側」(法線の方向)所定の平面]。 6つの面すべてを反復処理すると、表示ボリュームの内外で特定のポイントをすばやくルールできます。

このテストの本当にすてきなことは、それをどれだけ簡単に再利用できるかということです。 長方形)は一連の平面として記述でき、「内部または外部」テストを再利用できます。 非常に一般的です。

3


タイトルとURLをコピーしました