2D-Objekte in der 3D-Welt

Slides:



Advertisements
Ähnliche Präsentationen
1. 2 Heute entwickeln wir eine kleine DirectInput-Bibliothek,auf die wir bei unseren zukünftigen Projekten immer wieder zurückgreifen werden. Die Themen.
Advertisements

LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
Trigonometrische Funktionen
Datenstrukturen Look-Up Tabellen, Zufallszahlen, Listen, Speichermanagement und Dateiverwaltung.
Kollisionen beschreiben Tag 6
Kollisionen erkennen Kollisions- und Schnittpunkttests auf Dreieckbasis Kollisions- und Schnittpunkttests auf Viereckbasis Einsatz von achsenausgerichteten.
Simulation physikalischer Einflüsse
Dreidimensionale Spielewelten
Geometrie in DirectX: Vektoroperationen Kapitel – Spieleprogrammierung mit DirectX und C++ Kaiser/Lensing.
Grundlagen der Geometrie
Christos, Kornelia, Jan Christos, Kornelia, Jan Entwicklungsumgebung Versteht unseren Java Programm Code Versteht unseren Java Programm.
Java: Objektorientierte Programmierung
Sortierverfahren Richard Göbel.
Java: Dynamische Datentypen
Einführung in die Programmierung von 3D-Grafiken Basis ist Java3D
Indirekte Adressierung
FH-Hof Indirekte Adressierung Richard Göbel. FH-Hof Einfache Speicherung von Daten Eine "einfache" Deklaration definiert direkt eine Speicherplatz für.
Konstruktoren.
Polymorphie (Vielgestaltigkeit)
Polymorphie (Vielgestaltigkeit)
Objekte und Arbeitsspeicher
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
V10 - Kollisionen Nicolas Matentzoglu. Inhalt der Präsentation Kollisionserkennung bei Hindernissen Verhalten der Kugel über verschiedenen Untergründen.
Die Geometrie der Ebene
Softwaretechnologie II (Teil 1): Simulation und 3D Programmierung
Nils Jagdfeld, Patrick Gunia
Positionierung und Ausrichtung der Kamera. void balance::kamera_bewegen( float seit, float hoch, float vor) { D3DXVECTOR3 v, s, h, t; v = da_gucke_ich_hin.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Java-Kurs Grafik Julian Drerup.
Java-Kurs - 7. Übung Besprechung der Hausaufgabe Referenzvariablen
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
Zusammenfassung Vorwoche
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste.
DVG Kommentare1 Kommentare. DVG Kommentare 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht.
DVG Klassen und Objekte
DVG Kommentare 1 Kommentare. 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht bis zum Ende der Zeile.
Special Effects Realistischeres Rendern einer Scene.
Wir müssen also überlegen: Implementierung der Knoten, Implementierung der Kanten, daraus: Implementierung des Graphen insgesamt. Annahme: die Knoteninhalte.
Struktur-Funktions-Modelle von Pflanzen - Sommersemester Winfried Kurth Universität Göttingen, Lehrstuhl Computergrafik und Ökologische Informatik.
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Java programmieren mit JavaKara
Universität zu Köln Institut für Historisch-Kulturwissenschaftliche Informationsverarbeitung Prof. Dr. Manfred Thaller AM 3 Übung: Softwaretechnologie.
C# Einheitliches Typsystem
3D- Spieleprogrammierung
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Von der Planung bis zum Hauptmenü Seminar: Softwaretechnologie II Dozent: Prof. Manfred Thaller Referent: Jan Bigalke.
11. Tabellen 11.1 Grundlegende Tabellenbearbeitung
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Skalare, Vektoren.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmiersprache C 4
Vom Umgang mit Daten. public void myProgram() { int[] saeulenWerte = new int[world.getSizeX()]; for (int i = 0; i < saeulenWerte.length; i++) { saeulenWerte[i]
Unity 4.x Cookbook Softwaretechnologie II (Teil 2) - Maximilian Berndt.
Paul, Morten, Yannick Blue J. Entwicklungsumgebung  versteht Java Programmcode  Für die Entwicklung eigener Software  Durch die Programmierung.
Polymorphie (Vielgestaltigkeit). Wenn eine Methode, wie z.B. print für verschiedene Programmteile steht (und z.B. einmal Objekte verschiedener Klassen.
Erfahrungen mit Microsoft DirectX 8 W. Krug, April 2002.
Einführung Blue J. Inhaltsverzeichnis  Definition  Vokabeln.
Breakanoid – Bälle & Blöcke Universität zu Köln Historisch Kulturwissenschaftliche Informationsverarbeitung WS 12/13 Übung: Visuelle Programmierung I –
A Workshop About this chapter General description Units Time Schedule
Grundlagen der Geometrie
Dreidimensionale Spielewelten
Diskrete Mathe Diskrete Mathematik I Listen Vorlesung 4.
Java Programme nur ein bisschen objektorientiert.
JAVA lernen: Methoden.
Implementieren von Klassen
 Präsentation transkript:

2D-Objekte in der 3D-Welt Softwaretechnologie II - M. Thaller Wintersemester 2005 / 2006 Referentin: Tanja Lange Assistenz: Niklas Köhn

Worum geht´s heute? Zweidimensionale Objekte = Billboards (z. B. Rauch, Nebel, Wolken, Explosionen,…), die entsprechend der Blickrichtung in der dreidimensionalen Welt ausgerichtet werden Transformationsfunktionen für derartige Billboardeffekte entwickeln

Kameradrehung im 3D-Raum (Blickrichtung des Spielers) 3 Inline-Funktionen  in Space3D.cpp // ----------------------------------------------------------- // Kameradrehung um die Blickrichtungsachse inline void Player_Flugdrehung(float winkel) // Frame-Drehwinkel in Grad, um den sich Blickrichtung ändern soll, // als Parameter übergeben { winkel = winkel*D3DX_PI/180.0f; // Umrechnung ins Bogenmaß FlugdrehungsWinkel += winkel; // Bei Flugdrehung wird Frame-Drehwinkel zum Flugdrehungswinkel hinzuaddiert if( FlugdrehungsWinkel > D3DX_PI ) FlugdrehungsWinkel -= 6.283185308f; else if( FlugdrehungsWinkel < -D3DX_PI ) FlugdrehungsWinkel += 6.283185308f; CalcRotAxisMatrixS(&tempMatrix1, &PlayerFlugrichtung, winkel); // Berechnung Frame-Rotationsmatrix g_ObjectKorrekturMatrix = g_ObjectKorrekturMatrix*tempMatrix1; // damit wird Gesamtrotationsmatrix berechnet, // für Billboard-Transformationsfunktionen, // Ausrichtung 2D-Objekten MultiplyVectorWithRotationMatrix(&PlayerHorizontale, &PlayerHorizontale, &tempMatrix1); // neue horizontale + MultiplyVectorWithRotationMatrix(&PlayerVertikale, &PlayerVertikale, &tempMatrix1); // vertikale Drehachse // bestimmen NormalizeVector_If_Necessary(&PlayerHorizontale, &PlayerHorizontale); NormalizeVector_If_Necessary(&PlayerVertikale, &PlayerVertikale); D3DXMatrixLookAtLH(&matView, &NullVektor, &PlayerFlugrichtung, &PlayerVertikale); g_pd3dDevice->SetTransform(D3DTS_VIEW, &matView); // Sichttransformation durchführen } Kameradrehung im 3D-Raum

Horizontale und vertikale Kameradrehung // -------------------------------------- // Horizontale Kameradrehung inline void Player_Horizontaldrehung(float winkel) // Frame-Drehwinkel in Grad, um den sich Blickrichtung ändern // soll, als Parameter übergeben { winkel = winkel*D3DX_PI/180.0f; // Umrechnung ins Bogenmaß // neue Flugrichtung aus Gesamtrotationsmatrix bestimmen CalcRotYMatrixS( &tempMatrix1,winkel ); g_ObjectKorrekturMatrix = tempMatrix1*g_ObjectKorrekturMatrix; PlayerFlugrichtung.x = g_ObjectKorrekturMatrix._31; PlayerFlugrichtung.y = g_ObjectKorrekturMatrix._32; PlayerFlugrichtung.z = g_ObjectKorrekturMatrix._33; D3DXVec3Cross(&PlayerHorizontale, &PlayerVertikale, &PlayerFlugrichtung); // Berechnung neue horizontale // bzw. vertikale Drehachse NormalizeVector_If_Necessary(&PlayerHorizontale, &PlayerHorizontale); // neue Sichtmatrix matView (Kameramatrix) erstellen und zugehörige View-Transformation durchführen D3DXMatrixLookAtLH(&matView, &NullVektor, &PlayerFlugrichtung, &PlayerVertikale); g_pd3dDevice->SetTransform(D3DTS_VIEW, &matView); } // ----------------------------------- // Vertikale Kameradrehung inline void Player_Vertikaldrehung(float winkel) { … Kameradrehung im 3D-Raum

Billboard-Transformationsfunktionen in Datei BillboardFunctions.h sind zuständig für: Darstellung von Hintergrundobjekten (Sonne, Wolken, Hintergrundnebel und ­galaxien) im 3D­Raum durch Angabe ihrer Polarkoordinaten Darstellung von Explosionen, Partikeln, Lens Flares, elektrostatischen Nebelentladungen (Nebula­Flash) und Text im 3D­Raum durch Angabe des Ortsvektors Darstellung von 2D­Objekten durch Angabe des Ortsvektors sowie der Rotationsmatrix Planar­perspektivische Darstellung von Billboards durch Angabe des Ortsvektors  Hinweis: 3D-Raum – Kamera kann um drei orthogonale Achsen gedreht und beliebig im Raum verschoben werden planar­perspektivischen Raum - Kamera kann nach rechts/links bzw. oben/unten bewegt sowie an das Spielgeschehen heran­ bzw. vom Spielgeschehen weggezoomt werden. Billboard-Transformationsfunktionen

Funktion zum Ausrichten eines Billboards im 3D-Raum unter Verwendung des Billboard-Ortsvektors normale Darstellung: inline void Positioniere_2D_Object(D3DXVECTOR3* pAbstand, float &scale) { // Hinweis: Die Verwendung von Zeigern und Referenzen als Parameter hat den Vorteil, // dass die Erzeugung von lokalen Kopien unterbleibt --> bessere Performance!! // aus Ortsvektor und Skalierungsfaktor wird Verschiebungs- und Skalierungsmatrix erzeugt g_VerschiebungsMatrix._41 = pAbstand->x; g_VerschiebungsMatrix._42 = pAbstand->y; g_VerschiebungsMatrix._43 = pAbstand->z; g_ScaleMatrix._11 = scale; g_ScaleMatrix._22 = scale; g_TransformationsMatrix = g_ScaleMatrix // beide Matrizen werden mit *g_ObjectKorrekturMatrix // Objektkorrekturmatrix multipliziert *g_VerschiebungsMatrix; g_pd3dDevice->SetTransform(D3DTS_WORLD, &g_TransformationsMatrix); // Welttransformation mit // Produktmatrix durchführen } Billboard-Transformationsfunktionen

Funktion zum Ausrichten eines Billboards im 3D-Raum unter Verwendung des Billboard-Ortsvektors sowie eines Drehwinkels dreht das Billboard zusätzlich um einen vorgegebenen Winkel senkrecht zur Blickrichtung: inline void Positioniere_2D_Object_gedreht(D3DXVECTOR3* pAbstand, float &scale, float &winkel) { // Korrektur des Drehwinkels um FlugdrehungsWinkel um evtl. Flugdrehung bei Ausrichtung zu berücksichtigen korrigierter_Billboardwinkel = winkel-FlugdrehungsWinkel; if( korrigierter_Billboardwinkel > D3DX_PI ) korrigierter_Billboardwinkel -= 6.283185308f; else if( korrigierter_Billboardwinkel < -D3DX_PI ) korrigierter_Billboardwinkel += 6.283185308f; CalcRotAxisMatrix(&g_VerschiebungsMatrix2, // erzeugen einer Rotationsmatrix &PlayerFlugrichtung, // Rotationsachse = Blickrichtung des Spielers korrigierter_Billboardwinkel); g_VerschiebungsMatrix2._41 = pAbstand->x; // den Matrixelementen der Rotationsmatrix werden die g_VerschiebungsMatrix2._42 = pAbstand->y; // Ortskoordinaten des Billboards in x-, y- und z-Richtung g_VerschiebungsMatrix2._43 = pAbstand->z; // zugewiesen g_ScaleMatrix._11 = scale; g_ScaleMatrix._22 = scale; g_TransformationsMatrix = g_ScaleMatrix *g_ObjectKorrekturMatrix *g_VerschiebungsMatrix2; g_pd3dDevice->SetTransform(D3DTS_WORLD, &g_TransformationsMatrix); } Billboard-Transformationsfunktionen

Funktion zum Ausrichten eines Billboards im 3D-Raum unter Verwendung des Billboard-Ortsvektors und zufälligen Drehwinkel dreht das Billboard um einen zufälligen Winkel senkrecht zur Blickrichtung: inline void Positioniere_2D_Object_fluktuierend(D3DXVECTOR3* pAbstand, float &scale) { CalcRotAxisMatrix(&g_VerschiebungsMatrix2, &PlayerFlugrichtung, Zufallswinkel->NeueZufallsZahl()); g_VerschiebungsMatrix2._41 = pAbstand->x; g_VerschiebungsMatrix2._42 = pAbstand->y; g_VerschiebungsMatrix2._43 = pAbstand->z; g_ScaleMatrix._11 = scale; g_ScaleMatrix._22 = scale; g_TransformationsMatrix = g_ScaleMatrix *g_ObjectKorrekturMatrix *g_VerschiebungsMatrix2; g_pd3dDevice->SetTransform(D3DTS_WORLD, &g_TransformationsMatrix); } Billboard-Transformationsfunktionen

dreht das Billboard beliebig (nicht nur senkrecht zur Blickrichtung): Funktion zum Ausrichten eines Billboards im 3D-Raum unter Verwendung des Billboard-Ortsvektors + einer Rotationsmatrix dreht das Billboard beliebig (nicht nur senkrecht zur Blickrichtung): inline void Positioniere_2D_Object(D3DXVECTOR3* pAbstand, D3DXMATRIX* pRotationsmatrix, float &scale) // zusätzlich Adresse einer entsprechenden Rotationsmatrix übergeben { g_VerschiebungsMatrix2 = *pRotationsmatrix; g_VerschiebungsMatrix2._41 = pAbstand->x; g_VerschiebungsMatrix2._42 = pAbstand->y; g_VerschiebungsMatrix2._43 = pAbstand->z; g_ScaleMatrix._11 = scale; g_ScaleMatrix._22 = scale; g_TransformationsMatrix = g_ScaleMatrix *g_VerschiebungsMatrix2; g_pd3dDevice->SetTransform(D3DTS_WORLD, &g_TransformationsMatrix); } Billboard-Transformationsfunktionen

zur korrekten Positionierung sind zwei Drehungen notwendig: Funktion zum Ausrichten eines Billboards im 3D-Raum unter Verwendung der Billboard-Polarkoordinaten zur korrekten Positionierung sind zwei Drehungen notwendig: inline void Positioniere_2D_Object(D3DXVECTOR3* pAbstand, float &winkelHorizontal, float &winkelVertikal, float &scale) { CalcRotYMatrix(&tempMatrix1, winkelHorizontal); // Rotationsmatrix für die Drehung um die y­ Achse // (horizontale Drehung) wird erzeugt MultiplyVectorWithRotationMatrix(&temp1Vektor3, // mit Hilfe dieser Matrix wird die &PlayerHorizontaleOriginalNeg, // horizontale Drehachse für die &tempMatrix1); // vertikale Drehung berechnet CalcRotAxisMatrix(&tempMatrix2, &temp1Vektor3, winkelVertikal); // mit Hilfe der horizontale Drehachse // wird R.-Matrix für vert. Drehung berechnet g_VerschiebungsMatrix2 = tempMatrix1*tempMatrix2; // aus den beiden Rotationsmatrizen wird die // Gesamtrotationsmatrix gebildet g_VerschiebungsMatrix2._41 = pAbstand->x; g_VerschiebungsMatrix2._42 = pAbstand->y; g_VerschiebungsMatrix2._43 = pAbstand->z; g_ScaleMatrix._11 = scale; g_ScaleMatrix._22 = scale; g_TransformationsMatrix = g_ScaleMatrix*g_VerschiebungsMatrix2; g_pd3dDevice->SetTransform(D3DTS_WORLD, &g_TransformationsMatrix); } Billboard-Transformationsfunktionen

Funktion zum Ausrichten eines Billboards im 3D-Raum unter Verwendung der Billboard-Polarkoordinaten + eines Drehwinkels dreht das Billboard zusätzlich um einen vorgegebenen Winkel senkrecht zum Ortsvektor: inline void Positioniere_2D_Object_gedreht(D3DXVECTOR3* pAbstand, float &winkelHorizontal, float &winkelVertikal, float &scale, float &blickwinkel) { CalcRotAxisMatrix(&tempMatrix, pAbstand, blickwinkel); // es wird eine weitere Rotationsmatrix benötigt CalcRotYMatrix(&tempMatrix1, winkelHorizontal); MultiplyVectorWithRotationMatrix(&temp1Vektor3, &PlayerHorizontaleOriginalNeg, &tempMatrix1); CalcRotAxisMatrix(&tempMatrix2, &temp1Vektor3, winkelVertikal); g_VerschiebungsMatrix2 = tempMatrix1*tempMatrix2*tempMatrix ; g_VerschiebungsMatrix2._41 = pAbstand->x; g_VerschiebungsMatrix2._42 = pAbstand->y; g_VerschiebungsMatrix2._43 = pAbstand->z; g_ScaleMatrix._11 = scale; g_ScaleMatrix._22 = scale; g_TransformationsMatrix = g_ScaleMatrix*g_VerschiebungsMatrix2; g_pd3dDevice->SetTransform(D3DTS_WORLD, &g_TransformationsMatrix); } Billboard-Transformationsfunktionen

Funktion z. Ausrichten d Funktion z. Ausrichten d. Billboards im planar-perspektivischen Raum unter Verwendg. des Billboard-Ortsvektors normale Darstellung : inline void Positioniere_2D_Object_Verschoben(D3DXVECTOR3* pAbstand, float &scale) { g_VerschiebungsMatrix._41 = pAbstand->x+g_VerschiebungsMatrix3._41*pAbstand->z; g_VerschiebungsMatrix._42 = pAbstand->y+g_VerschiebungsMatrix3._42*pAbstand->z; g_VerschiebungsMatrix._43 = pAbstand->z; g_ScaleMatrix._11 = scale; g_ScaleMatrix._22 = scale; g_TransformationsMatrix = g_ScaleMatrix*g_ObjectKorrekturMatrix*g_VerschiebungsMatrix; g_pd3dDevice->SetTransform(D3DTS_WORLD, &g_TransformationsMatrix); } Billboard-Transformationsfunktionen

Funktion z. Ausrichten d Funktion z. Ausrichten d. Billboards im planar-perspektivischen Raum unter Verwendg. d. B.-Ortsvektors + Drehwinkel dreht das Billboard zusätzlich um einen vorgegebenen Winkel senkrecht zur Blickrichtung des Spielers: inline void Positioniere_2D_Object_Verschoben_Gedreht(D3DXVECTOR3* pAbstand, float &scale, float &winkel) { CalcRotZMatrix(&g_VerschiebungsMatrix2, winkel); // Drehwinkel g_VerschiebungsMatrix2._41 = pAbstand->x+g_VerschiebungsMatrix3._41*pAbstand->z; g_VerschiebungsMatrix2._42 = pAbstand->y+g_VerschiebungsMatrix3._42*pAbstand->z; g_VerschiebungsMatrix2._43 = pAbstand->z; g_ScaleMatrix._11 = scale; g_ScaleMatrix._22 = scale; g_TransformationsMatrix = g_ScaleMatrix*g_ObjectKorrekturMatrix*g_VerschiebungsMatrix2; g_pd3dDevice->SetTransform(D3DTS_WORLD, &g_TransformationsMatrix); } Billboard-Transformationsfunktionen

Funktion z. Ausrichten d Funktion z. Ausrichten d. Billboards im planar-perspektivischen Raum unter Verwendg. d. B.-Ortsvektors + sin-/cos-Wert dreht das Billboard zusätzlich um einen vorgegebenen Winkel senkrecht zur Blickrichtung des Spielers: inline void Positioniere_2D_Object_Verschoben_Gedreht(D3DXVECTOR3* pAbstand, float &sin, float &cos, float &scale) { CreateRotZMatrix(&g_VerschiebungsMatrix2, sin, cos); // sin- und cos-Wert des Drehwinkels g_VerschiebungsMatrix2._41 = pAbstand->x+g_VerschiebungsMatrix3._41*pAbstand->z; g_VerschiebungsMatrix2._42 = pAbstand->y+g_VerschiebungsMatrix3._42*pAbstand->z; g_VerschiebungsMatrix2._43 = pAbstand->z; g_ScaleMatrix._11 = scale; g_ScaleMatrix._22 = scale; g_TransformationsMatrix = g_ScaleMatrix*g_ObjectKorrekturMatrix*g_VerschiebungsMatrix2; g_pd3dDevice->SetTransform(D3DTS_WORLD, &g_TransformationsMatrix); } Billboard-Transformationsfunktionen

Projektdateien und Klassenentwürfe class C3DScenario { public: CCursor* Cursor; CNebula* Nebula; CStarfield* Starfield; C3DScenario() Nebula = new CNebula[3]; // alle Elemente des 3D-Szenarios werden initialisiert Starfield = new CStarfield; Cursor = new CCursor; // TexturNummer (1-3), Horizontalwinkel, VertikalWinkel, Entfernung, ScaleFaktor, Nebelfarbe: rot; grün, blau Nebula[0].Nebula_Initialisieren(1, 0.0f, 0.0f, 2.0f, 1.2f, 255, 255, 255); Nebula[1].Nebula_Initialisieren(2, 120.0f, 40.0f, 2.0f, 1.2f, 255, 255, 255); Nebula[2].Nebula_Initialisieren(3, -120.0f, -40.0f, 2.0f, 1.2f, 255, 255, 255); } ~C3DScenario() … void New_Scene(void) // Rendern der 3D-Szene // zur Darstellung wird Methode durch Funktion Show_3D_Scenario( ) in Space3D.cpp aufgerufen Starfield->Render_Starfield(); Nebula[0].Render_Nebula(); Nebula[1].Render_Nebula(); Nebula[2].Render_Nebula(); Cursor->Render_Cursor(); }; C3DScenario* Scenario = NULL; Für gesamtes Handling des 3D­Szenarios ist wieder die Klasse C3DScenario zuständig  in Datei 3D_Scenario_Class.h implementiert Klassenentwürfe

Projektdateien und Klassenentwürfe CStarfield  Sterne werden gleichmäßig um den Spieler herum verteilt und haben allesamt den gleichen Abstand vom Spieler class CStarfield { … CStarfield() for(i = 0; i < AnzahlStars; i++) pPointVertices[i].position = D3DXVECTOR3(frnd(-1.0f,1.0f), frnd(-1.0f,1.0f), frnd(-1.0f,1.0f)); NormalizeVector_If_Necessary(&pPointVertices[i].position, &pPointVertices[i].position); pPointVertices[i].position *= 20.0f; HelpColorValue = lrnd(50,200); pPointVertices[i].color = D3DCOLOR_XRGB(HelpColorValue, HelpColorValue, HelpColorValue); } }; CStarfield* Starfield; Klassenentwürfe

Projektdateien und Klassenentwürfe CCursor  Renderfunktion abgewandelt  Cursor mit Hilfe der Billboardfunktion Positioniere_ 2D_Object() im 3D­Raum dargestellt class CCursor { … void Render_Cursor(void) g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE); tempVektor3 = 7.0f*CursorRichtungsVektor; tempFloat = 0.25f; // Scalefactor Positioniere_2D_Object(&tempVektor3, tempFloat ); g_pd3dDevice->SetTexture( 0, CursorTextur->pTexture ); } }; CCursor* Cursor = NULL; Klassenentwürfe

Projektdateien und Klassenentwürfe CNebula  zusätzliche Methode Nebula_Initialisieren() void Nebula_Initialisieren(long TexturNummer, float HorizontalWinkel, float VertikalWinkel, float Abstand, float scale, long red, long green, long blue) { // Nebeltextur erstellen: if(TexturNummer == 1) sprintf( NebulaTextur->Speicherpfad , "Nebula1.bmp" ); else if(TexturNummer == 2) sprintf( NebulaTextur->Speicherpfad , "Nebula2.bmp" ); else if(TexturNummer == 3) sprintf( NebulaTextur->Speicherpfad , "Nebula3.bmp" ); NebulaTextur->CreateTextur(); ScaleFactor = scale; Entfernung = Abstand; // Ortsvektor des Billboards berechnen: Horizontalwinkel = HorizontalWinkel*D3DX_PI/180.0f; Vertikalwinkel = VertikalWinkel*D3DX_PI/180.0f; Abstandsvektor.x = Entfernung*cosf(Vertikalwinkel)*sinf(Horizontalwinkel ); Abstandsvektor.y = Entfernung*sinf(Vertikalwinkel); Abstandsvektor.z = Entfernung*cosf(Vertikalwinkel)*cosf(Horizontalwinkel ); // Zuweisung der Vertexfarbe: COLOREDVERTEX* pColVertices; NebulaVB->Lock( 0, 0, (VOID**)&pColVertices, 0 ); pColVertices[0].color = D3DCOLOR_XRGB(red,green,blue); pColVertices[1].color = D3DCOLOR_XRGB(red,green,blue); pColVertices[2].color = D3DCOLOR_XRGB(red,green,blue); pColVertices[3].color = D3DCOLOR_XRGB(red,green,blue); NebulaVB->Unlock(); } Auswahl der zu verwendenden Textur Festlegen der Polarkoordinaten Festlegen der Nebelfarbe Klassenentwürfe

Projektdateien und Klassenentwürfe Spielsteuerung: Funktion ReadImmediateDataMouse() in GiveInput.h  Entgegennahme aller Maus-Steuerbefehle die eingegangenen Maus­Steuerbefehle werden innerhalb der Funktion Player_Game_Control() in Space3D.cpp in konkrete Aktionen umgesetzt. Ihr Aufruf erfolgt durch die Funktion GameMainRoutine() Klassenentwürfe