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

  • Published on
    05-Apr-2015

  • View
    103

  • Download
    1

Embed Size (px)

Transcript

  • Folie 1
  • Softwaretechnologie II (Teil 1): Simulation und 3D Programmierung Manfred Thaller WS 2012/2013 3D-Grafik: Mathe Linda Scholz
  • Folie 2
  • Was ist 3D Grafik? Vektoren Matrizen Aufbau Direct3D Zustndigkeitsbereich Schnittstellen Ebenen Farbgebung
  • Folie 3
  • Zweidimensionales kartesisches Koordinatensystem
  • Folie 4
  • Dreidimensionales kartesisches Koordinatensystem
  • Folie 5
  • Darstellung dreidimensionaler Objekte Abbildung auf dem Bildschirm durch Projektion Bildtiefe wird vermittelt Einsatz von Polygongrafik Verbindung von Bildpunkten zu mehreren Dreiecken Annhrung an den perfekten Krper Durchschnittliche Grenordnung zur Annhrung liegt bei 10.000 Polygonen
  • Folie 6
  • Vektoren Positionsvektoren Koordinaten eines Punktes Richtungsvektor Gibt Bewegungsrichtung an In Kombination mit der Geschwindigkeit auch Bewegungsvektoren genannt Vektorkomponenten vom Blickwinkel des Betrachters abhngig
  • Folie 7
  • Rechenoperationen Grundrechenarten zur Bewegung, Verlngerung oder Stauchung Punktprodukt / Skalarprodukt Bestimmt Kosinus eines Winkel zwischen zwei Richtungsvektoren Kreuzprodukt Steht senkrecht auf den Vektoren aus denen es gebildet wurde
  • Folie 8
  • Rechenoperationen Lnge eines Vektors / Distanz zwischen zwei Punkten Berechnung durch Satz des Pythagoras Normalisierte Vektoren (Richtungsvektoren) Lnge 1 pure Richtungsangabe Bewegungsvektor wird durch seine Lnge geteilt Verhindert unerwartete Werte Wichtig bei Berechnung des Punktprodukts
  • Folie 9
  • Implementierte Klasse : tbVector3 TBVECTOR3.H Deklaration und Inline-Methoden TBVECTOR3.CPP Definition / Implementierung Variablen Drei float Variablen fr die Komponenten x, y, z Programmierung einer Vektorklasse
  • Folie 10
  • Konstruktoren Standardkonstruktor Kopierkonstruktor Erwartet Referenz auf ein anderes tbVector3-Objekt Kopiert den angegeben Vektor Konstruktor Setzt Vektorkomponenten ein
  • Folie 11
  • Operatoren Arithmetische Operatoren lassen sich komponentenweise durchfhren Bsp: inline tbVector3 operator * (const tbVector3& a, const tbVector3& b) { return tbVector3(a.x * b.x, a.y * b.y, a.z * b.z); }
  • Folie 12
  • Operatoren Zuweisungsoperatoren Werden innerhalb der Klasse definiert Vergleichsoperatoren berprfung zur Gleichheit bzw. Ungleichheit zweier Vektoren
  • Folie 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
  • Folie 14
  • Hilfsfunktionen Vektorlnge und Quadrat der Vektorlnge tbVector3Length tbVector3LengthSq inline float tbVector3Length(const tbVector3& v) { return sqrtf(v.x * v.x + v.y * v.y + v.z * v.z); }
  • Folie 15
  • Hilfsfunktionen Normalisieren eines Vektors tbVector3Normalize Teilt Vektor durch seine Lnge 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 Lnge null hat, erreicht man durch Addition eines Kontrollwerts sicheres Normalisieren
  • Folie 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); }
  • Folie 17
  • Hilfsfunktionen Punktprodukt tbVector3Dot (berechnet lediglich Punktprodukt) Seite 59 tbVector3Angle rechnet Kosinuswert zustzlich 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) * //Vektorlnge (b.x * b.x + b.y * b.y + b.z * b.z))); } Man erhlt Kosinuswert des Winkels Durch ArcusFunktion
  • Folie 18
  • Hilfsfunktionen Minimum- und Maximumvektoren Geben Minimum- bzw. Maximumvektor mehrerer Vektoren an tbVector3Min bzw. tbVector3Max Zufallsvektoren Liefert zuflligen normalisierten Vektor tbVector3Random Funktion fr die Richtung : tbFloatRandom Einsatz fr Explosionen, Rauch, etc.
  • Folie 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 prft ob Vektor die Lnge null hat)
  • Folie 20
  • Hilfsfunktionen inline tbVector3 tbVector3InterpolateNormal(const tbVector3& a, const tbVector3& b, const float s) { return tbVector3NormalizeEx(a + s * (b a)); }
  • Folie 21
  • Hilfsfunktionen Zur berprfung ist es hilfreich, wenn man Vektoren ins Logbuch schreibt tbWriteVector3ToLog bersicht der Hilfsfunktionen fr Vektoren und Beispielcode auf Seite 63 Fr die Arbeit mit 2D-Vektoren gibt es die Klasse tbVector2 mit 2D Funktion hnlich zu den gerade kennengelernten
  • Folie 22
  • Matrizen Matrix = rechteckige Anordnung von Zahlen Verschiedene Menge Zeilen und Spalten Identittsmatrix Verkrpert das neutrale Element
  • Folie 23
  • Rechenoperationen
  • Folie 24
  • Multiplikation von Matrizen Spaltenanzahl von Matrize A muss mit Zeilenanzahl von Matrize B identisch sein
  • Folie 25
  • Matrizen dividieren Division durch Multiplikation mit dem Kehrwert Kehrwert ist das inverse Element bei einer Matrix muss es die Identittsmatrix ergeben Invertierte Matrix bringt man durch Exponenten -1 zum Ausdruck
  • Folie 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
  • Folie 27
  • Transformationsmatrix Transformationsmatrix verwendet 4 Spalten und 4 Zeilen Verbleibende Zeile fllt man mit einer 1 (w Koordinate) Resultierende w Koordinate muss 1 sein. Ist dies nicht der Fall teilt man alle Komponenten durch sie
  • Folie 28
  • Transformationen Translationsmatrix Verschiebt einen Vektor Simple Vektoraddition X p = x m *C 11 + y m *C 21 + z m *C 31 + C 41 Matrixelement C 41 fliet nur durch Addition ein Bei Y p C 42 und bei Zp C 43 Fllt man diese Elemente (innerhalb einer Identittsmatrix) aus, wird eine Translation durchgefhrt
  • Folie 29
  • Transformation Skalierungsmatrix Skalierung bedeutet Multiplikation eines Vektors Man nutzt die Identittsmatrix X o = x*S x + y*0 + z*0 + 0 Es finden lediglich Multiplikationen der einzelnen Komponenten statt
  • Folie 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
  • Folie 31
  • Folie 32
  • Transformationen von Richtungsvektoren Knnen nicht verschoben werden (haben keine Position, beschreiben lediglich eine Richtung) Bei einer Transformation mssen die m und n Werte vertauscht werden (transformierte invertierte Transformationsmatrix)
  • Folie 33
  • Transformationen Man kann innerhalb einer Matrix mehrere Funktionen (Translation, Skalierung, Rotation) vieler Matrizen vereinen Reihenfolge ist wichtig Skalierung Rotation Translation
  • Folie 34
  • 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
  • Folie 35
  • 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 Seitenverhltnisse des Bildes
  • Folie 36
  • Projektionsmatrix Projektionsmatrize bestimmt das Sichtfeld des Betrachters
  • Folie 37
  • Sichtfelder Clipping Ebenen
  • Folie 38
  • Kameramatrix Virtueller Beobachter lsst sich in 3D Szene einfgen 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
  • Folie 39
  • Implementierung Variablen der Klasse tbMatrix 16 float Variablen (m 11 bis m 44 ) Konstruktoren Standardkonstruktor Kopierkonstruktor mit Referenz auf eine andere Matrix. Kopiert die angegebene Matrix Konstruktor der die Werte der float-Parameter in die Matrix hineinkopiert
  • Folie 40
  • Operatoren Addition und Subtraktion sind identisch zur Vektorklasse Divisionsoperator invertiert rechte Matrix und multipliziert linke damit tbMatrixInvert tbMatrixTranspose Multiplikation ist recht komplex
  • Folie 41
  • 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 zurckzugreifen
  • Folie 42
  • Zugriffsoperatoren Zur bergabe von Variablen bentigt 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 }; []
  • Folie 43
  • Zugriffsoperatoren Durch berladen des ()-Operators der tbMatrix- Klasse kann man Elemente einzeln ansprechen class TRIBASE_API tbMatrix { public: [] //Zugriffsoperatoren float& operator () (int iRow, int iColumn) {return m[iRow - 1] [iColumn - 1];} float operator () (int iRow, int iColumn) const {return m[iRow - 1] [iColumn - 1];} }; tbMatrix m;//Matrixelemente lassen sich einzeln verndern m(1, 3) = 100.0f; m(2, 1) = -50.0f; float f = m(1, 2);// zur allgemeinen Abfrage
  • Folie 44
  • Implementierung Identittsmatrix 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); Identittsmatrix wird durch tbMatrixIdentity erzeugt, in dem man die ersten drei Zeichen der letzten Zeile auf 0.0f setzt.
  • Folie 45
  • Implementierung Rotationsmatrix Man kann Rotation fr alle Achsen separat vornehmen Seite 79-80 tbMatrixRotationX tbMatrixRotationY tbMatrixRotationZ Sinus- und Kosinuswerte mssen nur einmal berechnet werden.
  • Folie 46
  • 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 mglich Seite 81 tbMatrixRotationAxis
  • Folie 47
  • 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); }
  • Folie 48
  • 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
  • Folie 49
  • Weitere Hilfsfunktionen tbMatrixcamera Kameramatrix berechnen durch Positionsvektor vPos, Richtungsvektor vLookAt und Nach-Oben- Vektor vUp fr Kameradrehung Translationsmatrix wird entgegengesetzt der Kameraposition erzeugt Achsenvektoren der Kamera in eine Matrix eintragen Beide multiplizieren und man erhlt die Kameramatrix tbMatrixProjection Erzeugt eine Projektionsmatrix
  • Folie 50
  • Weitere Hilfsfunktionen tbVector3TransformCoords Positionsvektor mit Matrix multiplizieren W-Koordinate wird fr den Fall einer Projektion geprft tbVector3TransformNormal Richtungsvektor mit Matrix multiplizieren Transponierte invertierte Matrix wird bentigt Transformierter Vektor soll selbe Lnge wie Originalvektor erhalten Hierfr wird ursprngliche Lnge gespeichert
  • Folie 51
  • Hilfsfunktionen Auch die Matrix kann man ins Logbuch schreiben tbWriteMatrixToLog bersicht der Hilfsfunktionen fr Matrizen und Beispielcode auf Seite 87 Fr die Transformation von 2D-Vektoren gibt es die Funktionen tbVector2TransformNormal und tbVector2TransformCoords
  • Folie 52
  • Ebenen
  • Folie 53
  • Ebenengleichung Bestimmt die Menge der Punkte aus denen eine Ebene besteht Sttzvektor Liegt in der Ebene Normalenvektor Steht senkrecht auf der Ebene Verbindet man einen Punkt mit dem Sttzvektor muss der Verbindungsvektor senkrecht zum Normalenvektor stehen
  • Folie 54
  • Lage eines Punktes Durch Ebenengleichung lsst sich herausfinden ob ein Punkt auf der Ebene liegt (Ergebnis null) Ist das Ergebnis positiv, liegt der Punkt auf der Vorderseite (sichtbaren Seite) einer Ebene Ist das Ergebnis negativ, liegt der Punkt auf der Rckseite (nicht sichtbaren Seite) einer Ebene Ergebnis der Ebenengleichung wird mit Normalenvektor dividiert um Entfernung des Punktes zu der Ebene herauszufinden.
  • Folie 55
  • Folie 56
  • Implementierung tbPlane Vier Variablen (Fliekommazahlen) a, b, c und d Zustzlich eine tbVector3-Variable n (Normalenvektor) Kopierkonstruktor Leerer Konstruktor Konstruktor der vier float-Werte erwartet Konstruktor, der tbVector3-Wert und einen float- Wert erwartet Operatoren gibt es nicht
  • Folie 57
  • Hilfsfunktionen tbPlaneNormalize Normalisiert Ebenen tbPlaneDotNormal Punktprodukt aus einem Vektor und dem Normalenvektor aus der Ebene tbPlaneDotCoord Soll Punkt in Ebenengleichung einsetzen und das Ergebnis zurckliefern tbPointPlaneDistance Distanz eines Produkts zur Ebene
  • Folie 58
  • Hilfsfunktionen tbPlaneFromPointNormal Erwartet einen Punkt und einen Normalenvektor und liefert die Ebene tbPlaneTransform Man kann auch Ebenen mit Matrizen transformieren tbWritePlaneToLook Schreibt eine Ebene in die Logbuchdatei bersicht der Hilfsfunktionen und Beispielcode auf S...