Gibt es einen Algorithmus zum Erzeugen eines Blitzes?
Ich hätte gerne einen Algorithmus, der eine Liste von Segment- oder Punktobjekten generiert, die angeben, wo der Bolzen landen wird. Die Methode würde einen Startpunktparameter zusammen mit einem Endpunkt benötigen. Der Bolzen sollte zufällige Abzweigungen haben und in zufälligen Abständen im Zickzack. Das Ergebnis ist ein zufälliger Blitzeffekt, der ungefähr so aussehen würde
(Quelle: wikimedia.org )
Wenn jemand einen Algorithmus kennt, für den dies möglicherweise funktioniert, wäre er dankbar!
algorithm
graphic-effects
Geoffroi
quelle
quelle
Antworten:
Es gibt einen ziemlich einfachen Algorithmus, mit dem Sie Beleuchtungsbolzen generieren können.
Beginnen Sie mit einem Liniensegment zwischen dem Ursprung der Schraube (
O
) und dem Endpunkt (E
)Wählen Sie einen Punkt auf dieser Linie (ungefähr oder genau in der Mitte),
S
und teilen Sie das Segment in zwei Liniensegmente (O->S
undS->E
) auf. VerdrängenS
Abstand zum ursprünglichen Liniensegment (entlang der Segmentnormalen) um einen kleinen zufälligen Betrag. Dies gibt Ihnen eine einzige "Biegung" des Blitzes.Nachdem Sie die Biegung berechnet haben, möchten Sie, basierend auf einer kleinen zufälligen Chance, ein drittes Liniensegment hinzufügen (normalerweise eine Erweiterung des
O->S
Segments). So stellen Sie die "Gabeln" im Blitz her. Normalerweise möchten Sie während dieses Generierungsprozesses Informationen über die Intensität des Bolzens verfolgen, da die Gabeln dunkler sein oder eine subtilere Unschärfe aufweisen sollen:Wiederholen Sie dann den obigen Vorgang für alle neuen Liniensegmente. Sie müssen einen Wiederholungsbetrag auswählen, der Formen erzeugt, die Ihnen gefallen:
Eine ziemlich klare Erklärung für diese Technik findet sich hier im Blog meines Freundes (hier habe ich die Bilder schamlos gestohlen). Es geht auch darum, den Glow-Effekt noch weiter zu vertiefen.
Schließlich gibt es auch dieses NVIDIA-Dokument, das denselben grundlegenden Algorithmus beschreibt (auch mit mehr Details).
quelle
Ich würde einen alternativen Ansatz empfehlen: den Rapid Exploring Random Tree (RRT) . Eine coole Sache dabei ist, dass Sie es dazu bringen können, um Ecken zu fahren oder in alle Richtungen zu explodieren.
Der Algorithmus ist wirklich grundlegend:
Durch Ändern der
RandomSample
undExtendToward
Funktionen können Sie sehr unterschiedliche Bäume erhalten. ObRandomSample
überall nur gleichmäßige Proben entnommen werden, wächst der Baum gleichmäßig in alle Richtungen. Wenn der Baum auf das Ziel ausgerichtet ist, wächst er tendenziell auf das Ziel zu. Wenn das Ziel immer abgetastet wird, ist der Baum vom Start bis zum Ziel eine gerade Linie.ExtendToward
Sie können dem Baum auch interessante Dinge antun. Zum einen können Sie bei Hindernissen (wie Mauern) den Baum zum Wachsen bringen um sie einfach durch Erweiterungen , dass kollidieren mit Wänden Ablehnung.So sieht es aus, wenn Sie die Stichprobe nicht auf das Ziel ausrichten:
(Quelle: uiuc.edu )
Und so sieht es mit Wänden aus
Einige coole Eigenschaften des RRT, sobald es fertig ist:
quelle