TouchDesigner: Instanzen individuell steuern

Schritt-für-Schritt-Anleitung für variable Rotation, Skalierung & Phasenverschiebung mit CHOPs

1. Das Grundprinzip

In TouchDesigner gibt es innerhalb eines Geometry COMP keine separaten Knoten pro Instanz. Um einzelnen Instanzen individuelle Eigenschaften (wie unterschiedliche Winkel oder Größen) zuzuweisen, nutzt man Daten-Kanäle aus **CHOPs**.

Die Transformationen der einzelnen Punkte (Positionen) und die benutzerdefinierten Werte (z. B. Rotation) werden über ein Merge CHOP zusammengeführt und gemeinsam an das Geometry COMP übergeben.

2. Netzwerk-Aufbau Schritt für Schritt

  1. Basis-Geometrien erstellen:
    • circle1 (SOP, Polygon): Das Objekt, das instanziiert wird.
    • circle2 (SOP, Polygon, Divisionen = N): Pfad/Anordnungsmuster für die Instanzen. Hänge daran ein Null SOP namens instances.
  2. Pattern CHOP einrichten:
    • Erstelle ein pattern1 CHOP (Type: Ramp).
    • Verknüpfe den Parameter Length mit der Anzahl der Punkte aus circle2.
    • Benenne den Kanal im Feld Channel Name z. B. um in rotZ.
  3. Positionen & Werte zusammenführen:
    • Füge ein SOP to CHOP ein und verknüpfe es mit dem instances Null SOP (erzeugt tx, ty, tz).
    • Verbinde das SOP to CHOP und das pattern1 CHOP mit einem Merge CHOP.
    • Hänge an das Merge CHOP ein Null CHOP namens inst_data an.
  4. Geometry COMP konfigurieren:
    • Aktiviere Instancing auf der Karteikarte Instance im geo1 COMP.
    • Setze Default Instance OP = inst_data.
    • Ordne tx, ty den Feldern Translate X/Y zu.
    • Ordne deinen CHOP-Kanal rotZ dem Feld Rotate Z zu.

3. Problembehebung: 0°\circ = 360°\circ Überlappung

Verwendet man bei einer vollen Umdrehung (360°\circ) das Intervall 0 bis 360 für N Instanzen, besitzen die erste (0°\circ) und die letzte Instanz (360°\circ) optisch exakt denselben Winkel.

Lösung über die To Range Berechnung:
Der Endwert der Ramp muss so angepasst werden, dass die letzte Instanz den Schritt vor der vollen Umdrehung macht:

$$\text{Endwert} = 360 \times \left(1 - \frac{1}{N}\right)$$

Divisionen ($N$) To Range (Start) To Range (Ende) Erhaltene Winkel pro Instanz
4 (Quadrat) 0 270 0°\circ, 90°\circ, 180°\circ, 270°\circ
6 (Sechseck) 300° 0°\circ, 60°\circ, 120°\circ, 180°\circ, 240°\circ, 300°\circ

Dynamischer Python-Ausdruck im 2. Feld von To Range:

360 * (1 - 1 / me.par.length)

4. Animation & Phasenverschiebung

Das Gesamtsystem lässt sich auf zwei Ebenen sauber über Zeit-Ausdrücke animieren: