1

次の問題があります。3Dモデルの2Dビューを生成する必要があります。通常の状況では、これはもちろん些細なことです。画家のアルゴリズムまたは同様の手法を使用して、すべてを画面にレンダリングするだけです。残念ながら、CADパッケージに送信できるように、出力は2Dジオメトリである必要があります。これは、隠面判定をピクセルレベルではなくベクトルレベルで実行する必要があることを意味します。これにより、ほとんどの標準的な方法(画家のアルゴリズム、Zバッファなど)が使用できなくなります。

オブジェクト空間の隠面判定を実行するために私が見つけた最も一般的な手法は、理論的には問題なく機能するBSPツリーを使用することです。だから私はそれを実装しましたが、パフォーマンスはリモートでさえ受け入れられませんでした。それは、そのO(n 2)の複雑さを考えるとまったく驚くべきことではありません。私が使用しているテストシーンには、裏面カリング後に約4800の三角形がありますが、アルゴリズムはその数の約5倍または10倍のシーンを処理する必要があり、2乗する必要がある場合はすぐに大きくなります。ジオメトリライブラリの(不足している)速度も、正確には役に立ちません。

それ以来、このパフォーマンスの問題を回避するためのさまざまな方法を試しました。主に、三角形を小さなグループに分割して、八分木などのO(n 2 )の影響を減らすというアイデアに基づいています(ポリゴンの半分以上がルートノードに保存されます)、2D投影シーンを10x10グリッドに分割して、正方形あたりの三角形の数を減らします(機能しますが、ポリゴンの交差の削減は、プロセスを100回繰り返す必要があることよりも重要です)。

今日は、すべての三角形を2Dに投影し、最初に境界の正方形が重なっているかどうかをテストし、次に2つのポリゴンのすべての組み合わせについて各エッジの交差(3x3 = 9)をテストして、どの三角形が交差するかを確認しました。線の交点については、ここで説明するアルゴリズムを使用してジオメトリライブラリをバイパスしました。合計で約11​​60万のライン交差が実行され、約30秒かかりますが、それでも長すぎます(絶対最大実行時間は約5秒だと思います)。これはアルゴリズムの一部にすぎないことを気にしないでください。

私はこのパフォーマンスの問題を解決する方法についてのアイデアを使い果たし始めており、より良いアルゴリズムのためのいくつかの良いアイデアを持っている人がいることを望んでいました。私が考えることができるものはすべてO(n 2)です。

4

2 に答える 2

0

すべてのピクセルが交差する線を計算する、修正されたブレゼンハム アルゴリズムを使用します (おそらく、このアルゴリズムには名前が付いています)。完全な方法は次のようになります。

  1. n x mn と m が非常に大きい (1000x1000 セルとしましょう) 空間インデックスを (グリッドごとに並べ替えられたポリゴンのリストで)作成します。
  2. 投影されたポリゴンごとに、上記の「修正されたブレゼンハム アルゴリズム」を使用して、ポリゴンが交差するすべてのセルにポリゴンを追加します。
  3. 各セル内のすべてのペアを調べて、潜在的な多角形の交差のペアのセットを作成します。
  4. 前のステップで見つかった潜在的なペアに対してのみ、適切な実際の交差テストを行います。

ステップ 3 では、潜在的な交差の数を最大限に削減する必要があります。ステップ 2 は O(n) であり、小さなポリゴン (交差するセルの数が少ない) の場合は非常に高速です。

総ポリゴン数、平均ポリゴン サイズなどに基づいて以前の結果やヒューリスティックを調べて、空間インデックス グリッド サイズを動的に微調整することもできます。

于 2012-02-04T14:54:11.167 に答える