1

OpenGL2dゲームに錐台カリングを実装しようとしています。この時点での私のゲームの幾何学的オブジェクトの種類は長方形だけなので、これはかなり簡単だと思いましたが、予期しない結果が得られています。視野角が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)?

4

1 に答える 1

3

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

ここに画像の説明を入力してください

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つの平面すべてを反復処理すると、表示ボリュームの内外の特定のポイントをすばやく支配できます。

このテストの本当に素晴らしい点は、再利用がいかに簡単かということです。テストを実行したい単純な凸多角形(長方形など)は、平面のセットとして記述できるため、再利用できます。 「内部または外部」テスト。非常に一般的です。

于 2011-03-04T14:31:43.260 に答える