フラストムカリングの長方形の問題
-
27-10-2019 - |
質問
OpenGL 2DゲームでFrustum -Cullingを実装しようとしています。この時点での私のゲームの幾何学的オブジェクトの唯一の種類は長方形ですので、これは非常に簡単だと思いましたが、予想外の結果が得られています。 45度の視野角とそれぞれ0.01と50の近くの平面を持つ対称的な視点投影をセットアップしました。目ベクターは常にZ軸に平行であり、カメラはX軸とY軸に沿ってのみ移動できます。
私のアイデアは、私がcullしようとしている長方形のZ座標で現在カメラに見える世界空間の長方形の領域を得ることでした。カメラは甲殻の中心を見ているので、次のように、この目に見える長方形の領域の端までの距離を計算します。
GLfloat maxDistance = givenRectangle.z * tanf(0.5 * (fovAngle * M_PI/180) );
次に、この距離をカメラのxおよびy座標に往復させて、最大値と最小の可視xとyを取得し、指定された長方形をテストして、これらの値の間にあるかどうかを確認します。
私の質問は、私がここで正しい軌道に乗っているかどうか、そして上記の式がz = 5にオブジェクトを持っているときに不条理に小さな値(何か*10^-37)を返す理由です。 0,0,0)?
解決
上から問題を抱えて、私はあなたの式をチェックしました - 私があなたを正しく理解したことを確認するためにスケッチを参照してください。
私たちがAとZを知っていて、Xを解決したいと思うことを考えると、私は最初に書きました:
tan(a)= x/z
再配置、私は得ます:
x = z tan(a)
z = 5およびa = 22.5度から...
x = 5* tan(22.5度)
x = 2.07106781
だから、それはあなたが数学を正しく持っているように思えますが、あなたのコードは間違っています - おそらくあなたの黄褐色の機能はラジアンではなく程度を期待しています、または フォーバー 設定されていませんか?各値をデバッグしてハンドチェックする必要があると思います。
あなたの甲殻類の内側に何をしていて、そうでないかを理解するというより広い問題に戻ると、別のテストを使用して同じ質問にもっとエレガントに答えることができるかもしれません。多くのグラフィックスコーダーは、「面のサイド」テストを使用しています。視聴施設は、6つの飛行機のセット(ビューポートの側面には4つ、クリッピングプレーンが近く、遠くの切り抜き平面)に囲まれた大量のスペースであることを考えてください。
平面上のポイントと平面の正常を考えると、平面の方程式を非常に簡単に計算できます。 与えられたポイントが「内側」(通常の方向)であるかどうかをテストすることを些細なことにします。. 。 6つの飛行機すべてを繰り返すと、表示ボリュームの内外で特定のポイントをすばやく支配します。
このテストの本当にきちんとしたことは、それをどれだけ簡単に再利用できるかということです。たまたまテストをしたい単純な凸ポリゴン(例えば、長方形)は一連の平面として説明でき、再利用できるようにします「インサイダーまたは外部」テスト。非常に一般的です。