1 / 66

Softwaretechnologie II (Teil 1): Simulation und 3D Programmierung Manfred Thaller WS 2012/2013

Softwaretechnologie II (Teil 1): Simulation und 3D Programmierung Manfred Thaller WS 2012/2013 3D-Grafik : Mathe Linda Scholz. Was ist 3D Grafik?. Vektoren Matrizen Aufbau Direct3D – Zuständigkeitsbereich Schnittstellen Ebenen Farbgebung.

fineen
Download Presentation

Softwaretechnologie II (Teil 1): Simulation und 3D Programmierung Manfred Thaller WS 2012/2013

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Softwaretechnologie II (Teil 1):Simulation und 3D Programmierung Manfred Thaller WS 2012/2013 3D-Grafik: Mathe Linda Scholz

  2. Was ist 3D Grafik? • Vektoren • Matrizen • Aufbau Direct3D – Zuständigkeitsbereich Schnittstellen • Ebenen • Farbgebung

  3. Zweidimensionales kartesisches Koordinatensystem

  4. Dreidimensionales kartesisches Koordinatensystem

  5. Darstellung dreidimensionaler Objekte • Abbildung auf dem Bildschirmdurch Projektion • Bildtiefe wird vermittelt • Einsatz von Polygongrafik • Verbindung von Bildpunkten zu mehreren Dreiecken • Annährung an den „perfekten“ Körper • Durchschnittliche Größenordnung zur Annährung liegt bei 10.000 Polygonen

  6. Vektoren • Positionsvektoren • Koordinaten eines Punktes • Richtungsvektor • Gibt Bewegungsrichtung an • In Kombination mit der Geschwindigkeit auch Bewegungsvektoren genannt • Vektorkomponenten vom Blickwinkel des Betrachters abhängig

  7. Rechenoperationen • Grundrechenarten zur Bewegung, Verlängerung oder Stauchung • Punktprodukt / Skalarprodukt • Bestimmt Kosinus eines Winkel zwischen zwei Richtungsvektoren • Kreuzprodukt • Steht senkrecht auf den Vektoren aus denen es gebildet wurde

  8. Rechenoperationen • Länge eines Vektors / Distanz zwischen zwei Punkten • Berechnung durch Satz des Pythagoras • Normalisierte Vektoren (Richtungsvektoren) • Länge 1 – pure Richtungsangabe • Bewegungsvektor wird durch seine Länge geteilt • Verhindert unerwartete Werte • Wichtig bei Berechnung des Punktprodukts

  9. Programmierung einer Vektorklasse • Implementierte Klasse : tbVector3 • TBVECTOR3.H • Deklaration und Inline-Methoden • TBVECTOR3.CPP • Definition / Implementierung • Variablen • Drei float Variablen für die Komponenten x, y, z

  10. Konstruktoren • Standardkonstruktor • Kopierkonstruktor • Erwartet Referenz auf ein anderes tbVector3-Objekt • Kopiert den angegeben Vektor • Konstruktor • Setzt Vektorkomponenten ein

  11. Operatoren • Arithmetische Operatoren lassen sich komponentenweise durchführen • Bsp: • inline tbVector3 operator * (const tbVector3& a, • const tbVector3& b) • { • return tbVector3(a.x * b.x, a.y * b.y, a.z * b.z); • }

  12. Operatoren • Zuweisungsoperatoren • Werden innerhalb der Klasse definiert • Vergleichsoperatoren • Überprüfung zur Gleichheit bzw. Ungleichheit zweier Vektoren

  13. D3DVECTOR • Struktur zur Darstellung von Vektoren • Wird von Direct3D verwendet • Identisch mit tbVector3 • Verbindung zur tbVector3 Klasse durch Casting • operator D3DVECTOR& () • { • return *((D3DVECTOR*)(this)); • } • 3D Spieleprogrammierung Seite 56

  14. Hilfsfunktionen • Vektorlänge und Quadrat der Vektorlänge • tbVector3Length • tbVector3LengthSq • inline float tbVector3Length(const tbVector3& v) • { • return sqrtf(v.x * v.x + v.y * v.y + v.z * v.z); • }

  15. Hilfsfunktionen • Normalisieren eines Vektors • tbVector3Normalize • Teilt Vektor durch seine Länge • inline tbVector3NormalizeEX(const tbVector3& v) • { • return v / (sqrtf(v.x * v.x + v.y * v.y + v.z * v.z) + 0.0001f); • } • Wenn man nicht sicher ist ob der Vektor die Länge null hat, erreicht man durch Addition eines Kontrollwerts „sicheres“ Normalisieren

  16. Hilfsfunktionen • Das Kreuzprodukt • tbVector3Cross • inline tbVector3 tbVectorCross(const tbVector3& a, • const tbVector3& b) • { • return tbVector3(a.y * b.z - a.z * b.y, • a.z * b.x - a.x * b.z, • a.x * b.y - a.y * b.x); • }

  17. Hilfsfunktionen • Punktprodukt • tbVector3Dot (berechnet lediglich Punktprodukt) Seite 59 • tbVector3Angle rechnet Kosinuswert zusätzlich um • inline float tbVector3Angle(const tbVector3& a, • const tbVector3& b) • { • return acosf((a.x * b.x + a.y * b.y + a.z * b.z) / //Punktprodukt • sqrtf((a.x * a.x + a.y * a.y + a.z * a.z) * //Vektorlänge • (b.x * b.x + b.y * b.y + b.z * b.z))); • } • Man erhält Kosinuswert des Winkels • Durch ArcusFunktion

  18. Hilfsfunktionen • Minimum- und Maximumvektoren • Geben Minimum- bzw. Maximumvektor mehrerer Vektoren an • tbVector3Min bzw. tbVector3Max • Zufallsvektoren • Liefert zufälligen normalisierten Vektor • tbVector3Random • Funktion für die Richtung : tbFloatRandom • Einsatz für Explosionen, Rauch, etc.

  19. Hilfsfunktionen • Lineare Interpolation • Positionsbestimmung eines Objekts zu einer gewissen Zeit • Start- und Zielpunkt sind bekannt • tbVector3InterpolateCoords Seite 61 • Interpoliert man Normalenvektoren ist das Ergebnis nicht gleichzeitig auch ein Normalenvektor • tbVector3InterpolateNormale (Interpoliert und normalisiert) • tbVector3InterpolateNormalizeEx (Interpoliert, normalisiert und prüft ob Vektor die Länge null hat)

  20. Hilfsfunktionen • inline tbVector3 tbVector3InterpolateNormal(const tbVector3& a, • const tbVector3& b, • const float s) • { • return tbVector3NormalizeEx(a + s * (b – a)); • }

  21. Hilfsfunktionen • Zur Überprüfung ist es hilfreich, wenn man Vektoren ins Logbuch schreibt • tbWriteVector3ToLog • Übersicht der Hilfsfunktionen für Vektoren und Beispielcode auf Seite 63 • Für die Arbeit mit 2D-Vektoren gibt es die Klasse tbVector2 mit 2D Funktion ähnlich zu den gerade kennengelernten

  22. Matrizen • Matrix = rechteckige Anordnung von Zahlen • Verschiedene Menge Zeilen und Spalten • IdentitätsmatrixVerkörpert das neutrale Element

  23. Rechenoperationen

  24. Multiplikation von Matrizen • Spaltenanzahlvon Matrize Amuss mit Zeilenanzahlvon Matrize Bidentisch sein

  25. Matrizen dividieren • Division durch Multiplikation mit dem Kehrwert • Kehrwert ist das inverse Element – bei einer Matrix muss es die Identitätsmatrix ergeben • Invertierte Matrix bringt man durch Exponenten -1 zum Ausdruck

  26. Transformationen • Verschiebung • Rotation • Skalierung • Man betrachtet Vektoren als Matrix mit Zeilen und Spalten • Man geht von absoluten Koordinaten mit dem Objektmittelpunkt (0, 0, 0) aus

  27. Transformationsmatrix • Transformationsmatrix verwendet 4 Spalten und 4 Zeilen • Verbleibende Zeilefüllt man mit einer 1 (w Koordinate) • Resultierende w Koordinate muss 1 sein. Ist dies nicht der Fall teilt man alle Komponenten durch sie

  28. Transformationen • Translationsmatrix • Verschiebt einen Vektor • Simple Vektoraddition • Xp = xm*C11 + ym*C21 + zm*C31 + C41 • Matrixelement C41 fließt „nur“ durch Addition ein • Bei Yp C42 und bei Zp C43 • Füllt man diese Elemente (innerhalb einer Identitätsmatrix) aus, wird eine Translation durchgeführt

  29. Transformation • Skalierungsmatrix • Skalierung bedeutet Multiplikation eines Vektors • Man nutzt die Identitätsmatrix • Xo = x*Sx + y*0 + z*0 + 0 • Es finden lediglich Multiplikationen der einzelnen Komponenten statt

  30. Transformationen • Rotationsmatrizen • Gleichung zur Drehung eines Punktes um den Koordinatenursprung: • x = (x * cos α) + (y * (- sin α))y = (x * sin α) + (y * cos α) • Dieses Verfahren kann man auf die Rechnung mit der Matrix anwenden • Es muss beachtet werden, welche Komponenten angesprochen werden

  31. Transformationen von Richtungsvektoren • Können nicht verschoben werden (haben keine Position, beschreiben lediglich eine Richtung) • Bei einer Transformation müssen die m und n Werte vertauscht werden (transformierte invertierte Transformationsmatrix)

  32. Transformationen • Man kann innerhalb einer Matrix mehrere Funktionen (Translation, Skalierung, Rotation) vieler Matrizen vereinen • Reihenfolge ist wichtig • Skalierung • Rotation • Translation

  33. Matrix als Koordinatensystem • Um eine Matrix zu erhalten die einen Punkt in ein anderes Koordinatensystem umrechnet, muss eine Translation um den Ursprung stattfinden • Um Koordinatensystemmatrix zu erhalten muss man Rotationsmatrix mit Translationsmatrix multiplizieren

  34. Projektionsmatrix • Projektion eines dreidimensionalen Vektors auf eine Ebene (Bildschirm) • Dreiecke die vor oder hinter einer gewissen Ebene (nahe und ferne Clipping-Ebene) werden nicht mehr dargestellt • Entfernung der Clipping Ebene • Blickfeld des Betrachters • Seitenverhältnisse des Bildes

  35. Projektionsmatrix • Projektionsmatrize bestimmt das Sichtfeld des Betrachters

  36. Sichtfelder – Clipping Ebenen

  37. Kameramatrix • Virtueller Beobachter lässt sich in 3D Szene einfügen • Position und Ausrichtung muss bekannt sein- Blickpunkt der Kamera • Nach-oben-Vektor –Kamerabewegung • Dreht man Kamera nach links werden Objektvektoren nach rechts bewegt • Man wendet Kameramatrix vor Projektions- und nach Transformationsmatrizen an • beinhaltet eigenes Koordinatensystem

  38. Implementierung • Variablen der Klasse tbMatrix • 16 float Variablen (m11 bis m44) • Konstruktoren • Standardkonstruktor • Kopierkonstruktor mit Referenz auf eine andere Matrix. Kopiert die angegebene Matrix • Konstruktor der die Werte der float-Parameter in die Matrix hineinkopiert

  39. Operatoren • Addition und Subtraktion sind identisch zur Vektorklasse • Divisionsoperator invertiert rechte Matrix und multipliziert linke damit • tbMatrixInvert • tbMatrixTranspose • Multiplikation ist recht komplex

  40. Operatoren • inline tbMatrix operator * (const tbMatrix& a, • const tbMatrix& b) • { • return tbMatrix(b.m11 * a.m11 + b.m21 * a.m12 + b.m31 * a.m13 + b.m41 * a.m14, • b.m12 * a.m11 + b.m22 * a.m12 + b.m32 * a.m13 + b.m42 * a.m14, • b.m13 * a.m11 + b.m23 * a.m12 + b.m33 * a.m13 + b.m43 * a.m14, • […] • […] • […] ); • } • Es lohnt sich auf vorhandene CPU-Features zurückzugreifen

  41. Zugriffsoperatoren • Zur Übergabe von Variablen benötigt man ein zweidimensionales Array • class TRIBASE_API tbMatrix • { • public: • union • { • struct • { • float m11, m12, m13, m14, //Elemente der Matrix • m21, m22, m23, m24, • m31, m32, m33, m34, • m41, m42, m43, m44; • } • float m[4] [4]; //Zweidimensionales Array • }; • […]

  42. Zugriffsoperatoren • Durch Überladen des „()“-Operators der tbMatrix-Klasse kann man Elemente einzeln ansprechen • class TRIBASE_API tbMatrix • { • public: • […] //Zugriffsoperatoren • float& operator () (intiRow, intiColumn) {return m[iRow - 1] [iColumn - 1];} • floatoperator () (intiRow, intiColumn) const {return m[iRow - 1] [iColumn - 1];} • }; • tbMatrix m; //Matrixelemente lassen sich einzeln verändern • m(1, 3) = 100.0f; • m(2, 1) = -50.0f; • float f = m(1, 2); // zur allgemeinen Abfrage

  43. Implementierung • Identitätsmatrix und Translationsmatrix lassen sich leicht erzeugen • TRIBASE_API tbMatrix tbMatrixTranslation (const tbVector3& v) • { • return tbMatrix (1.0f, 0.0f, 0.0f, 0.0f, • 0.0f, 1.0f, 0.0f, 0.0f, • 0.0f, 0.0f, 1.0f, 0.0f, • v.x, v.y, v.z, 1.0f); • Identitätsmatrix wird durch tbMatrixIdentity erzeugt, in dem man die ersten drei Zeichen der letzten Zeile auf 0.0f setzt.

  44. Implementierung • Rotationsmatrix • Man kann Rotation für alle Achsen separat vornehmen Seite 79-80 • tbMatrixRotationX • tbMatrixRotationY • tbMatrixRotationZ • Sinus- und Kosinuswerte müssen nur einmal berechnet werden.

  45. Implementierung • Rotation um alle drei Achsen • TRIBASE_API tbMatrix tbMatrixRotation (const tbVector3& v) • { • return tbMatrixRotationZ(v.z) * tbMatrixRotationX(v.x) * tbMatrixRotationY(v.y); • } • Rotation um eine beliebige Achse ebenfalls möglich Seite 81 • tbMatrixRotationAxis

  46. Implementierung • Skalierungsmatrix • TRIBASE_API tbMatrix tbMatrixScaling (const tbVector3& v) • { • return tbMatrix(v.x, 0.0f, 0.0f, 0.0f, • 0.0f, v.y, 0.0f, 0.0f, • 0.0f, 0.0f, v.z, 0.0f, • 0.0f, 0.0f, 0.0f, 1.0f); • }

  47. Weitere Hilfsfunktionen • tbMatrixAxes • Man übergibt Achsenvektoren zur Berechnung der Achsenmatrix • Ausgabe der Ausrichtung eines Objekts • tbMatrixDet • Bestimmt Determinante einer Matrix • tbMatrixInvert • Invertiert angegebene Matrix • tbMatrixTranspose • Transponiert eine Matrix

  48. Weitere Hilfsfunktionen • tbMatrixcamera • Kameramatrix berechnen durch Positionsvektor vPos, Richtungsvektor vLookAt und „Nach-Oben-Vektor“ vUp für Kameradrehung • Translationsmatrix wird entgegengesetzt der Kameraposition erzeugt • Achsenvektoren der Kamera in eine Matrix eintragen • Beide multiplizieren und man erhält die Kameramatrix • tbMatrixProjection • Erzeugt eine Projektionsmatrix

  49. Weitere Hilfsfunktionen • tbVector3TransformCoords • Positionsvektor mit Matrix multiplizieren • W-Koordinate wird für den Fall einer Projektion geprüft • tbVector3TransformNormal • Richtungsvektor mit Matrix multiplizieren • Transponierte invertierte Matrix wird benötigt • Transformierter Vektor soll selbe Länge wie Originalvektor erhalten • Hierfür wird ursprüngliche Länge gespeichert

More Related