Optimierung der Kollision
Da wir für die Kollisionsberechnung vier Rays verwendet haben, die in jedem Frame Schnittpunkte zu allen Objekten berechnen, konnte man an dieser Stelle gut ansetzen. Wir haben die Objekte, mit denen kollidiert werden kann, nun nicht in einem einfachen Array, sondern in einer Octree-Datenstruktur gespeichert. Vor der Berechnung der Schnittpunkte können wir nun im Octree suchen, welche Objekte wir in einer bestimmten Richtung und innerhalb einer gewissen Distanz überhaupt mit unseren Kollisions-Rays schneiden können. Dafür kann man die Parameter der Kollisions-Rays an den search-Aufruf des Octrees übergeben und bekommt als Rückgabe die Objekte die, für die weitere Kollisionsberechnung in Frage kommen.
octreeObjects = octree.search( rayorigin, rayfarplane, true, raydirection );
intersections = raycaster.intersectOctreeObjects(octreeObjects);
Dabei sind:rayorigin
der Startpunkt des Kollisions-Raysrayfarplane
die Länge des Kollisions-Raystrue
die Option, nach Faces (nicht nur nach ganzen Meshes) zu filternraydirection
die Richtung des Kollisions-Rays
Der Octree berücksichtigt dabei sogar die einzelnen Faces und nicht nur Meshes als ganzes. Durch diesen Schritt konnten wir, abhängig von der Komplexität des Levels, bis zu 20 frames per second gutmachen.