Erstellen Sie einen Octree und fügen Sie in jede Blattzelle die Liste aller Dreiecke von B ein, die die Zelle schneiden. Markieren Sie auf jeder Ebene, ob die Zelle leer ist oder nicht. Wenn eine Zelle auf einer Ebene nur 1 Poly hat, notieren Sie die Poly, damit Sie die Suche frühzeitig beenden können (große Boden- / Wanddreiecke). Sie können Zellen so lange unterteilen, bis Sie eine angemessene Anzahl von Dreiecken in jeder Zelle haben.
Suchen Sie mit dem Octree die nächste nicht leere Zelle.
Suchen Sie das nächstgelegene Dreieck in dieser Zelle und notieren Sie den Abstand.
Für jede nicht leere Zelle, die sich innerhalb dieses Abstands befindet: Suchen Sie das nächstgelegene Dreieck in diesen Zellen, halten Sie den nächstgelegenen Abstand ein und ignorieren Sie jedes Mal Zellen, die weiter entfernt sind.
Der Grund für diese letzte Iteration ist, dass ein Dreieck am anderen Ende einer Zelle möglicherweise weiter entfernt ist als ein Dreieck in einer Nachbarzelle.
Wenn Sie mehr Geschwindigkeit benötigen, können Sie dies mit GPGPU (z. B. OpenCL) verwenden, um sowohl den Octree zu erstellen als auch alle Punkte von A parallel zu durchlaufen, sobald Ihr Octree erstellt wurde.
Beachten Sie, dass die GPGPU-Leistung zwischen den GPUs stark variiert. Was also Echtzeit ist, ist möglicherweise kaum schneller (oder sogar langsamer) als die CPU.
Stephane Hockenhull
quelle