2011-01-31 3 views
1

私はOpenGL 2Dのゲームで錐台のカリングを実装しようとしています。この時点で私のゲームの幾何学的オブジェクトの唯一の種類は長方形なので、これはかなり簡単だと思いましたが、予期せぬ結果が出ています。視野角が45度で、対地遠近法が0.01と50の対称透視投影を設定しました。視線ベクトルは常にz軸に平行であり、カメラはx軸とy軸に沿ってのみ移動できます。Frustum Culling Rectanglesの問題

私の考えは、私が追いかけようとしている矩形のz座標でカメラに現在見える世界の空間の矩形領域を取得することでした。カメラ錐台の中心を見ているので、次のように、私は、この可視矩形領域のエッジまでの距離を計算する:

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

そしてIが追加にx及びy座標からこの距離をsubstractカメラは最大と最小の可視xとyを取得し、指定された矩形をテストしてこれらの値の中間にあるかどうかを調べます。

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

+0

3Dを意味しないのですか? –

+0

うんうんうまく技術的には私は3Dの視点で2次元矩形しか持たないので、それを何とかしたいと思っています。私は透視投影を望んでいる理由は、ズームインとズームアウトができるようにするためです。トップダウンカメラの向き – Jacob

+0

私はその部分を教えてください:私は追加し、最大と最小の可視xとyを得るために、カメラのxとyの座標からこの距離を引くと、与えられた矩形をテストするそれがこれらの値の間にある場合。 – jocelyn

答えて

3

問題を上から取り、私はあなたの数式をチェックしました - スケッチを見て、私があなたを正しく理解していることを確認してください。

enter image description here

我々はAを知っているとZとXのために解決したいということを考えると、私が最初に書いた:

タン(A)= X/Z

並べ替え、私が取得:

X = Z黄褐色(A)

のでZ = 5、A = 22.5°...

X = 5×タン(22.5度)

X = 2.07106781

あなたは数学の権利が、あなたのコードが間違っを持っているかのように、それは思えない - 多分あなたの日焼けの機能が期待される度ではなく、ラジアン、またはfovAngleは設定されていませんか?私はあなたがデバッグし、各値を手チェックする必要があると思います。


バック行い、あなたの錐台内に存在しないものを考え出すのより広い問題になるだろう、あなたは、よりエレガントに同じ質問に答えるためにさまざまなテストを使用できることがあります。多くのグラフィックスコーダは、「面の横」テストを使用します。あなたの視域は、6面のセット(ビューポートの側面、近くのクリッピング面、遠方のクリッピング面)で囲まれた空間です。

平面上の点と平面に対する法線が与えられていると、平面の方程式を簡単に計算することができます。これは、makes it trivial to test whether a given point is "inside" (in the direction of the normal) a given planeです。 6つの飛行機すべてを繰り返し、あなたはすぐにあなたの視聴音量の中または外で与えられた点を支配するでしょう。

このテストの本当にすっきりしたことは、どれくらい簡単に再利用できるかということです。あなたが試したいと思っている単純な凸多角形(例:四角形)は、プレーンの集合として記述できます。あなたの「インサイドまたはアウト」テストを再利用してください。非常に一般的です。

+0

あなたの答えをありがとう、これは確かに私が意味したものです。私はまた、問題が何であるかを知った:それは、私の特定のコードで正しく動作していなかったfovAngleへの二重ポインタを持つ何かでした...錐台淘汰のあなたの方法についての1つの質問:私はこのより一般的なアプローチ私が記述した方法よりも単純な四角形の方が遅いですか? – Jacob

+0

あなたがバグを見つけたらうれしいです。はい、飛行機の方法は確かに遅くなります。いくつかの段階で開発の手間を省くことができますが、特定の状況では過度な作業になる可能性があります。 –

+0

スピードについて言えば、とにかく2Dゲームを作成していて、実際にパフォーマンスのために全力を尽くしたい場合は、パースペクティブを使用しないことを検討してください。代わりに正射影法を使用すると、「画面内の四角形です」というテストは、0