Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

2D-Objekte in der 3D-Welt

Ähnliche Präsentationen


Präsentation zum Thema: "2D-Objekte in der 3D-Welt"—  Präsentation transkript:

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

2 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

3 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 -= f; else if( FlugdrehungsWinkel < -D3DX_PI ) FlugdrehungsWinkel += f; 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

4 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

5 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

6 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

7 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 -= f; else if( korrigierter_Billboardwinkel < -D3DX_PI ) korrigierter_Billboardwinkel += f; 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

8 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

9 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

10 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

11 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

12 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

13 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

14 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

15 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, f, -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

16 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

17 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

18 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

19 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


Herunterladen ppt "2D-Objekte in der 3D-Welt"

Ähnliche Präsentationen


Google-Anzeigen