Übersicht

Verflochtene Sphere_Sweeps

Demodatei: Demo8.pov

Mit Hilfe des in den letzten beiden Kapiteln dargestellten Ansatzes lassen sich auch verflochtene Sphere_Sweeps erzeugen. Es gibt allerdings noch einen anderen Weg, den ich Ihnen im folgenden Kapitel demonstrieren werde. Dazu wurde ein Makro geschrieben (LinearFlecht), der Positionen auf einem Zylindersegment erzeugt. Die Größe dieses Segments, der Winkel, mit dem es aus dem Zylinder herausgeschnitten wird, ist ein Parameter des Makros, der Radius des Zylinders ein anderer. Die roten Kugeln in den folgenden Abbildungen markieren Start- und Enpunkt der jeweiligen Zylinder. In diesen Abbildungen sehen Sie das Ergebnis, wenn man zunächst das Zylindersegment vergrößert. (Diese Größe entspricht der Variabilität des Winkels den der Sphere_Sweep von der Zylinderachse aus gesehen überspannen kann.) Anschließend erhöhen wir die Variabilität des Zylinderradius. (In den unten dargestellten Beispielen zeigen wir Sphere_Sweeps, die durch mehrfache Wiederholung der gesamten Prozedur erzeugt wurden.)

Sphere_sweep, cubic spline Sphere_sweep, cubic spline Sphere_sweep, cubic spline Sphere_sweep, cubic spline Sphere_sweep, cubic spline Sphere_sweep, cubic spline Sphere_sweep, cubic spline

Nun folgen die Zeilen, mit denen man diese Strukturen erzeugt: Zunächst der Makro, der die Positionen auf dem Zylindersegment erzeugt und sie in einem Array speichert.

//Der folgende Makro erzeugt Positionen für einen Sphere_Sweep auf einem Zylindersegment um einen Ausgangsvektor.
//Die Parameter des Makros sind die Start- und Endposition des Vektors, der Radius des Zylinders,
//die Anzahl der definierten Positionen und der Winkel, der das Segment aus dem Zylinder ausschneidet.

#macro LinearFlecht (PStart, PEnd, Radius, Number, VarianceAngle)

#declare Positions2 = array [Number];//Der Array für die Positionen wird initialisiert.

//Die äußersten Positionen des Sphere_Sweeps werden definiert.
#declare Positions2 [0] = PStart-0.1*(PEnd-PStart);
#declare Positions2 [Number-1] = PEnd+0.1*(PEnd-PStart);

//In der folgenden Schleife werden die inneren Positionen des Sphere_Sweeps definiert und gespeichert.
#declare var1 = rand(chance1);
#local ticker = 1;
#while (ticker < Number-1)
#local P1 = PStart + (ticker-1)*(PEnd-PStart)/(Number-3);
#local P2 = VPerp_To_Vector(PEnd-PStart) ;
#local P2 = vnormalize (P2) ;
#local P1 = P1 + Radius *P2;
#local P1 = vaxis_rotate(P1,PEnd-PStart,360 * var1);
#local P1 = vaxis_rotate(P1,PEnd-PStart,VarianceAngle*rand(chance3)) ;
#declare Positions2 [ticker] = P1;
#local ticker = ticker + 1;
#end
#end

Die folgenden Zeilen rufen den soeben dargestellten Makro wiederholt auf und kombinieren ihn mit anderen Makros die entsprechend den gespeicherten Positionen Sphere_Sweeps und Kugeln konstruieren.

//Initialisierung von pseudo-random streams.
#local chance1 = seed (13);
#local chance2 = seed (15);
#local chance3 = seed (23);

//Die folgende Schleife erzeugt jeweils einen Sphere_Sweep und entsprechende Kugeln.
#declare ticker1 = 0;
#while (ticker1 <18)

//Der Radius des Zylinders variiert bei mehreren Durchgängen der Schleife.
#declare Radius = 2 + 0.1*(rand(chance1)-0.5);

//Dieser Makro erzeugt die Positionen.
LinearFlecht (<0, 0, 0>, <0, 0, 24>, Radius, 7, 20)

//Dieser Makro zeichnet die Sphere_Sweeps.
DrawSphereSweep (Positions2, 0.1, 7)

//Und dieser Makro zeichnet die Kugeln.
DrawSpheres (Positions2, 0.12, 7)
#declare ticker1 = ticker1 + 1;
#end

Übersicht