Erfolgreiche Spieleentwicklung: Minecraft-Welten erschaffen Teil 2
()
Über dieses E-Book
Mehr von Alexander Rudolph lesen
Das Vulkan-API: Teil 1: Grundlagen und erste Schritte Bewertung: 0 von 5 Sternen0 BewertungenDas Vulkan-API: Teil 3: Umgang mit 3-D-Daten Bewertung: 0 von 5 Sternen0 BewertungenErfolgreiche Spieleentwicklung: OpenGL, OpenAL und KI Bewertung: 0 von 5 Sternen0 BewertungenErfolgreiche Spieleentwicklung: Moderne Licht- und Schattenspiele mit OpenGL Bewertung: 0 von 5 Sternen0 BewertungenErfolgreiche Spieleentwicklung: Minecraft-Welten erschaffen Bewertung: 0 von 5 Sternen0 BewertungenErfolgreiche Spieleentwicklung: OpenGL in Space Bewertung: 0 von 5 Sternen0 BewertungenDas Vulkan-API: Teil 2: Wie man ein Framework erstellt und Shader programmiert Bewertung: 0 von 5 Sternen0 BewertungenErfolgreiche Spieleentwicklung: Water-, Terrain- und GUI-Rendering mit OpenGL Bewertung: 0 von 5 Sternen0 BewertungenErfolgreiche Spieleentwicklung: OpenCL Bewertung: 0 von 5 Sternen0 Bewertungen
Ähnlich wie Erfolgreiche Spieleentwicklung
Titel in dieser Serie (100)
Einstieg in Google Go Bewertung: 0 von 5 Sternen0 BewertungenIT Wissensmanagement: Theorie und Praxis Bewertung: 0 von 5 Sternen0 BewertungenTFS 2012 Versionskontrolle: Grundlagen, Check-In Policies und Branch-Modelle Bewertung: 0 von 5 Sternen0 BewertungenAlgorithmen: Grundlagen und Implementierung Bewertung: 0 von 5 Sternen0 BewertungenServiceorientierte Architektur: Anforderungen, Konzeption und Praxiserfahrungen Bewertung: 0 von 5 Sternen0 BewertungenErfolgreiche Spieleentwicklung: OpenGL, OpenAL und KI Bewertung: 0 von 5 Sternen0 BewertungenSkalierbare Softwaresysteme: Design, Betrieb und Optimierungspotenziale Bewertung: 0 von 5 Sternen0 BewertungenÜberzeugende Präsentationen: Konzeption, Technik und Design Bewertung: 0 von 5 Sternen0 BewertungenBig Data: Executive Briefing Bewertung: 0 von 5 Sternen0 BewertungenQualitätssicherung mit JavaScript und PHP Bewertung: 0 von 5 Sternen0 BewertungenQualität in IT-Architekturen: Strategie und Planung Bewertung: 0 von 5 Sternen0 BewertungenBig Data: Technologiegrundlagen Bewertung: 0 von 5 Sternen0 BewertungenJava EE Security Bewertung: 0 von 5 Sternen0 BewertungenErfolgreiche Spieleentwicklung: OpenCL Bewertung: 0 von 5 Sternen0 BewertungenZend Framework 2: Für Einsteiger und Umsteiger Bewertung: 0 von 5 Sternen0 BewertungenUX Design für Tablet-Websites: Ein Überblick Bewertung: 0 von 5 Sternen0 BewertungenJavaScript für Eclipse-Entwickler: Orion, RAP und GWT Bewertung: 0 von 5 Sternen0 BewertungenNFC: Near Field Communication für Android-Entwickler Bewertung: 5 von 5 Sternen5/5JavaScript auf dem Server Bewertung: 0 von 5 Sternen0 BewertungenHTML5 Security Bewertung: 0 von 5 Sternen0 BewertungenHTML5 für Mobile Web Bewertung: 0 von 5 Sternen0 BewertungenAmazon Web Services für .NET Entwickler Bewertung: 0 von 5 Sternen0 BewertungenTFS 2012 Anforderungsmanagement: Work Items und Prozessvorlagen Bewertung: 0 von 5 Sternen0 BewertungenMobile Business: Was Entscheider morgen wissen müssen Bewertung: 0 von 5 Sternen0 BewertungenC++: Kurzportträt einer zeitlosen Sprache Bewertung: 0 von 5 Sternen0 BewertungenQualität in IT-Architekturen: Management Bewertung: 0 von 5 Sternen0 BewertungenApache Tapestry: Einstieg in die komponentenorientierte Webentwicklung Bewertung: 0 von 5 Sternen0 BewertungenGeolocation mit PHP: Foursquare-API, Google Places & Qype Bewertung: 0 von 5 Sternen0 BewertungenWebentwicklung mit dem Play Framework Bewertung: 0 von 5 Sternen0 BewertungenBPM: Strategien und Anwendungsfälle Bewertung: 0 von 5 Sternen0 Bewertungen
Ähnliche E-Books
Erfolgreiche Spieleentwicklung: OpenGL in Space Bewertung: 0 von 5 Sternen0 BewertungenErfolgreiche Spieleentwicklung: Water-, Terrain- und GUI-Rendering mit OpenGL Bewertung: 0 von 5 Sternen0 BewertungenDatenvisualisierung mit Processing Bewertung: 0 von 5 Sternen0 BewertungenDynamic Proxies: Effizient programmieren Bewertung: 0 von 5 Sternen0 BewertungenDas Vulkan-API: Teil 2: Wie man ein Framework erstellt und Shader programmiert Bewertung: 0 von 5 Sternen0 BewertungenDojos für Entwickler: 15 Aufgaben und Lösungen in .NET Bewertung: 0 von 5 Sternen0 BewertungenVerallgemeinerte Funktionen: Grundlagen und Anwendungsbeispiele Bewertung: 0 von 5 Sternen0 BewertungenRelativistische Effekte bei der Satellitennavigation: Von Einstein zu GPS und Galileo Bewertung: 0 von 5 Sternen0 BewertungenJava üben mit dem Plotter: Ein Überblick für Studierende und Einsteiger Bewertung: 0 von 5 Sternen0 BewertungenProgrammieren lernen mit A++: Funktional programmieren in Python und Java Bewertung: 0 von 5 Sternen0 BewertungenDie Eignung Neuronaler Netze für die Mining-Funktionen Clustern und Vorhersage Bewertung: 0 von 5 Sternen0 BewertungenA++ und systemnahe Programmiersprachen: Funktional programmieren in C/C++ Bewertung: 0 von 5 Sternen0 BewertungenLinux Befehlsreferenz: Schnelleinstieg in die Arbeit mit der Konsole, regulären Ausdrücken und Shellscripting Bewertung: 0 von 5 Sternen0 BewertungenLichtverschmutzung in Metropolen: Analyse, Auswirkungen und Lösungsansätze Bewertung: 0 von 5 Sternen0 BewertungenSprachenkompendium: Vala, Go und Rust Bewertung: 0 von 5 Sternen0 BewertungenSoftware Defined Radio-Systeme für die Telemetrie: Aufbau und Funktionsweise von der Antenne bis zum Bit-Ausgang Bewertung: 0 von 5 Sternen0 BewertungenEffiziente Datenanalyse in Netzwerkgraphen: Durch User Defined Functions in PostgreSQL Bewertung: 0 von 5 Sternen0 BewertungenEinführung in die Heimautomatisierung: IoT mit Tinkerforge Bewertung: 0 von 5 Sternen0 BewertungenWeb-3D-Welten systematisch erzeugen Bewertung: 0 von 5 Sternen0 Bewertungen3D-Druck/Rapid Prototyping: Eine Zukunftstechnologie - kompakt erklärt Bewertung: 0 von 5 Sternen0 BewertungenPyTorch für Deep Learning: Anwendungen für Bild-, Ton- und Textdaten entwickeln und deployen Bewertung: 0 von 5 Sternen0 BewertungenA++ Die kleinste Programmiersprache der Welt: Eine Programmiersprache zum Erlernen der Programmierung Bewertung: 0 von 5 Sternen0 BewertungenOpenLaszlo: schnell + kompakt Bewertung: 0 von 5 Sternen0 BewertungenErfolgreiche Spieleentwicklung: OpenCL Bewertung: 0 von 5 Sternen0 BewertungenBlockchain kurz & gut Bewertung: 0 von 5 Sternen0 BewertungenCO2: Abtrennung, Speicherung, Nutzung: Ganzheitliche Bewertung im Bereich von Energiewirtschaft und Industrie Bewertung: 0 von 5 Sternen0 BewertungenEinführung in die numerische Strömungsmechanik Bewertung: 1 von 5 Sternen1/5Programmieren in C: Programmieren lernen von Anfang an - Mit vielen Programmierbeispielen - Geeignet zum Selbststudium Bewertung: 0 von 5 Sternen0 BewertungenAufgaben zur Abiturvorbereitung in Mathematik: Mit kommentierten Lösungen Bewertung: 5 von 5 Sternen5/5Kryptographie mit Zopfgruppen: Eine Einführung Bewertung: 0 von 5 Sternen0 Bewertungen
Programmieren für Sie
Die ultimative FRITZ!Box Bibel - Das Praxisbuch 2. aktualisierte Auflage - mit vielen Insider Tipps und Tricks - komplett in Farbe Bewertung: 0 von 5 Sternen0 BewertungenPython programmieren lernen: Der spielerische Einstieg mit Minecraft Bewertung: 0 von 5 Sternen0 BewertungenDas Excel SOS-Handbuch: Wie sie Excel (2010-2019 & 365) schnell & einfach meistern. Die All-in-One Anleitung für ihren privaten & beruflichen Excel-Erfolg! Bewertung: 0 von 5 Sternen0 BewertungenRaspberry Pi: Einstieg • Optimierung • Projekte Bewertung: 5 von 5 Sternen5/5New Game Plus: Perspektiven der Game Studies. Genres - Künste - Diskurse (Bild und Bit. Studien zur digitalen Medienkultur) Bewertung: 0 von 5 Sternen0 BewertungenHTML5-Programmierung von Kopf bis Fuß: Webanwendungen mit HTML5 und JavaScript Bewertung: 0 von 5 Sternen0 BewertungenEigene Spiele programmieren – Python lernen: Der spielerische Weg zur Programmiersprache Bewertung: 0 von 5 Sternen0 BewertungenPython lernen – kurz & gut Bewertung: 0 von 5 Sternen0 BewertungenPython | Schritt für Schritt Programmieren lernen: Der ultimative Anfänger Guide für einen einfachen & schnellen Einstieg Bewertung: 0 von 5 Sternen0 BewertungenSQL – kurz & gut Bewertung: 0 von 5 Sternen0 BewertungenMicrocontroller für das IoT Bewertung: 0 von 5 Sternen0 BewertungenMikrocontroller in der Elektronik: Mikrocontroller programmieren und in der Praxis einsetzen Bewertung: 0 von 5 Sternen0 BewertungenPython-Grundlagen Bewertung: 0 von 5 Sternen0 BewertungenProgrammieren lernen mit Python 3: Schnelleinstieg für Beginner Bewertung: 0 von 5 Sternen0 BewertungenProgrammieren für Einsteiger: Teil 1 Bewertung: 0 von 5 Sternen0 BewertungenRaspberry Pi: Mach's einfach: Die kompakteste Gebrauchsanweisung mit 222 Anleitungen. Geeignet für Raspberry Pi 3 Modell B / B+ Bewertung: 0 von 5 Sternen0 BewertungenHacken mit Python und Kali-Linux: Entwicklung eigener Hackingtools mit Python unter Kali-Linux Bewertung: 0 von 5 Sternen0 BewertungenPython kurz & gut: Für Python 3.x und 2.7 Bewertung: 3 von 5 Sternen3/5Algorithmen: Grundlagen und Implementierung Bewertung: 0 von 5 Sternen0 BewertungenTraumjob IT 2021: Branchenüberblick, Erfahrungsberichte und Tipps zum Berufseinstieg Bewertung: 5 von 5 Sternen5/5Das große Python3 Workbook: Mit vielen Beispielen und Übungen - Programmieren leicht gemacht! Bewertung: 4 von 5 Sternen4/5.NET-Praxis: Tipps und Tricks zu .NET und Visual Studio Bewertung: 0 von 5 Sternen0 BewertungenAndroid-Programmierung kurz & gut Bewertung: 0 von 5 Sternen0 BewertungenEinstieg in TypeScript: Grundlagen für Entwickler Bewertung: 0 von 5 Sternen0 BewertungenVue.js für alle: Wissenswertes für Einsteiger und Experten Bewertung: 0 von 5 Sternen0 BewertungenSoftwareentwicklungsprozess: Von der ersten Idee bis zur Installation Bewertung: 0 von 5 Sternen0 BewertungenDas Franzis Starterpaket Arduino Uno: Das Handbuch für den Schnelleinstieg Bewertung: 0 von 5 Sternen0 BewertungenC++: Eine kompakte Einführung Bewertung: 0 von 5 Sternen0 BewertungenDocker: Webseiten mittels Containerarchitektur erstellen Bewertung: 3 von 5 Sternen3/5SQL von Kopf bis Fuß Bewertung: 4 von 5 Sternen4/5
Rezensionen für Erfolgreiche Spieleentwicklung
0 Bewertungen0 Rezensionen
Buchvorschau
Erfolgreiche Spieleentwicklung - Alexander Rudolph
GmbH
1 Spieleweltgestaltung in drei Dimensionen
Obwohl unsere zuletzt erzeugten Landschaften bereits recht ansprechend und abwechslungsreich wirkten, kamen bei ihrer Berechnung bislang lediglich zweidimensionale Noise-Funktionen zum Einsatz. Heute werden wir uns damit befassen, wie sich die zugrunde liegenden Konzepte um eine zusätzliche Dimension erweitern lassen – denn erst mithilfe von 3D-Noise-Funktionen und 3-D-Random-Walk-Simulationen wird es möglich, dreidimensionale Geländeformationen, Höhlensysteme oder unterirdische Rohstofflagerstätten zu generieren.
Continuous Development ist das Stichwort – dieses Kapitel steht voll und ganz im Zeichen der Weiterentwicklung der von uns bislang eingesetzten prozeduralen Gestaltungstechniken und Beleuchtungsmodelle. Im ersten shortcut „Erfolgreiche Spieleentwicklung. Minecraft-Welten erschaffen" sind wir darauf zu sprechen gekommen, wie sich unterschiedliche, vom Breitengrad abhängige Landschaftstypen und Vegetationsformen auf mathematischem Wege erzeugen lassen. Wir haben ein einfaches CPU-basiertes Verfahren besprochen, mit dessen Hilfe sich die Ausbreitung des indirekten Tageslichts halbwegs realistisch simulieren lässt. Auch haben wir uns mit den wichtigsten Einzelheiten einer von der Jahreszeit abhängigen Landschafts- und Vegetationsdarstellung auseinandergesetzt.
So weit, so gut. Bisher haben wir uns damit in unserem Spieleprototyp jedoch ausschließlich auf die Oberflächengestaltung und -darstellung beschränkt. Der Aufbau einer blockbasierten, von Minecraft inspirierten Welt lässt sich allerdings nicht mit den Spielewelten anderer Titel vergleichen, in denen eine Landschaft im Prinzip nichts weiter als eine in der xz-Ebene definierte Fläche ist, deren Höhenwerte man vorzugsweise unter Zuhilfenahme einer Height-Map von Ort zu Ort variiert. Sieht man einmal von der Tatsache ab, dass wir anstelle von Height-Maps auf 2D-Noise-Funktionen (2-D-Rauschen) zurückgegriffen haben, um das Höhenprofil unserer prozeduralen Landschaften zu verändern oder um die Spielewelt in unterschiedliche Regionen aufzuteilen, dann sind wir bisher auf eine ganz ähnliche Weise vorgegangen. Auch das von uns verwendete Beleuchtungsmodell ist noch extrem verbesserungswürdig, da wir bislang lediglich die Ausbreitung des indirekten Tageslichts simuliert haben. Eine zweite natürliche Lichtquelle, die uns im weiteren Verlauf noch häufiger begegnen wird, haben wir indes vollkommen außer Acht gelassen: Lava.
Aber keine Sorge, weder was die Beleuchtungsberechnungen, noch was die prozedurale Generierung der Spielewelt betrifft, müssen wir wieder von vorne beginnen. Betrachten Sie einfach die bislang erzeugten Landschaften als eine Art Zwischenergebnis, das es in weiteren Schritten mehr oder weniger umfangreich zu überarbeiten gilt. So lassen sich beispielsweise Höhlensysteme realisieren, in denen man das Felsgestein durch unterschiedlich große Hohlräume (Caves) und Verbindungsgänge (Cave Passageways) ersetzt. Für die Ausformung der Hohlräume bietet sich der Einsatz von dreidimensionalen Noise-Funktionen an. Die Verbindungsgänge können wir hingegen auf ähnliche Weise wie die Rohstofflagerstätten (hierauf deutet nicht zuletzt die alternative Bezeichnung Erzader hin) mithilfe von einfachen Random-Walk-Simulationen verwirklichen. Was die Erschaffung von zusätzlichen dreidimensionalen Geländeformationen betrifft, setzen wir selbstredend wiederum auf 3D-Noise-Berechnungen, auch wenn wir in diesem Zusammenhang zwei unterschiedliche Strategien verfolgen. Einerseits werden wir in ausgewählten Regionen die zuvor generierte 2D-Noise-Landschaft durch neue 3D-Noise-basierte Strukturen ersetzen.
Unabhängig davon orientieren wir uns bei der Modellierung von einer Reihe weiterer Terraindetails zudem an der Arbeitsweise eines Bildhauers. Hierfür überziehen wir unser 2D-Noise-Terrain mit einer zusätzlichen Schicht von Blöcken, aus der wir dann im zweiten Schritt die gewünschten Geländestrukturen ausformen (ausmeißeln) können. Und selbstverständlich werden wir in diesem Zusammenhang auch auf die Probleme und mögliche Lösungen eingehen, die mit dem Einsatz von 3D-Noise-Funktionen bei der Oberflächengestaltung zwangsläufig einhergehen: schwebende Blöcke und Inseln, die allenfalls in den aus dem Science-Fiction-Film Avatar bekannten Dschungellandschaften Pandoras ihre Daseinsberechtigung haben.
3D-Noise-Funktionen
1-D-, 2-D-, 3-D- oder gar 4-D-Rauschen – auf den ersten Blick klingt das alles überaus mathematisch und anfangs sogar ein wenig verwirrend, obwohl wir bereits einige Erfahrungen auf diesem Gebiet gesammelt haben. Die Einsatzmöglichkeiten von 2D-Noise-Funktionen im Rahmen der prozeduralen Landschaftsgestaltung beherrschen wir mittlerweile im Schlaf und wissen, wie sich in Gestalt von Value, Gradient oder Cell Noise drei ganz unterschiedliche Arten von Rauschwerten berechnen lassen. Worin unterscheiden sich jetzt aber zweidimensionale von dreidimensionalen oder gar vierdimensionalen Rauschwerten? Bevor wir an dieser Stelle allzu sehr ins Detail gehen, sollten wir zunächst einmal festhalten, dass es sich in allen Fällen um positions- bzw. zeitabhängige Zufallszahlen handelt. Eine 1D-Noise-Funktion, der wir die Systemzeit oder die momentane Spieldauer als Parameter übergeben, wäre beispielsweise nichts anderes als ein zeitabhängiger Zufallszahlengenerator. Mit den uns bereits vertrauten 2D-Noise-Funktionen können wir hingegen für jeden Punkt einer zunächst flachen Landschaft (in unserem Demoprogramm liegt diese in der xz-Ebene) einen Höhenwert (Rauschwert) ermitteln. Übergibt man einer 3D-Noise-Funktion als Parameter eine dreidimensionale Positionsangabe, so lässt sich der zugehörige Rauschwert als Dichte interpretieren: Ist die Dichte in einer blockbasierten Spielewelt an einem Ort zu klein, wird ein eventuell vorhandener Block entfernt; ist die Dichte hingegen groß genug, wird stattdessen ein neuer Block hinzugefügt. Würde man jedoch stattdessen eine zweidimensionale Positionsangabe mit einer zusätzlichen Zeitangabe kombinieren, könnte man mithilfe einer 3D-Noise-Funktion beispielsweise eine zweidimensionale Wasserfläche animieren. Dreidimensionale Noise-basierte Strukturen wie Wolken oder Rausch lassen sich im Unterschied dazu mit einer 4D-Noise-Funktion zum Leben erwecken. Die Berechnung der zugehörigen Rauschwerte erfordert in diesem Fall – Sie ahnen es bereits – sowohl eine dreidimensionale Orts- wie auch eine zusätzliche Zeitangabe.
Die Berechnung der denkbar einfachsten Form des (dreidimensionalen) Rauschens – so genanntes „weißes Rauschen" ohne eine besondere Struktur – lässt sich anhand der Listings 1.1 und 1.2 am Beispiel der Funktionen RandomValue0To1() sowie GetNewDirection() nachvollziehen. Nun ja, genau genommen ist das Wort „Berechnung" ein wenig zu hoch gegriffen, da uns die besagten Funktionen in Abhängigkeit von der Blockposition lediglich eine bereits im Vorfeld berechnete Zufallszahl bzw. einen 3-D-Gradientenvektor (Richtungsvektor) zurückliefern. Wie Sie sehen können, verzichten wir aus Performancegründen darauf, die für die Noise-Berechnungen erforderlichen Zufallswerte zur Laufzeit zu erzeugen. Zufallszahlen und Gradientenvektoren (Listing 1.3) berechnen wir stattdessen bereits im Verlauf der Initialisierungsphase und speichern sie dann in zweidimensionalen (2D-Noise-) bzw. dreidimensionalen (3D-Noise-)Arrays ab. Um Zugriff auf die in den Arrays gespeicherten Daten zu erhalten, müssen wir zunächst die als Parameter übergebenen Positionswerte (ix, iy, iz) mithilfe einfacher Modulo-Operationen (hierbei wird der Rest einer Ganzzahldivision ermittelt, beispielsweise -31 % 11 = -9) in die korrespondierenden Array-Indizes (id_x, id_y, id_z) umrechnen.
inline float RandomValue0To1(long ix, long iy, long iz)
{
long id_x = ix % HALF_SURFACE_VALUES_PER_DIR_PLUS1 +
HALF_SURFACE_VALUES_PER_DIR_MINUS1;
long id_y = iy % HALF_SURFACE_VALUES_PER_DIR_PLUS1 +
HALF_SURFACE_VALUES_PER_DIR_MINUS1;
long id_z = iz % HALF_SURFACE_VALUES_PER_DIR_PLUS1 +
HALF_SURFACE_VALUES_PER_DIR_MINUS1;
return SurfaceDataPattern3D[id_x][id_y][id_z];
}
Listing 1.1: Weißes 3-D-Rauschen
inline void GetNewDirection(long ix, long iy, long iz, float* pDirX, float* pDirY, float* pDirZ)
{
long id_x = ix % HALF_SURFACE_VALUES_PER_DIR_PLUS1 +
HALF_SURFACE_VALUES_PER_DIR_MINUS1;
long id_y = iy % HALF_SURFACE_VALUES_PER_DIR_PLUS1 +
HALF_SURFACE_VALUES_PER_DIR_MINUS1;
long id_z = iz % HALF_SURFACE_VALUES_PER_DIR_PLUS1 +
HALF_SURFACE_VALUES_PER_DIR_MINUS1;
*pDirX = SurfaceDataPattern3D_gx[id_x][id_y][id_z];
*pDirY = SurfaceDataPattern3D_gy[id_x][id_y][id_z];
*pDirZ = SurfaceDataPattern3D_gz[id_x][id_y][id_z];
}
Listing 1.2: Richtungsbestimmung bei einer Random-Walk-Simulation
#define SURFACE_VALUES_PER_DIR 21
#define HALF_SURFACE_VALUES_PER_DIR_PLUS1 11 // (21 + 1) / 2
#define HALF_SURFACE_VALUES_PER_DIR_MINUS1 10 // (21 - 1) / 2
// for 3D Gradient Noise Calculations:
float SurfaceDataPattern3D_gx[SURFACE_VALUES_PER_DIR]
[SURFACE_VALUES_PER_DIR]
[SURFACE_VALUES_PER_DIR];
float SurfaceDataPattern3D_gy[SURFACE_VALUES_PER_DIR]
[SURFACE_VALUES_PER_DIR]
[SURFACE_VALUES_PER_DIR];
float SurfaceDataPattern3D_gz[SURFACE_VALUES_PER_DIR]
[SURFACE_VALUES_PER_DIR]
[SURFACE_VALUES_PER_DIR];
[...]
for(ix = 0; ix < SURFACE_VALUES_PER_DIR; ix++)
{
for(iy = 0; iy < SURFACE_VALUES_PER_DIR; iy++)
{
for(iz = 0; iz < SURFACE_VALUES_PER_DIR; iz++)
{
f1 = RandomNumbersTerrain2.Next_FloatNumber(-1.0f, 1.0f);
f2 = RandomNumbersTerrain2.Next_FloatNumber(-1.0f, 1.0f);
f3 = RandomNumbersTerrain2.Next_FloatNumber(-1.0f, 1.0f);
// mögliche Division durch null verhindern (beim späteren Normieren):
if(f1 == 0.0f && f2 == 0.0f && f3 == 0.0f)
{
if(RandomNumbersTerrain2.Next_IntegerNumber(1, 3) == 1)
f1 = RandomNumbersTerrain2.Next_FloatNumber(0.1f, 1.0f);
else
f1 = RandomNumbersTerrain2.Next_FloatNumber(-1.0f, -0.1f);
if(RandomNumbersTerrain2.Next_IntegerNumber(1, 3) == 1)
f2 = RandomNumbersTerrain2.Next_FloatNumber(0.1f, 1.0f);
else
f2 = RandomNumbersTerrain2.Next_FloatNumber(-1.0f, -0.1f);
if(RandomNumbersTerrain2.Next_IntegerNumber(1, 3) == 1)
f3 = RandomNumbersTerrain2.Next_FloatNumber(0.1f, 1.0f);
else
f3 = RandomNumbersTerrain2.Next_FloatNumber(-1.0f, -0.1f);
}
// Normieren:
invLength = 1.0f/sqrtf(f1*f1 + f2*f2 + f3*f3);
SurfaceDataPattern3D_gx[ix][iy][iz] = invLength*f1;
SurfaceDataPattern3D_gy[ix][iy][iz] = invLength*f2;
SurfaceDataPattern3D_gz[ix][iy][iz] = invLength*f3;
}}}
Listing 1.3: Berechnung der 3-D-Gradientenvektoren (Initialisierungsphase)
Bevor wir gleich auf die Grundlagen der dreidimensionalen Rauschwerterzeugung zu sprechen kommen, verschaffen wir uns zunächst einmal eine Übersicht über die einzelnen 3D-Noise-Funktionen, die wir im Rahmen der prozeduralen Generierung unserer Spielewelt ergänzend zu den bereits ausführlich diskutierten 2D-Noise-Funktionen einsetzen werden:
3D Value Noise ohne Interpolation der Rauschwerte:
inline void ValueNoise3D_NoInterpolation(long* pResult,
float &x, float &y, float &z,
float &frequencyX, float &frequencyY, float &frequencyZ,
long &minNoiseValue, long &maxNoiseValueDiff)
{...} /* siehe Listing 1.4*/
3D Value Noise mit linearer Interpolation der Rauschwerte:
inline void ValueNoise3D_LinearInterpolation(...){...}
3D Value Noise mit kosinusförmiger Interpolation der Rauschwerte:
inline void ValueNoise3D_CosineInterpolation(...){...}
3D Gradient Noise mit linearer Interpolation der Rauschwerte:
inline void GradientNoise3D_LinearInterpolation(...){...}
3D Gradient Noise mit kosinusförmiger Interpolation der Rauschwerte:
inline void GradientNoise3D_CosineInterpolation(...)
{...} /* siehe Listing 1.5*/
Können Sie sich noch daran erinnern, wie sich anstelle von „weißem Rauschen" ein Rauschsignal mit einer eindeutig definierten Frequenz erzeugen lässt? Die Lösung des Problems erwies sich als überaus einfach, denn unabhängig von der Art des Rauschens (Value Noise, Gradient Noise, Cell Noise) mussten wir unsere Landschaft lediglich mithilfe zweier simpler Codezeilen in eine Vielzahl von gleichgroßen quadratischen