zur KnowledgeBase
kostenlosen Counter einrichten
zur SiteMap

myself

coding

graphics

creative

links


Sprung innderhalb der Websitediese Seite weiterempfehlen
home/

     Galaxy (3D-Engine+Java)

Man soll es nicht glauben, aber mit einer relativ einfachen und plausieblen mathematischen Formal kann man die Form einer einfachen Galaxy recht einfach nachbilden.
Basierend auf meiner 3D-Engine in Java habe ich ein 3D-Objekt erstellt, dass anhand weniger Parameter und mittels einer mathematischen Formel eine recht beeindruckendes Modell einer Galaxy generiert.


6spiralige Galaxie
2spiralige Galaxie


Hier ein paar Beispiel-Applets
interner Link2spiralige Galaxie
interner Link4spiralige Galaxie
interner Link2spiralige Galaxie mit vielen Umdrehungen

Hier möchte ich kurz die Vorgehensweise bei der Entwicklung der Formel erläutern:

Anfang:
Die folgende Formel generiert Punkte des 3dimensionalen Raumes, welche sich spiralenförmig und zum Zentrum hin gehäuft anordnen. Die Darstellung ermöglicht meine 3D-Engine.
x(a) = X-Koordinate des a-ten Punktes
y(a) = Y-Koordinate des a-ten Punktes
z(a) = Z-Koordinate des a-ten Punktes

Parameter:
N - Punkten einer Spirale von Spitze bis Zentrum
a - ganzzahlige Zählvariable von 1 bis N, Nummer des akt. Punktes der akt. Spirale


1. Schritt:
Grundlage ist die Formel einer Spirale. Dies ist im Grunde ein Kreis, der seinen Radius reduziert. Die Z-Koordinate sei 0:
Parameter:
R - Radius des Kreises / der Galaxy:

x(a) = sin(a/N*2*PI)*R
y(a) = cos(a/N*2*PI)*R
z(a) = 0

Nun ist der Radius nicht konstant, sonder R => R(a) und nimmt stetig ab: R(1)=R, R(N)=0
Dieses Abnehmen ist hier linear, quadratisch und kubisch dargestellt:

lineare Abnahme des Radius
lineare Abnahme des Radius
lineare Abnahme des Radius
lineare Abnahme des Radius quadratische Abnahme des Radius kubische Abnahme des Radius


Parameter:
p - Grad der Abnahme: 1 => linear, 2 => quadratisch, 3 => kubisch

R(a) = R*(1-a/L)^p


2. Schritt:
Im Moment hat unsere Spirale eine Umdrehung, bis die das Zentrum erreicht. Das lässt sich ändern:
Parameter:
r - Umläufe, bis das Zentrum erreicht wird

x(a) = sin(a/N*r*2*PI)*R(a)
y(a) = cos(a/N*r*2*PI)*R(a)
z(a) = 0


3. Schritt:
Legen wir nun noch ein paar Spiralen mehr hinzu. Dazu muss nun mehrere Spiralen wie gewohnt, jetzt jedoch mit einer gewissen Verschiebung erzeugt werden.
Parameter:
n - Anzahl aller Spiralen (sie sollen sich gleichmäßig auf 360° verteilen)
b - ganzzahlige Zählvariable von 1 bis n, Nummer der akt. Spirale

x(a,b) = sin(a/N*r*2*PI+b/n*2*PI)*R(a)
y(a,b) = cos(a/N*r*2*PI+b/n*2*PI)*R(a)
z(a,b) = 0

das kann man umschreiben:

x(a,b) = sin((a/N*r+b/n)*2*PI)*R(a)
y(a,b) = cos((a/N*r+b/n)*2*PI)*R(a)
z(a,b) = 0

eine Spirale
2 Spiralen, jeweils 180° versetzt
4 Spiralen, jeweils 90° versetzt
eine Spirale 2 Spiralen, jeweils 180° versetzt 4 Spiralen, jeweils 90° versetzt


4. Schritt:
Und nun wird's erst richtig interessant. Damit die Punkte nicht so sauber angeordnet sind, werden sie nun von ihrer definierten Stelle verschoben. Dies geschieht durch eine Zufallsfunktion random(). Sie liefert einen pseydozufälligen Wert zwischen 0 und 1. Der maximale Wert, um den sich der Punkt verschieben kann, ist ebenfalls variable. Ein Punkt in der Spitze einer Spirale darf sich nur wenig verschieben, Punkte im Zentrum umso mehr:
Parameter:
B - maximale Breite einer Spirale
H - maximale Höhe einer Spirale

Durch Unterscheidung in Höhe und Breite der Spirale kann diese abgeflacht werden:
dx_max(a,b) = (random()-0.5)*B
dy_max(a,b) = (random()-0.5)*B
dz_max(a,b) = (random()-0.5)*H

dx_max(a,b), dy_max(a,b), dz_max(a,b) sind nun die zufälligen Werte, um die sich x(a,b), y(a,b), z(a,b) ändern soll. Wie gesagt, soll der Einfluss hiervon in der Spitze geringer als im Zentrum sein, daher wird nun B und H von der Position in der Spirale abhängig (a):
Parameter:
dB - Grad der Zunahme der Breite
dH - Grad der Zunahme der Höhe

B(a) = B*(a/L)^dB
H(a) = H*(a/L)^dH

dx(a,b) = (random()-0.5)*B*(a/L)^dB
dy(a,b) = (random()-0.5)*B*(a/L)^dB
dz(a,b) = (random()-0.5)*H*(a/L)^dH


Nun nimmt die Verteilung unser Punkte um ihre definierte Position zum Zentrum hin zu, linear (dB=dH=1), kubisch (dB=dH=3) oder mehr. Gerade Potenzen eignen sich an dieser Stelle nicht ohne weiteres!

Verschiebung mit dem Grad 1
Verschiebung mit dem Grad 3
Verschiebung mit dem Grad 1 Verschiebung mit dem Grad 3
Verschiebung mit dem Grad 5
Verschiebung mit dem Grad 7
Verschiebung mit dem Grad 5 Verschiebung mit dem Grad 7


Als kleine Zwischenbilanz (oder eher zum Spaß) bietet es sich nun an, alle diese Formeln zusammen zu werfen:
x(a,b) = sin((a/N*r+b/n)*2*PI)*R*(1-a/L)^p+(random()-0.5)*B*(a/L)^dB
y(a,b) = cos((a/N*r+b/n)*2*PI)*R*(1-a/L)^p+(random()-0.5)*B*(a/L)^dB
z(a,b) = (random()-0.5)*H*(a/L)^dH

Welch ein Spaß! :-D

Aber damit ist die ganze Sache noch lange nicht ausgeschöpft. Erwähnen möchte ich nur noch folgende Möglichkeiten:
- die Random-Funktion, welche eine gleichmäßige Verteilung aller Zufallswerte bietet, durch eine nicht-lineare Zufallsfunktion ersetzen. Hierdurch wird es ermöglicht, dass sich auf einer Spirale die Punkte z.B. auf der Achse, oder gar auf einem Ring um der Spiralachse häufen.
- den Farbwert der Punkte abhängig vom Abstand zum Zentrum und / oder vom Abstand zur Spiralachse definieren. So heben sich die Achsen und das Zentrum hervor.
- die Funktion, mit der die Punkte entlang der Spiralachse gesetzt werden, nicht linear abhängig von der Punktnummer machen. So verdünnen sich die Spiralarme nochmals und das Zentrum verdichtet sich weiter.




(c) 2001-2006 Enrico Minack - WWWhttp://www.maniac-site.de/ - E-Mailmail@maniacme.de