Top Banner
24

Trigonometrische Funktionen Runtime - Library - Funktionen sin oder cos auf Berechnung von double ausgelegt Einfache Genauigkeit float durch funktionale.

Apr 05, 2015

Download

Documents

Luise Zeiner
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Trigonometrische Funktionen Runtime - Library - Funktionen sin oder cos auf Berechnung von double ausgelegt Einfache Genauigkeit float durch funktionale.
Page 2: Trigonometrische Funktionen Runtime - Library - Funktionen sin oder cos auf Berechnung von double ausgelegt Einfache Genauigkeit float durch funktionale.

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

Page 3: Trigonometrische Funktionen Runtime - Library - Funktionen sin oder cos auf Berechnung von double ausgelegt Einfache Genauigkeit float durch funktionale.

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

Page 4: Trigonometrische Funktionen Runtime - Library - Funktionen sin oder cos auf Berechnung von double ausgelegt Einfache Genauigkeit float durch funktionale.

typedef struct D3DXVECTOR3: public D3DVECTOR{public:D3DXVECTOR3 () {}; // erzeugt uninitialisierten VektorD3DXVECTOR3 ( 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&);// SubtraktionD3DXVECTOR3& operator *= (FLOAT);/* Multiplikation Vektor v *= s

(Skalar)*/D3DXVECTOR3& operator /= (FLOAT);/* Division Vektor v /= s

(Skalar)*/

Page 5: Trigonometrische Funktionen Runtime - Library - Funktionen sin oder cos auf Berechnung von double ausgelegt Einfache Genauigkeit float durch funktionale.

D3DXVECTOR3 operator + () const; // Vorzeichen +vD3DXVECTOR3 operator - () const; // Vorzeichen -v

D3DXVECTOR3 operator + (CONST D3DXVECTOR3&) const;// Addition zweier Vektoren u = v + wD3DXVECTOR3 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 == vBOOL operator != (CONST D3DXVECTOR3& ) const;// Test auf Ungleichheit u!=v}D3DXVECTOR3, // ist ein 3D - Vektor*LPD3DXVECTOR3; // ist ein Zeiger auf einen 3D - Vektor

Page 6: Trigonometrische Funktionen Runtime - Library - Funktionen sin oder cos auf Berechnung von double ausgelegt Einfache Genauigkeit float durch funktionale.

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 )

Page 7: Trigonometrische Funktionen Runtime - Library - Funktionen sin oder cos auf Berechnung von double ausgelegt Einfache Genauigkeit float durch funktionale.

-> 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)

Page 8: Trigonometrische Funktionen Runtime - Library - Funktionen sin oder cos auf Berechnung von double ausgelegt Einfache Genauigkeit float durch funktionale.

-> Längenvergleiche zwischen Vektoren

- Längenquadrate der Vektoren berechnen ist effizienter, da kein Wurzel ziehenFLOAT 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)

Page 9: Trigonometrische Funktionen Runtime - Library - Funktionen sin oder cos auf Berechnung von double ausgelegt Einfache Genauigkeit float durch funktionale.

-> 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 berechnenD3DXVECTOR3* 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)

Page 10: Trigonometrische Funktionen Runtime - Library - Funktionen sin oder cos auf Berechnung von double ausgelegt Einfache Genauigkeit float durch funktionale.

Matrizen• 4 x 4 Matrizen - zunächst wieder einfache C Datenstrukturtypedef struct _D3DMATRIX{union // Union, in der zwei Interpretationen der Matrix{ struct{ float _11, _12, _13, _14; //als einzeln benannte Felderfloat _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;

Page 11: Trigonometrische Funktionen Runtime - Library - Funktionen sin oder cos auf Berechnung von double ausgelegt Einfache Genauigkeit float durch funktionale.

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

Page 12: Trigonometrische Funktionen Runtime - Library - Funktionen sin oder cos auf Berechnung von double ausgelegt Einfache Genauigkeit float durch funktionale.

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

Page 13: Trigonometrische Funktionen Runtime - Library - Funktionen sin oder cos auf Berechnung von double ausgelegt Einfache Genauigkeit float durch funktionale.

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

Page 14: Trigonometrische Funktionen Runtime - Library - Funktionen sin oder cos auf Berechnung von double ausgelegt Einfache Genauigkeit float durch funktionale.

Matrizenfunktionen-> Einheitsmatrix erzeugen- häufig als Initialwert verwendet, macht gar nichts wenn auf Vektor / MatrixD3DXMATRIX* 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

Page 15: Trigonometrische Funktionen Runtime - Library - Funktionen sin oder cos auf Berechnung von double ausgelegt Einfache Genauigkeit float durch funktionale.

-> Multiplikation, Produkt zweier MatrizenD3DXMATRIX* 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 KoordinatenachsenD3DXMATRIX* 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

Page 16: Trigonometrische Funktionen Runtime - Library - Funktionen sin oder cos auf Berechnung von double ausgelegt Einfache Genauigkeit float durch funktionale.

-> Matrix, die Vektoren um Winkel in alle drei Koordinatenrichtungen kippt

- Yaw: Rechts - Links - Drehen- Pitch: Auf - Ab- Roll: Rechts - Links - NeigenD3DXMATRIX* 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)

Page 17: Trigonometrische Funktionen Runtime - Library - Funktionen sin oder cos auf Berechnung von double ausgelegt Einfache Genauigkeit float durch funktionale.

-> Erzeugung von Projektionsmatrizen- Matrix für orthogonale Projektion in z-Richtung in einem linkshändischen

KoordinatensystemD3DXMATRIX* 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 ProjektionD3DXMATRIX* 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)

Page 18: Trigonometrische Funktionen Runtime - Library - Funktionen sin oder cos auf Berechnung von double ausgelegt Einfache Genauigkeit float durch funktionale.

-> 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)

Page 19: Trigonometrische Funktionen Runtime - Library - Funktionen sin oder cos auf Berechnung von double ausgelegt Einfache Genauigkeit float durch funktionale.

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

Page 20: Trigonometrische Funktionen Runtime - Library - Funktionen sin oder cos auf Berechnung von double ausgelegt Einfache Genauigkeit float durch funktionale.

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

Page 21: Trigonometrische Funktionen Runtime - Library - Funktionen sin oder cos auf Berechnung von double ausgelegt Einfache Genauigkeit float durch funktionale.

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

Page 22: Trigonometrische Funktionen Runtime - Library - Funktionen sin oder cos auf Berechnung von double ausgelegt Einfache Genauigkeit float durch funktionale.

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

Page 23: Trigonometrische Funktionen Runtime - Library - Funktionen sin oder cos auf Berechnung von double ausgelegt Einfache Genauigkeit float durch funktionale.

• Material: Textur mit Materialeigenschaften

• In DirectX: Mesh als Datenstruktur

• Dateiformat für Meshes: x-Format .x

• Erstellung über 3D Modeller

Page 24: Trigonometrische Funktionen Runtime - Library - Funktionen sin oder cos auf Berechnung von double ausgelegt Einfache Genauigkeit float durch funktionale.