AABBまたはAxisAlignedBounding Boxは、2つの3D領域の交差/包含をテストするための非常にシンプルで高速なオブジェクトです。
提案するように、比較する2つの領域、たとえば錐台を表す領域とメッシュを表す領域の最小と最大のx、y、zを計算しています。後続の立方体には、座標系の各軸に平行なエッジがあるため、軸が整列されます。明らかに、これはわずかに不正確である可能性があります(交差/封じ込めの誤検知ですが、誤検知はありません)。したがって、AABBテストでリストをフィルタリングしたら、残りのメッシュに対してより正確なテストを実行することを検討できます。
次のように交差/封じ込めをテストします。
F=錐台のAABB
M=メッシュのAABB
bool is_mesh_in_frustum(const AABB& F, const AABB& M)
{
if( F.min.x > M.max.x || M.min.x > F.max.x || F.min.y > M.max.y || M.min.y > F.max.y || F.min.z > M.max.z || M.min.z > F.max.z )
{
return false;
}
return true;
}
バウンディングスフィア、オリエンテッドバウンディングボックス(OBB)、およびその他のタイプのバウンディングボリュームのアルゴリズムを検索することもできます。レンダリングするメッシュの数に応じて、より正確な方法が必要な場合と不要な場合があります。
そもそもAABBを作成するには、メッシュの頂点をたどり、遭遇した最小/最大のx値とy値およびz値を記録するだけです。
また、メッシュが変形しない場合は、メッシュ座標空間の境界ボックスが静的になるため、頂点データを取得したらすぐにすべてのメッシュのAABBを計算できることを考慮してください。
次に、レンダリングパスごとにテストを実行する前に、事前に計算されたAABBの最小頂点と最大頂点を錐台座標空間に変換することを確認する必要があります。
編集(コメント用):
AABBは、境界を定めている領域の正確な形状であるため、誤検知を引き起こす可能性がありますが、通常、境界を定めている領域よりも大きくなります。
球体を考えてみましょう。AABBを使用する場合、バスケットボールを箱に入れるようなもので、ボールが届かない箱の隅にこれらすべての隙間があります。
または、錐台がカメラに向かって内側に角度を付けている錐台の場合、そのAABBは、カメラに向かって軸に沿ってまっすぐ進み、カメラが見ることができるよりも広い領域を効果的に境界付けます。
これは不正確さの原因ですが、錐台の少しでも内側にあるオブジェクトをカリングすることは決してないはずです。したがって、最悪の場合、カメラに近いが錐台の外側にあるメッシュを描画することになります。
これを修正するには、最初にAABBテストを実行し、trueを返すメッシュの小さなリストを作成してから、錐台やメッシュのより正確なバウンディングボリュームを使用して、その小さなリストでより正確なテストを実行します。