1 / 24

Trigonometrische Funktionen

Trigonometrische Funktionen. Runtime - Library - Funktionen sin oder cos auf Berechnung von double ausgelegt Einfache Genauigkeit float durch funktionale gleichwertige Funktionen sinf, cosf, tanf, atanf Konstante π wird durch D3DX_PI repräsentiert. Vektoren. In C:

keala
Download Presentation

Trigonometrische Funktionen

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. Trigonometrische Funktionen • Runtime - Library - Funktionen sin oder cos auf Berechnung von double ausgelegt • Einfache Genauigkeit float durch funktionale gleichwertige Funktionen sinf, cosf, tanf, atanf • Konstante π wird durch D3DX_PI repräsentiert

  2. Vektoren • In C: • 3D - Vektor als struct mit drei Koordinatenwerten x, y, z: typedef struct _D3DVECTOR { float x; float y; float z; } D3DVECTOR; -> Koordinaten eines Vektor v über v.x, v.y, v.z ansprechbar • In c++: verschiedene Konstruktoren und überladene Operatoren

  3. typedef struct D3DXVECTOR3: public D3DVECTOR { public: D3DXVECTOR3 () {}; // erzeugt uninitialisierten Vektor D3DXVECTOR3 ( CONST FLOAT *); /* initialisiert Vektor aus Array von Gleitkommazahlen */ D3DXVECTOR3 (CONST D3DVECTOR& ); /* Copy - Konstruktor: Vektor aus Vektor */ D3DXVECTOR3 ( FLOAT x, FLOAT y, FLOAT z); /* Initialisierung mit 3 Einzelwerten */ operator FLOAT* (); /*Vektor auf Array von Gleitkommazahlen casten*/ operator CONST FLOAT* () const; /* damit jede Koordinate über Index ansprechbar */ D3DXVECTOR3& operator += (CONST D3DXVECTOR3&); //Addition Vektoren v+= w */ D3DXVECTOR3& operator -= (CONST D3DXVECTOR3&);// Subtraktion D3DXVECTOR3& operator *= (FLOAT);/* Multiplikation Vektor v *= s (Skalar)*/ D3DXVECTOR3& operator /= (FLOAT);/* Division Vektor v /= s (Skalar)*/

  4. D3DXVECTOR3 operator + () const; // Vorzeichen +v D3DXVECTOR3 operator - () const; // Vorzeichen -v D3DXVECTOR3 operator + (CONST D3DXVECTOR3&) const; // Addition zweier Vektoren u = v + w D3DXVECTOR3 operator - (CONST D3DXVECTOR3&) const; // Subtraktion zweier Vektoren u = v - w D3DXVECTOR3 operator * (FLOAT) const; // u = v*s (Skalar) D3DXVECTOR3 operator / (FLOAT) const; // u = v/s (Skalar) friend D3DXVECTOR3 operator * (FLOAT, CONST struct D3DXVECTOR3&); // u = s (Skalar) * v BOOL operator == (CONST D3DXVECTOR3& ) const; // Test auf Gleichheit zweier Vektoren u == v BOOL operator != (CONST D3DXVECTOR3& ) const; // Test auf Ungleichheit u!=v } D3DXVECTOR3, // ist ein 3D - Vektor *LPD3DXVECTOR3; // ist ein Zeiger auf einen 3D - Vektor

  5. Vektorfunktionen -> Addition von zwei Vektoren D3DXVECTOR3* D3DXVec3Add (D3DVECTOR3* pOut, CONST D3DVECTOR3* pV1, CONST D3DVECTOR3* pV2) ( Zeiger auf Ergebnisvektor, ersten Summanden, zweiten Summanden ) • *pOut wird als Funktionsergebnis über return zurück gegeben • Alternativ: Out = V1 + V2 -> Subtraktion ist in Parametersignatur identisch D3DXVECTOR3* D3DXVec3Subtract (D3DVECTOR3* pOut, CONST D3DVECTOR3* pV1, CONST D3DVECTOR3* pV2) ( Zeiger auf Ergebnisvektor, erster Operand, zweiter Operand )

  6. -> Skalieren, dh Multiplizieren des Vektors mit einer Zahl D3DXVECTOR3* D3DXVec3Scale (D3DXVECTOR3* pOut, CONST D3DXVECTOR3* pV, FLOAT s) ( Zeiger auf Ergebnisvektor, skalierenden Vektor, Skalierungsfaktor) • alternativ: Out = s * V -> Skalarprodukt von Vektoren FLOAT D3DXVec3Dot (CONST D3DXVECTOR3* pV1, CONST D3DXVECTOR3* pV2) (Erster Eingabevektor, zweiter Eingabevektor) -> Länge eines Vektors FLOAT D3DXVec3Length (CONST D3DXVECTOR3* pV) (Zeiger auf Vektor, dessen Länge gesucht)

  7. -> Längenvergleiche zwischen Vektoren • Längenquadrate der Vektoren berechnen ist effizienter, da kein Wurzel ziehen FLOAT D3DXVecLengthSq (CONST D3DXVECTOR3* pV) (Vektor, dessen Längenquadrat gesucht) -> Vektorkreuzprodukt • zwei Vektoren: a x b D3DXVECTOR3* D3DXVecCross (D3DXVECTOR3* pOut, CONST D3DXVECTOR3* pV1, CONST D3DXVECTOR3* pV2) (Ergebnis, erster Operand, zweiter Operand) -> lineare Interpolation Out= (1-s)V1 + V2 D3DXVECTOR3* D3DXVec3Lerp (D3DXVECTOR3* pOut, CONST D3DXVECTOR3* pV1, CONST D3DXVECTOR3* pV2, FLOAT s) (Ergebnis, erster Operand, zweiter Operand, Interpolationsfaktor)

  8. -> jeweils kleinste x, y, z - Koordinatenwerte zweier Vektoren zu neuem Vektor zusammen fassen, Minimum der beiden Eingabewerte D3DXVECTOR3* D3DXVec3Minimize (D3DXVECTOR3* pOut, CONST D3DXVECTOR3* pV1, CONST D3DXVECTOR3* pV2) (Ergebnisvektor, erster Operand, zweiter Operand) -> Maximum äquivalent berechnen D3DXVECTOR3* D3DXVec3Maximize (D3DXVECTOR3* pOut, CONST D3DXVECTOR3* pV1, CONST D3DXVECTOR3* pV2) -> normalisierter Vektor • gleiche Richtung wie Ursprungsvektor, aber Länge 1 • Berechnung: Division durch seine Länge D3DXVECTOR3* D3DXVec3Normalize (D3DXVECTOR3* pOut, CONST D3DXVECTOR3* pV) (Ergebnisvektor, Eingabevektor)

  9. Matrizen • 4 x 4 Matrizen - zunächst wieder einfache C Datenstruktur typedef struct _D3DMATRIX { union // Union, in der zwei Interpretationen der Matrix { struct { float _11, _12, _13, _14; //als einzeln benannte Felder float _21, _22, _23, _24; float _31, _32, _33, _34; float _41, _42, _43, _44; }; float m [4][4];// als zweidimensionaler Array // übereinander gelegt sind -> Felder von Matrix mat // können direkt mat._32 oder über Index mat.m [3][2] }; // angesprochen werden } D3DMATRIX;

  10. typedef struct D3DMXMATRIX : public D3DMATRIX { Public: D3DXMATRIX () {}; // ohne Initialwerte D3DXMATRIX (CONST FLOAT *); // über Array von Werten D3DXMATRIX (CONST D3DXMATRIX&); // über andere Matrix D3DXMATRIX (FLOAT _11, FLOAT _12, FLOAT _13, FLOAT _14, FLOAT _21, FLOAT _22, FLOAT _23, FLOAT _24, FLOAT _31, FLOAT _32, FLOAT _33, FLOAT _34, FLOAT _41, FLOAT _42, FLOAT _43, FLOAT _44,); // Initialisierung über Einzelwerte FLOAT& operator () (UINT Row, UINT Col); FLOAT operator () (UINT Row, UINT Col) const; // Überladen Operator () -> Zugriff auf Felder der // Matrix mat über mat (3,2) // im ersten Fall sind Werte durch Referenz veränderbar

  11. operator FLOAT* (); // Cast Operatoren operator CONST FLOAT* () const;// Matrix als Array D3DXMATRIX& operator *= (CONST D3DXMATRIX& ); //Multiplikation zweier Matrizen m*=n D3DXMATRIX& operator += (CONST D3DXMATRIX& ); // Addition zweier Matrizen m+=n D3DXMATRIX& operator -= (CONST D3DXMATRIX& ); // Subtraktion zweier Matrizen m-=n D3DXMATRIX& operator *= (FLOAT); // Multiplikation Matrix m *=s (Skalar) D3DXMATRIX& operator /= (FLOAT); // Division einer Matrix durch Skalar m/=s D3DXMATRIX operator + () const; // Vorzeichen +m D3DXMATRIX operator - () const; // Vorzeichen -m

  12. D3DXMATRIX operator * (CONST D3DXMATRIX&) const; //Multiplikation zweier Matrizen m = n1 *n2 D3DXMATRIX operator + (CONST D3DXMATRIX&) const; // Addition zweier Matrizen m = n1+ n2 D3DXMATRIX operator - (CONST D3DXMATRIX&) const; // Subtraktion zweier Matrizen m = n1 - n2 D3DXMATRIX operator * (FLOAT) const; // Multiplikation Matrix * Skalar m = n*s D3DXMATRIX operator / (FLOAT) const; // Division Matrix / Skalar m = n/s friend D3DXMATRIX operator * (FLOAT, CONST D3DXMATRIX&); // Multiplikation Skalar, Matrix m = s*n BOOL operator == (CONST D3DXMATRIX&) const; // Test auf Gleichheit zweier Matrizen m == n BOOL operator != (CONST D3DXMATRIX&) const; // Test auf Ungleichheit m!=n } D3DXMATRIX, // Datentyp: eine 4x4 Matrix *LPD3DXMATRIX; // Datentyp: Zeiger auf 4x4 Matrix

  13. Matrizenfunktionen -> Einheitsmatrix erzeugen - häufig als Initialwert verwendet, macht gar nichts wenn auf Vektor / Matrix D3DXMATRIX* D3DXMatrixIdentity (D3DXMATRIX* pOut) (Zeiger auf Ergebnismatrix wird über return zurück gegeben) -> Berechnung der Umkehrmatrix • manche Matrixoperationen lassen sich rückgängig machen, so etwa die Drehung, z.B. Drehung um die z-Achse • Allgemeine Matrix zur Drehung um z-Achse sowie für deren umgekehrte Drehung ergibt Einheitsmatrix -> M * M-1 = E D3DXMATRIX* D3DXMatrixInverse (D3DXMATRIX* pOut, FLOAT* pDeterminant, CONST D3DXMATRIX*pM) (Zeiger auf Ergebnismatrix, berechnende Determinante, invertierende Matrix) • wenn nicht invertierbar: Rückgabewert 0 • Determinante: wenn ungleich 0, ist die Matrix invertierbar

  14. -> Multiplikation, Produkt zweier Matrizen D3DXMATRIX* D3DXMatrixMultiply (D3DXMATRIX*pOut, CONST D3DXMATRIX* pM1, CONST D3DXMATRIX* pM2) (Zeiger auf Ergebnismatrix, erste, zweite Eingabematrix) • pOut wird zurück gegeben -> Rotationen um eine der drei Koordinatenachsen D3DXMATRIX* D3DXMatrixRotationX (D3DXMATRIX*pOut, FLOAT Angle) D3DXMATRIX* D3DXMatrixRotationY (D3DXMATRIX*pOut, FLOAT Angle) D3DXMATRIX* D3DXMatrixRotationZ (D3DXMATRIX*pOut, FLOAT Angle) (Ergebnismatrix, Rotationswinkel) • Vektor gegen den Uhrzeigersinn in bestimmtem Winkel • Beliebige Achse: D3DXMATRIX* D3DXMatrixRotationAxis (D3DXMATRIX*pOut, CONST D3DXVECTOR3* pV, FLOAT Angle) - Vektor angeben, der Drehachse bilden soll

  15. -> Matrix, die Vektoren um Winkel in alle drei Koordinatenrichtungen kippt • Yaw: Rechts - Links - Drehen • Pitch: Auf - Ab • Roll: Rechts - Links - Neigen D3DXMATRIX* D3DXMatrixRotationYawPitchRoll (D3DXMATRIX* pOut, FLOAT Yaw, FLOAT Pitch, FLOAT Roll) -> Matrix in x,y,z Richtung skalieren D3DXMATRIX* D3DXMatrixScaling (D3DXMATRIX* pOut, FLOAT sx, FLOAT sy, FLOAT sz) (Ergebnis, Skalierungsfaktor in x,y,z - Richtung) -> Translation oder Verschiebung D3DXMATRIX* D3DXMatrixTranslation (D3DXMATRIX* pOut, FLOAT x, FLOAT y, FLOAT z) (Ergebnis, Verschiebung in x,y,z - Richtung)

  16. -> Erzeugung von Projektionsmatrizen • Matrix für orthogonale Projektion in z-Richtung in einem linkshändischen Koordinatensystem D3DXMATRIX* D3DXMatrixOrthoLH (D3DXMATRIX* pOut, FLOAT w, FLOAT h, FLOAT zn, FLOAT zf) (Zeiger auf Ergebnismatrix, Breite des Sichtfensters, Höhe des Sichtfensters, Abstand zur nahen Begrenzungsebene, Abstand zur fernen Begrenzungsebene) -> perspektivische Projektion D3DXMATRIX* D3DXMatrixPerspectiveLH (D3DXMATRIX* pOut, FLOAT w, FLOAT h, FLOAT zn, FLOAT zf) (Ergebnismatrix, Breite des Sichtfensters, Höhe des Sichtfensters, Abstand zur nahen Begrenzungsebene, Abstand zur fernen Begrenzungsebene) -> für eine perspektivische Projektion über Ansichtsverhältnis und Blickwinkel D3DXMATRIX* D3DXMatrixPerspectiveFovLH (D3DXMATRIX* pOut, FLOAT fovy, FLOAT Aspect, FLOAT zn, FLOAT zf) (Ergebnismatrix, Blickfeldwinkel, Ansichtsverhältnis, Abstand zur nahen Begrenzungsebene, Abstand zur fernen Begrenzungsebene)

  17. -> Szene aus bestimmter Position betrachten, damit ist bestimmte Bewegung im Raum verbunden D3DXMATRIX* D3DXMatrixLookAtLH (D3DXMATRIX* pOut, CONST D3DXVECTOR3* pEye, CONST D3DXVECTOR3* pAt, CONST D3DXVECTOR3* pUp) (Zeiger auf Ergebnismatrix, Standpunkt Betrachter, Blickpunkt Betrachter, Richtungsvektor, der angibt, wo für Betrachter „oben“ ist)

  18. Vektor - Matrizenfunktionen • Multiplizieren eines Vektors mit einer Matrix: D3DXVec3TransformNormal D3DCVec3TransformCoord • beide Funktionen ermöglichen Multiplikation eines dreidimensionalen Vektors mit 4x4 Matrix • Wir wollen mit 3D Vektoren arbeiten, müssen aber aus technischen Gründen mit in der vierten Koordinate mit 1 ergänzten 4D Vektoren arbeiten

  19. D3DXVec3TransformNormal • Matrix wird durch Ignorieren der vierten Spalte und vierten Zeile zurecht geschnitten • Dann Multiplikation des 3D - Eingabevektors mit Matrix D3DXVECTOR3* D3DXVec3TransformNormal ( D3DXVECTOR3* pOut, CONST D3DXVECTOR3* pV, CONST D3DXMATRIX* pM) (Zeiger auf Ergebnisvektor, multiplizierenden Vektor, Matrix) • Ergebnis ist nur bei Dreh- oder Skalierungsmatrix korrekt, Verschiebung: ein Verschiebevektor wird in letzter Zeile und Spalte ignoriert

  20. D3DXVECTOR3* D3DXVec3TransformCoord (D3DXVECTOR3* pOut, CONST D3DXVECTOR3* pV, CONST D3DXMATRIX* pM) ( Zeiger auf Ergebnisvektor, auf den zu multiplizierenden Vektor, auf Matrix) • fehlende vierte Koordinate des Vektors wird mit 1 ergänzt • Eignet sich für Verschiebung • Multiplikation mit kompletter 4x4 Matrix • Dann Rückskalierung: die ersten drei Koordinaten werden durch den Wert der vierten Koordinate dividiert • Bei Drehungen, Skalierungen, Translationen hat Rückskalierung keinen Effekt -> auch hier korrekte Ergebnisse • Vierte Koordinate nach Multiplikation ignoriert • Ergebnis: 3D Vektor

  21. Modellierung dreidimensionaler Objekte • Statt Punktwolke in 3D Szenarien: digitales Drahtgitter, auch genannt Mesh • Besteht aus Vielzahl von Eck- und Knotenpunkten (Vertices) • Ein Vertex ist ein Vektor mit x, y, z - Koordinate • Zusätzlich: Angabe der Punkte, die zusammen eine Fläche bilden -> Aufstellung aller Flächen bzw Faces • Fläche hat immer Vorderseite und Rückseite und wird durch Aufzählung ihrer Eckpunkte im Uhrzeigersinn bei Blick auf Vorderseite beschrieben • Folien zum „Bekleben“: Texturen in bmp oder jpg Format -> Information über Klebepunkte • Für jeden Eckpunkt muss man festlegen, welche Stelle der Textur an ihm anzukleben ist • Textur wird entsprechend gestreckt oder gestaucht -> Textur Mapping

  22. Material: Textur mit Materialeigenschaften • In DirectX: Mesh als Datenstruktur • Dateiformat für Meshes: x-Format .x • Erstellung über 3D Modeller

More Related