10

私は、(たとえば) 45 度の視野と限界視野範囲で特定の方向を向いているオブジェクトを持っています。すべての初期チェック (Quadtree ノードと距離) を実行しましたが、特定のオブジェクトがそのビュー コーン内にあるかどうかをチェックする必要があります (この場合、オブジェクトが見える場合にのみそのオブジェクトを追跡することを決定します)。

から までの度ごとにレイをキャストする以外Direction - (FieldOfView / 2)Direction + (FieldOfView / 2)(私は現在それを行っていますが、それは恐ろしいことです)、この可視性チェックを行う最良の方法は何ですか?

4

5 に答える 5

11

私はビデオ ゲーム業界で働いてきましたが、フレームごとに arccos のような三角関数を実行するのは理想的とは言えません。代わりに、円錐の角度の余弦を事前に計算します。

float cos_angle = cos(PI/4); // 45 degrees, for example

次に、各フレームで、点がその円錐の内側にあるかどうかを、円錐と の内積と比較することですばやく確認できます。

vector test_point_vector = normalize(test_point_loc - cone_origin);
float dot_product = dot(normalized_cone_vector, text_point_vector);
bool inside_code = dot_product > cos_angle;

三角関数はなく、掛け算、割り算、足し算だけです。ほとんどのゲーム エンジンには、ベクトル用に最適化された normalize() 関数があります。

これは、次の式により機能します。

A · B = |A| * |B| * cos(Θ)

ベクトルを正規化すると (A -> An)、式は単純化されます。

An · Bn = cos(Θ)
于 2008-10-31T16:21:18.187 に答える
9

あなたの視線方向 (ベクトルとして理解される) と、あなたから始まりオブジェクトで終わるベクトルとの間の角度を計算します。FieldOfView/2 に該当する場合、オブジェクトを表示できます。

その角度は次のとおりです。

arccos(scalarProduct(viewDirection, (object - you)) / (norm(viewDirection)*norm(object - you))).
于 2008-10-15T05:28:02.000 に答える
3

ビューアーのヘディング ベクトルとビューアーからターゲットへのベクトルの間の角度を取得します。その角度が (FieldOfView/2) より小さい場合、ターゲットは視聴者の視野内にあります。

ベクトルが 2 次元または 3 次元の場合、これは同じように機能します。(3D では、円錐ではなく視錐台がある場合は、角度を 2 つのコンポーネントに分ける必要があります。) 2 つのベクトルの間の角度を見つける必要があるだけです。

1 つのポイントよりも大きいターゲットをテストする場合は、境界ボックスの角など、ターゲットごとに複数のポイントが必要になります。ビューアからこれらのポイントのいずれかへのベクトルが視野内で角度を与える場合、ボックスのそのコーナーが表示されます。

于 2008-10-15T05:31:16.567 に答える
2

3D を行っていて、表示範囲を錐台として定義できる場合は、この錐台カリング手法に似たものを使用できます。

于 2008-10-15T05:30:58.937 に答える
2

すでに良い答えですが、Wolfire ブログへのリンクを提供したかっただけです。彼らは最近、「視野」方程式を一例とする代数シリーズを開始しました。それを読んでください、よく書かれていて簡単です。

于 2009-07-04T12:20:21.460 に答える