Mit diesem Geometry-Nodes-Setup können Plasmabögen von einem Mesh zu einem anderen erzeugt werden. Man kann die Anzahl der Bögen festlegen und hat einige Optionen zum Steuern der Form und Persistenz der Bögen.

Beispiel
Download
Entstehungsprozess
Diesmal möchte ich versuchen den Entstehungsprozess hier schrittweise zu dokumentieren, also jeden Meilenstein zu bebildern und die wichtigen Punkte zu erklären.
Die Idee
Ich habe neulich genau diesen Effekt manuell mit Kurven nachgebaut. Das war sehr fummelig und leider überhaupt nicht für Animationen geeignet. Für das Projekt war die Animierbarkeit zwar egal, im Nachhinein hätte ich diesen Effekt aber trotzdem gerne animiert. Das alles händisch umzusetzen kommt nicht in Frage, also habe ich versucht den Plasmabogen-Effekt erneut, diesmal mit einer Geometry-Node-Group, nachzubauen.
1. Meilenstein - Basis
Das erste Ziel war es, beliebig viele einzelne Kurven zwischen zwei Meshes zu erzeugen. Anspruch war, dass die Kurve immer bei einem Vertex im Zielobjekt endet ohne dabei das Quellobjekt zu durchkreuzen.
Nach vielem Probieren, war für mich die beste Lösung, für jeden Bogen zufällig einen Vertex aus dem Ursprungsmesh auszuwählen und diesen als Startpunkt der Kurve festzulegen. So kann zwar ein Vertex mehrfach die Quelle eines Bogens sein, dies war für mich aber kein Problem.
Der Zielpunkt der Kurve habe ich mit Hilfe eines "Raycast"-Nodes ermittelt. Der Startpunkt des Raycasts ist der Ursprungsvertex und die Richtung dessen Normalenvektor. Vom Trefferpunkt aus wird dann der nächstgelegende Vertex im Zielmesh ermittelt und als Endpunkt der Kurve festgelegt.
Das sorgt dafür, dass der Bogen möglichst den direkten Weg zum Ziel nimmt und niemals das Quellobjekt durchkreuzt.
Damit diese Prozedur beliebig oft wiederholt werden kann, habe ich sie in einen "Repeat"-Node gepackt.
HINWEIS: Zugunsten der Übersichtlichkeit, habe ich mehrere "Group-Input"-Nodes verwendet, jeder davon ist durch die blaue Färbung erkennbar.

Das Ergebnis bis dahin:

2. Meilenstein - Kurvige Kurven
Bis dahin wurden nur gerade Linien anstatt Kurven gezeichnet. Das zu ändern war mein zweites Ziel.
Ich wollte die Eingaben zum Definieren des Start- und End-Handles des "Bézier Curve"-Node nutzen. Der Starthandle sollte immer bei 25% der Länge der Kurve um einen Zufallswert verschoben werden, der Endhandle ebenso aber immer bei 75% Länge und mit einem anderen Zufallswert.
Dafür habe ich die beiden, bisher nicht genutzten, Eingaben zum Definieren des Start- und End-Handles des "Bézier Curve"-Node genutzt.
Das Hauptproblem war die richtige initiale Position, also bei 25% und 75% der Kurvenlänge zu berechnen. Die Lösung war, Startpunkt- und Endpunkt-Vektoren zu addieren und dann mit der gewünschten prozentualen Position zu multiplizieren.
Diese Vektoren mussten jetzt nur noch um jeweils einen Zufallsvektor verschoben werden. Die Zufallsvektoren sollten auf Basis der entsprechenden Node-Group-Inputs berechnet werden. Als Nutzer soll man nur das positive Maximum angeben, das negative Maximum sollte dann berechnet werden.

Das Ergebnis bis dahin:

3. Meilenstein - Echte Geometrie
Bis hier hin wurden nur Kurven ohne echte "Dicke" erzeugt. Jetzt sollten die entstandenen Kurven einen echten Durchmesser bekommen, dieser sollte bei der Quelle am größten sein und sich zum Endpunkt hin verjüngen. Den Durchmesser am Start der Kurve soll via Node-Group-Input definiert werden können. Außerdem wollte ich hier auch gleich die finale Auflösung der Kurven steuern.
Ein "Curve to Mesh"-Node war die Basis der ganzen Operation. Ich habe dessen "Scale"-Input mit dem Output eines "Float Curve"-Node gefüttert, mit dem ich dann die Verjüngung steuern konnte. Leider habe ich bis jetzt keine Lösung gefunden, die Verjüngung selbst via Node-Group-Input steuerbar zu machen. Die Auflösung kann man nun mit dem Node-Group-Input "Curve Resolution" steuern.

4. Meilenstein - Quell-Geometrie und Material behalten
Ich wollte nun, dass man via Node-Group-Input steuern kann, ob nach der Operation auch noch das Quellobjekt oder nur noch die generierten Bögen existieren sollen. Außerdem wollte ich, dass die neuen Kurven bzw. das generierte Mesh das Material aus dem ersten Materialslot benutzen.
Das Ursprungsmesh zu behalten war recht einfach mit einer "Switch"-Node in Verbindung mit dem entsprechenden Node-Group-Input umzusetzen.
Leider habe ich bis heute keine Möglichkeit gefunden, dies ohne explizite Angabe des Materials zu realisieren, weswegen ich das via Node-Group-Input "Curve Material" dem Nutzer überlasse...

5. Meilenstein - Zielpositionen
Wenn ein Vertex vom Quellmesh mehrfach als Ursprung einer Kurve ausgewählt wird, dann ist auch die Endposition immer dieselbe. Diese sollte sich nach Möglichkeit trotzdem unterscheiden.
Das Problem habe ich gelöst indem ich auf die Trefferposition des "Raycast"-Nodes um einen zufälligen Vektor verschiebe bevor die Position dann zur Ermittlung des nächstgelegen Punktes verwendet wird. Die Größe dieses Vektors kann im Node-Group-Input geändert werden.

Das Ergebniss bis dahin:

6. Meilenstein - Animation
Nun wollte ich, dass sich die Bögen alle paar Frames/Sekunden verändern, sich also vielleicht ein neues Ziel suchen und die Bogenform ändern.
Einfach an den Frame- oder Sekundenzähler zu binden hat nicht funktioniert, das war entweder zu schnell oder zu langsam und hat auch keine Kontrolle erlaubt.
Meine Lösung war, via Node-Group-Input "Rnd each Frame" zu steuern, nach wieviel Frames sich der Seed für verschiedene Zufallselemente verändert. Zusätzlich wird der Node-Group-Input "Seed" ebenfalls berücksichtigt, wird also ein Vielfaches der eingestellten Frameanzahl erreicht oder ändert der Seed vom Node-Group-Input (manuell oder via Keyframe), werden Bogenform und Endpunkt der Kurven neu berechnet.

7. Meilenstein - Raycast ohne Treffer
Wenn der Raycast nicht das Zielobjekt trifft, wird die Position am Ende des Strahls(100 Meter entfernt) als Ausgang zur Berechnung des Kurvenendpunktes benutzt, was zu komischen Bögen führte.
Das Problem war allerdings auch recht einfach mit einem "Switch"-Node zu beheben, die Kurve wird nur zur Geometrie hinzugefügt, wenn der Raycast einen Treffer meldet.
Nach diesem Fix war die NodeGroup für mich soweit fertig und verwendbar.
