Gesunde Natur für 3D-Director-Entwickler
Während draußen die Bäume wieder erste Blätter bekommen und die Vogelgrippe
aus Afrika zurückkehrt, sitzt manch ein Director-Entwickler im dunklen Kämmerchen und bastelt an einem ebensolchen Ballerspiel. Dabei wirkt sich saftiges Grün und strahlender
Himmel nicht nur auf die Entwickler-Psyche aus, sondern kann auch einen Ego-Shooter, ein Autorennen oder eine Architektur-Visualisierung auf natürliche Weise aufpeppen.
Das kleine Director-Tutorial zeigt, wie sich in einen leeren 3D-Darsteller eine komplette Landschaft mitsamt Himmel und Bäumen zaubern lässt. Natürlich lassen sich einzelne
Teile für eigene Zwecke verwenden. Ich will gleich hier anmerken, dass diese Art von Bäumen eigentlich nicht geeignet ist, einen Wald damit darzustellen; das kann man resourcen-schonender
machen, aber hier mache ich mal eine Ausnahme - weil's so schön ist!
StartMovie /StopMovie:
Wie üblich: Parameter setzen und wieder aufräumen. Die Kamera und das Licht werden gruppiert, dadurch können beide gemeinsam leicht um die 3D-Szene bewegt werden.
createShaders
Erzeugt die Shader für die Landschaft und den Himmel. Der Himmel ist eine flachgedrückte Kugel, die von innen sichtbar ist.
makeTerrain
Das habe ich mir natürlich nicht selbst ausgedacht, immerhin habe ich es so halbwegs verstanden: Es wird eine Mesh-Resource erzeugt, in diese werden die Grauwerte aus dem Bild "Hoehenkarte"
geschrieben. Die Karte hat 65x65 Pixel, also wird eine Landschaft mit 64x64 Flächen erzeugt. Das -1 kommt daher, dass die Landschaft vom Rand bis zum Rand reicht; sprich es gibt N-1 Abstände
bei N Punkten.
BaeumeSetzen
Dieser Handler simuliert (so halbwegs ;-) die natürliche Fortpflanzung von Bäumen:
Die Liste BaumParams enthält die verschiedenen Parameter.
AnzahlStammbaeume gibt vor, wie viele "Urbäume" erzeugt werden, sie werden zufällig im Kreis aufgestellt. Danach pflanzt sich jeder Baum jedes Jahr 1x fort; solange
bis maxBaeumeMachen erreicht ist.
Das Ergebnis wären jetzt mehr oder weniger verteilte Bäume. Deswegen gibt es einen weiteren Einfluss: Bäume stehen selten allein oder mitten auf der Wiese. In einem weiteren
Schritt werden daher einzeln stehende Bäume wieder entfernt.
In der Praxis wird man die Position der Bäume nicht dem Zufall überlassen, sondern eine vor-definierte Liste verwenden. Entweder setzt man die Positionen manuell oder man
kopiert bei Gefallen die Liste BaumposListe in ein Script.
Tatsächlich erzeugt werden die Bäume erst im Handler:
InitBaeume
Ein Baum wird jeweils aus N Planes erzeugt, die reihum aufgestellt werden. Gut sind 5 Planes; für Bäume, die aus größerer Entfernung gesehen werden, reichen auch 2
oder 3, alles über 6 ist Verschwendung. Bei 2 Planes muss man die Bäume natürlich in Kamerarichtung drehen.
Die Planes dürfen sich nicht überkreuzen, weil es dadurch zu unschönen Vorne/Hinten-Verwechslungen kommt. Auf diese Planes werden jeweils die Texturen von halben Bäumen
geklebt.
Zu Beginn des Scriptes wird überprüft, wieviele Halb-Bilder es zu jedem Baum gibt; 2 sollten es mindestens sein, aber es reicht normalerweise, nur den Alpha-Kanal zu verändern.
Die Texturen werden im Rendermode #rgba8888 dargestellt, was der Graphikkarte einiges abverlangt. #rgba5551 reicht auch und wird etwas schneller gerendert, sieht aber etwas gröber aus.
Wichtig ist auch, textureRepeatList[1] auf 0 zu setzen, sonst kommt es zu Blitzern an den Kanten der Planes.
Aus Geschwindigkeitsgründen wird nicht jeder Baum einzeln erzeugt, sondern zunächst nur einige Mustergruppen, die in der Folge gecloned und mit modelsUnderRay auf die Landschaft
gesetzt werden.
Was man besser/anders machen könnte:
Texturen einsparen: Da sich die Bäume (hier) nur in Farbe und Alpha-Kanal unterscheiden, könnte man mit Image-Lingo weit mehr Texturen zur Laufzeit erstellen, indem man 1-Bit und
24-Bit Bilder mischt.
Die hier erzeugten Bäume bestechen nicht immer durch Formschönheit, es gäbe noch Verbesserungspotential.
|