Softwaretechnologie II (Teil 1): Simulation und 3D Programmierung

Slides:



Advertisements
Ähnliche Präsentationen
3. 3D-Betrachtungstransformationen
Advertisements

Schnelle Matrizenoperationen von Christian Büttner
13. Transformationen mit Matrizen
Programmieren in Logik
Seminar Stochastik im WS 02/03
Trigonometrische Funktionen
Kollisionen erkennen Kollisions- und Schnittpunkttests auf Dreieckbasis Kollisions- und Schnittpunkttests auf Viereckbasis Einsatz von achsenausgerichteten.
Game Engine Architechture 3D Maths for Games
Dreidimensionale Spielewelten
Geometrie in DirectX: Vektoroperationen Kapitel – Spieleprogrammierung mit DirectX und C++ Kaiser/Lensing.
Grundlagen der Geometrie
3.2 und 3.2.1: Räumliches Sehen und Koordinaten und Vektoren
Ein Modellansatz zur Beschreibung von Vagheiten
Klicke Dich mit der linken Maustaste durch das Übungsprogramm!
Klicke Dich mit der linken Maustaste durch das Übungsprogramm! Ein Übungsprogramm der IGS - Hamm/Sieg © IGS-Hamm/Sieg 2007 Dietmar Schumacher Zeichnerische.
Java: Objektorientierte Programmierung
FH-Hof Geometrie Richard Göbel. FH-Hof Aufbau des virtuellen Universums.
Sortierverfahren Richard Göbel.
Java: Dynamische Datentypen
Sortierverfahren Richard Göbel.
Die Geometrie der Ebene
Softwaretechnologie II (Teil 1): Simulation und 3D Programmierung
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.
Kapitel 4 Geometrische Abbildungen
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Koordinatensysteme und Transformationen
Beispiele für Gleichungssysteme
Geometrie. Geometrie 6. Ebene Geometrie Ein Punkt ist, was keinen Teil hat. Euklid ( ) Gerade analytisch: y = mx + c y(0) = c y(1)
Diskrete Mathematik I Vorlesung Arrays-
Klausur „Diskrete Mathematik II“
Zusammenfassung Vorwoche
Transformationen 09-Transformationen.
DVG Klassen und Objekte
Quaternionen Eugenia Schwamberger.
Folie 1 § 30 Erste Anwendungen (30.2) Rangberechnung: Zur Rangberechnung wird man häufig die elementaren Umformungen verwenden. (30.1) Cramersche Regel:
Matrix-Algebra Grundlagen 1. Matrizen und Vektoren
Computergraphik mit OpenGL Einführung. Bilder Objekt existiert im Raum unabhängig vom Betrachter Objekte sind beschrieben durch die Position verschiedener.
Informatik 1 Übung 8. NACHBESPRECHUNG Übung 8 Rekursion Existiert Weg von A nach B?
Vektoren Grundbegriffe für das Information Retrieval
3D- Spieleprogrammierung
Abschlussvortrag zur Studienarbeit
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Lineare Algebra Komplizierte technologische Abläufe können übersichtlich mit Matrizen dargestellt werden. Prof. Dr. E. Larek
Kurvendiskussion Los geht´s Klick auf mich! Melanie Gräbner.
Quantum Computing Hartmut Klauck Universität Frankfurt WS 04/
§3 Allgemeine lineare Gleichungssysteme
Polynome und schnelle Fourier-Transformation
Einführung in die Programmierung
Einführung in die Programmiersprache C 4
Verhalten von Objekten in der Szene
Lineare Algebra, Teil 2 Abbildungen
Inhalt Vorbemerkung Vorstellung einer Unterrichtssequenz Kritik
Lineare Funktionen und ihre Schaubilder, die Geraden
Lösen von quadratischen Ungleichungen
Multivariate Statistische Verfahren
PHP: Operatoren und Kontrollstrukturen
Java-Kurs - 8. Übung Besprechung der Hausaufgabe.
Scaffold 29S: Komplexe Zahlen
Softwaretechnologie II (Teil 1): Simulation und 3D Programmierung
Lisa Blum - Kathrin Kunze - Michael Kreil
Übersicht Nachtrag zu Ausdrücken
Die Welt der Shader Universität zu Köln WS 14/15 Softwaretechnologie II (Teil 1) Prof. Dr. Manfred Thaller Referent: Lukas Kley Fortgeschrittene Techniken.
1. Charakteranimation 2. PlugIns schreiben und laden Universität zu Köln Institut für Historisch-Kulturwissenschaftliche Informationsverarbeitung WS 2010/2011.
THE MATHEMATICS OF PARTICLES & THE LAWS OF MOTION.
Diskrete Mathematik I Vorlesung 2 Arrays.
Grundlagen der Geometrie
Graphische Datenverarbeitung
8. Vektoren. 8. Vektoren Ortsvektor oder Polarvektor.
Tutorium Software-Engineering SS14 Florian Manghofer.
Abiturprüfung Mathematik 2012 Baden-Württemberg Allgemeinbildende Gymnasien Pflichtteil Lösungen
 Präsentation transkript:

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

Zweidimensionales kartesisches Koordinatensystem

Dreidimensionales kartesisches Koordinatensystem

Darstellung dreidimensionaler Objekte Abbildung auf dem Bildschirm durch 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 Richtungsvektor 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 Konstruktor 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 Vergleichsoperatoren 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 Zufallsvektoren 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ätsmatrix Verkörpert das neutrale Element

Rechenoperationen

Multiplikation von Matrizen Spaltenanzahl von Matrize A muss mit Zeilenanzahl von Matrize B identisch 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 Zeile fü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

Sichtfelder – Clipping Ebenen

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 Konstruktoren 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 Es lohnt sich auf vorhandene CPU-Features zurückzugreifen 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 () (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 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

Hilfsfunktionen Auch die Matrix kann man ins Logbuch schreiben tbWriteMatrixToLog Übersicht der Hilfsfunktionen für Matrizen und Beispielcode auf Seite 87 Für die Transformation von 2D-Vektoren gibt es die Funktionen tbVector2TransformNormal und tbVector2TransformCoords

Ebenen

Ebenengleichung Bestimmt die Menge der Punkte aus denen eine Ebene besteht Stützvektor Liegt in der Ebene Normalenvektor Steht senkrecht auf der Ebene Verbindet man einen Punkt mit dem Stützvektor muss der Verbindungsvektor senkrecht zum Normalenvektor stehen

Lage eines Punktes Durch Ebenengleichung lässt 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 Rückseite (nicht sichtbaren Seite) einer Ebene Ergebnis der Ebenengleichung wird mit Normalenvektor dividiert um Entfernung des Punktes zu der Ebene herauszufinden.

Implementierung tbPlane Vier Variablen (Fließkommazahlen) a, b, c und d Zusätzlich 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

Hilfsfunktionen tbPlaneNormalize tbPlaneDotNormal tbPlaneDotCoord Normalisiert Ebenen tbPlaneDotNormal Punktprodukt aus einem Vektor und dem Normalenvektor aus der Ebene tbPlaneDotCoord Soll Punkt in Ebenengleichung einsetzen und das Ergebnis zurückliefern tbPointPlaneDistance Distanz eines Produkts zur Ebene

Hilfsfunktionen tbPlaneFromPointNormal tbPlaneTransform 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 Seite 94

RGB-Farbsystem Ehemalige 8-Bit Grafik erschwerte eine ausgewogene Farbgebung

RGB-Farbsystem 16-Bit-Grafik 24-Bit-Grafik gefolgt von 32-Bit-Grafik Darstellung eines Pixels basierte auf dem RGB- System 16 Bits aufgeteilt in 5 Rotanteile, 6 Grünanteile und 5 Blauanteile 24-Bit-Grafik gefolgt von 32-Bit-Grafik Bei 32 Bits bleiben 8 Bits für Farbinformationen wie Transparenz

RGB-Farbsystem Die vier Komponenten betrachtet man jeweils als ein Byte Bei Direct3D ist es auch möglich Fließkommazahlen (float-Wert) für die einzelnen Farbkomponenten zu verwendet

Implementierung Klasse tbColor Vier float-Variablen (r, g, b und a – Alpha) Konstruktoren: tbColor a(); //kein Parameter tbColor b(0.5f); //Fließkommazahl r,g,b bekommen den Wert tbColor c(0.0f, 1.0f, 0.0f, 0.5f); //float-Werte tbColor d((BYTE) (0), 255, 0, 128); //Byte-Werte tbColor e((DWORD) (0xFF00FF80)); //DWORD-Wert

Operatoren Addition ergibt additive Mischung zweier Farben Multiplikation mit positivem Wert über 1 hellt auf Mit positivem Wert unter 1 dunkelt ab

Casting Farbe in ein DWORD-Wert verwandeln tbColor Red(1.0f, 0.0f, 0.0f); DWORD dwRed = (DWORD) (Red); //Casting verwenden Red = tbColor(dwRed); //Konstruktor verwenden

Weitere Hilfsfunktionen tbColorNegate Berechnen des Negativs tbColorBrightness Berechnung der Helligkeit tbColorRandom Erzeugt Zufallsfarbe Diese und weitere auf Seite 97