670 likes | 858 Views
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.
E N D
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
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
Vektoren • Positionsvektoren • Koordinaten eines Punktes • Richtungsvektor • Gibt Bewegungsrichtung an • In Kombination mit der Geschwindigkeit auch Bewegungsvektoren genannt • Vektorkomponenten vom Blickwinkel des Betrachters abhängig
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
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
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
Konstruktoren • Standardkonstruktor • Kopierkonstruktor • Erwartet Referenz auf ein anderes tbVector3-Objekt • Kopiert den angegeben Vektor • Konstruktor • Setzt Vektorkomponenten ein
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); • }
Operatoren • Zuweisungsoperatoren • Werden innerhalb der Klasse definiert • Vergleichsoperatoren • Überprüfung zur Gleichheit bzw. Ungleichheit zweier Vektoren
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
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); • }
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
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); • }
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
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.
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)
Hilfsfunktionen • inline tbVector3 tbVector3InterpolateNormal(const tbVector3& a, • const tbVector3& b, • const float s) • { • return tbVector3NormalizeEx(a + s * (b – a)); • }
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
Matrizen • Matrix = rechteckige Anordnung von Zahlen • Verschiedene Menge Zeilen und Spalten • IdentitätsmatrixVerkörpert das neutrale Element
Multiplikation von Matrizen • Spaltenanzahlvon Matrize Amuss mit Zeilenanzahlvon Matrize Bidentisch sein
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
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
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
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
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
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
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)
Transformationen • Man kann innerhalb einer Matrix mehrere Funktionen (Translation, Skalierung, Rotation) vieler Matrizen vereinen • Reihenfolge ist wichtig • Skalierung • Rotation • Translation
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
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
Projektionsmatrix • Projektionsmatrize bestimmt das Sichtfeld des Betrachters
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
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
Operatoren • Addition und Subtraktion sind identisch zur Vektorklasse • Divisionsoperator invertiert rechte Matrix und multipliziert linke damit • tbMatrixInvert • tbMatrixTranspose • Multiplikation ist recht komplex
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
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 • }; • […]
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
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.
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.
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
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); • }
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
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
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