14

これまでの設計上の決定について少し背景を説明します... ポイントを格納できる octree 構造を開発しました。特定の基本ボクセル サイズに基づいて、「世代」の再帰を制限することにしました。子ノードは、そのノードにポイントが追加されたときにのみ作成されます。これは動的なグラフィックス アプリケーションではありません。この octree とその中のオブジェクトは静的であるため、パフォーマンスを向上させるための前処理は問題になりません。

ここで、オクツリーに「シェイプ」を追加したいと思います。具体的には、三角形で構成されるサーフェス メッシュです。これらの三角形の頂点は、八分木に格納されている点に対応していません。これらの形状を octree にどのように格納しますか? 2つのオプションが表示されます...

Alt 1: 交差するすべてのリーフ ノードに三角形を格納します。 Alt 2: すべての頂点を保持できる最小のノードに三角形を格納します。

灰色のノードは、形状がないという点で「空」です。代替案 1 では、シェイプが交差するすべてのノードに保存されます。つまり、ノード 1a には shape1 が含まれ、4c と 4d は shape2 を共有します。別の方法 2 では、形状は交差する最小のノードにのみ格納されます。つまり、ノード 1a には形状 1 が含まれ、ノード 4 には形状 2 が含まれます。

私が見た octrees に関するほとんどの投稿は、Alt1 を前提としていますが、その理由は説明されていません。Alt2 は私にとってより理にかなっており、ノード境界に存在する形状に対してのみ余分な作業を作成します。Alt1 が望ましいのはなぜですか?

編集:明確にするために、使用する実装言語は C++ であるため、その言語でのサンプル実装を好みますが、質問は言語に依存しません。タグの使い方が間違っていたらごめんなさい。

Edit2:形状ストレージの問題とは直接関係ありませんが、このリンクには、質問の背後にあるオクツリートラバーサルに関する良い議論があります。この質問に取り組むことに興味のある人なら誰でも役立つかもしれないと思いました。


更新: 4 年後、Alt2 は実装が簡単になりましたが、より高い octree レベルに格納された大きな三角形が octree を走査するたびにテストされるため、非常に遅くなりました。私の場合、それは数百から数千の不要なテストを意味しました。代わりにR*-Tree バリアントを使用するようにコードを修正することになりました。これは実装が簡単で、大幅に高速でした。

4

3 に答える 3

1

これは、私がよく知っている四分木に関連していますが、八分木に相当する 2D です。なので当てはまるかもしれません。

挿入への一般的なアプローチ: 四分木の各内部ノードには、四分木の四分円が保持できる「オブジェクト」の最大数である容量があります。容量に達した場合は、すべての「オブジェクト」を細分化してから、適切な子象限に挿入します。また、細分化し、1 つ以上の「オブジェクト」が複数の子象限にまたがるポイントもあります。挿入/クエリを行うときは、そのケースに注意してください。通常、ノード容量は、より高速な挿入またはクエリを優先するように選択されます。

したがって、それを考慮すると、提示している ALT2 画像に問題はないと思います。しかし、常にALT1画像が表示される理由についての私の仮定は、占有されていないセルに挿入するときのデフォルトのアプローチは、細分化してから挿入することです。

于 2014-04-29T22:47:41.110 に答える