Octree Division


7

Ich habe einen Octree mit einem hohen Polykaninchen und einer 12-Polygon-Plattform.

Der Deal ist das. Sie schießen einen Strahl auf das Kaninchen. Er weicht natürlich aus (oder du vermisst).

Kaninchen schießen

Der gelbe Strahl ist dein Todeslaser.

Die "Kandidaten" -Dreiecke, die aufgrund der von Ihnen getroffenen Teile des Oktrees ausgewählt werden, werden in lila angezeigt.

Kaninchen schießen 2

Sie haben also eindeutig dieses Striping, das auftritt, weil der Wurzelknoten getroffen wurde. Am Ende haben Sie alle Polys im Wurzelknoten getestet. Und die Polys, die sich an den Rändern der Octree-Unterteilung befinden, landen im Wurzelknoten mit dem von mir verwendeten Unterteilungsalgorithmus.

Daher möchte ich die Anzahl der Polys im Stammknoten reduzieren.

Wenn ich den Hasen nur in die Ecke bewege, Eckkaninchen

Mit dem Hasen in der Ecke Raytracing dauert die gesamte Szene 1/3 der Zeit (35s vs 95s, wenn der Hase in der Mitte ist). Ich glaube, das liegt daran, dass sich weniger Dreiecke des Hasen in der Wurzel befinden und Treffer mit nur Octree-Wurzeln weniger Polygone prüfen.

Ich untersuche Möglichkeiten zur Leistungsverbesserung. Grundsätzlich schieben Sie die Tris so weit wie möglich nach unten, so dass sich die Objekte meist in den Blättern befinden.

Ich habe dies naiv versucht und diesen Unterteilungsalgorithmus verwendet, den ich erfunden habe:

split root into 8 CANDIDATE CHILDREN
foreach TRI in root:
  foreach of the 8 CANDIDATE CHILDREN
    if the CANDIDATE CHILD partially contains TRI (at least one vertex of TRI)
      add TRI to CANDIDATE CHILD
CLEAR tris in root

Dadurch werden Dreiecke entlang der Hierarchie in Blattknoten verschoben. Aber ich bekomme Löcher aus bestimmten Winkeln mit seltsamen Fehlmustern:

(erwartet) erwartete holeless Szene

Löcher aus einem Winkel:

Löcher aus einem Winkel

gleiche Szene, anderer Blickwinkel:

gleiche Szene, anderer Blickwinkel

Ich denke, das liegt daran, dass ich die Wurzel räume. (Denn wenn ich die Wurzel nicht lösche, funktioniert Raytracing in allen Winkeln korrekt.)

Habe ich die Polygone richtig auf den Baum "geschoben"? Kann jemand erraten, warum ich Löcher habe?

Wie verbessern Sie die Leistung Ihres Octree?

Muss ich die Dreiecke teilen? Ich versuche das zu vermeiden, damit ich nicht immer dünnere Dreiecke bekomme / die Szenengeometrie nicht mehr multipliziere, als ich brauche.

Mir ist auch bewusst, dass KD-Bäume und dass sie Octrees übertreffen sollten, aber sie erfordern auch Poly Splitting. Ich suche wirklich nach Möglichkeiten, mein Octree hier zu verbessern.


2
Primitive sollten immer in den Blättern sein. Erwägen Sie auch die Verwendung eines B + -Baums mit ungleichmäßiger Partitionierung (Quader innerhalb eines Quaders müssen nicht gleichmäßig verteilt werden) und partitionieren Sie den Raum danach, ob er Grundelemente enthält oder nicht. Auch -1 für Todesstrahlen auf unschuldige Hasen :).
Jonathan Dickinson

Ich denke, Ihr Abschnitt "Bearbeiten" hat Ihre eigene Frage so ziemlich beantwortet. Sie sollten es als Antwort posten und akzeptieren.
Trevor Powell

Antworten:


2

Ich verstehe jetzt, warum ich Löcher bekomme. Ich verwende ein schlechtes AABB-Dreieck-Teileinschlussschema: Ein AABB "enthielt teilweise" ein Dreieck, wenn der AABB mindestens einen Scheitelpunkt des Dreiecks enthielt . meistens leer

E sind "leer", gemäß dem schlechten Erkennungsschema "Dreieck teilweise in AABB".

Ich denke, dies bedeutet, dass Sie die Dreiecke teilen müssen , wenn Sie alles auf Blattknoten drücken möchten .


4
Teilen Sie die Dreiecke oder schieben Sie Dreiecke in jeden Blattknoten, mit dem sie sich schneiden. nicht nur diejenigen, die ihre Eckpunkte enthalten.
Trevor Powell
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.