180 likes | 341 Vues
Geometrie in DirectX: Vektoroperationen. 29.11.2007 Kapitel 3.4.1 – 3.4.3 „Spieleprogrammierung mit DirectX und C++“ Kaiser/Lensing. 1. Trigonometrische Funktionen. sin, cos, tan... berechnen in doppelter Genauigkeit (double) sinf Sinusfunktion (float) cosf Kosinusfunktion (float)
E N D
Geometrie in DirectX:Vektoroperationen 29.11.2007 Kapitel 3.4.1 – 3.4.3 „Spieleprogrammierung mit DirectX und C++“ Kaiser/Lensing
1. Trigonometrische Funktionen • sin, cos, tan... berechnen in doppelter Genauigkeit (double) • sinf Sinusfunktion (float) • cosf Kosinusfunktion (float) • tanf Tangensfunktion (float) • atanf Arcustangensfunktion (float) • D3DX_PI Konstante π
2. Einfacher Vektor typedef struct _D3DVECTOR { float x; float y; float z; } D3DVECTOR; y x z Objekt „D3DVECTOR“ nimmt diese Struktur an
3. DirectX-Vektor typedef struct D3DXVECTOR3 : public D3DVECTOR { public: D3DXVECTOR3( ) { }; D3DXVECTOR3(const float * ); D3DXVECTOR3(const D3DVECTOR& ); D3DXVECTOR3(float x, float y, float z ); 4 Varianten, die Struktur zu erzeugen (uninitialisiert, aus einem Array von Gleitkommazahlen, als Kopie aus einem anderen Vektor, aus drei einzelnen Gleitkommazahlen)
typedef struct D3DXVECTOR3 : public D3DVECTOR { public: operator FLOAT* ( ); operator CONST FLOAT* ( ) const; erlauben einen Cast Vektor -> Array von Gleitkommazahlen sinnvoll z. B. wenn die einzelnen Werte per Schleife / Index ausgelesen werden sollen
typedef struct D3DXVECTOR3 : public D3DVECTOR { public: D3DXVECTOR3& operator += ( const D3DXVECTOR3& ); D3DXVECTOR3& operator -= ( const D3DXVECTOR3& ); D3DXVECTOR3& operator *= ( float ); D3DXVECTOR3& operator /= ( float ); „Operator overloading“: v1 += v2 v1 *= faktor v1 -= v2 v1 /= faktor
typedef struct D3DXVECTOR3 : public D3DVECTOR { public: D3DXVECTOR3 operator + ( const D3DXVECTOR3& ); D3DXVECTOR3 operator - ( const D3DXVECTOR3& ); D3DXVECTOR3 operator * ( float ); D3DXVECTOR3 operator / ( float ); v1 = v2 + v3 v1 = v2 * faktor v1 = v2 - v3 v1 = v2 / faktor
typedef struct D3DXVECTOR3 : public D3DVECTOR { public: D3DXVECTOR3 operator + ( ) const; D3DXVECTOR3 operator - ( ) const; friend D3DXVECTOR3 operator * (float, const struct D3DXVECTOR3& ); Vorzeichen des Vektors positiv setzen +v1 Vorzeichen umkehren -v1 v1 = faktor * v2
typedef struct D3DXVECTOR3 : public D3DVECTOR { public: BOOL operator == (const D3DXVECTOR3& ) const; BOOL operator != (const D3DXVECTOR3& ) const; } D3DXVECTOR3, *LPD3DXVECTOR3; Test auf Gleichheit / Ungleichheit: v1 == v2, v1 != v2 Objekt D3DXVECTOR 3 nimmt diese Struktur an, Objekt LPD3DXVECTOR 3 ist ein Zeiger auf diese Struktur
Zusammenfassung • Zwei neue Datentypen: • D3DXVECTOR3 ein 3D-Vektor • LPD3DXVECTOR3 Zeiger auf einen 3D-Vektor • Operationen mit Vektoren: • v1 += v2 v1 -= v2 v1 *= f v1 /= f • v1 = v2 + v3 v1 = v2 - v3 v1 = v2 * f v1 = v2 / f • v1 = f * v2 • v1 == v2 v1 != v2 • +v1 -v1 • (Array von Fließkommazahlen) v1
4) Vektorfunktionen D3DXVECTOR3* D3DXVec3Add ( pErgebnis, pSummand1, pSummand2 ) D3DXVECTOR3* D3DXVec3Subtract ( pErgebnis, pMinuend, pSubtrahend ) D3DXVECTOR3* D3DXVec3Scale ( pErgebnis, pEingabe, Skalierungsfaktor ) float D3DXVec3Dot ( pVektor1, pVektor2 ) Funktionen synonym zu: v_ergebnis = v1 + v2 v_ergebnis = v1 - v2 v_ergebnis = v1 * f Skalarprodukt
float D3DXVec3Length ( pVektor ) float D3DXVec3LengthSq ( pVektor ) - Rückgabe der Länge des Vektors - Rückgabe der Größe des Längenquadrates über dem Vektor zum Vergleichen der Länge von Vektoren ist Möglichkeit 2 viel schneller, da Wurzelziehen entfällt
D3DXVECTOR3* D3DXVec3Cross ( pErgebnis, pVektor1, pVektor2 ) D3DXVECTOR3* D3DXVec3Lerp ( pErgebnis, pVektor1, pVektor2, Interpolationsfaktor ) - Kreuzprodukt zweier Vektoren - lineare Interpolation zwischen zwei Vektoren zwischen 0 und 1
D3DXVECTOR3* D3DXVec3Minimize ( pErgebnis, pVektor1, pVektor2 ) D3DXVECTOR3* D3DXVec3Maximize ( pErgebnis, pVektor1, pVektor2 ) D3DXVECTOR3* D3DXVec3Normalize ( pErgebnis, pEingabe ) - Minimum der jeweiligen x- / y- / z-Werte kombiniert in neuen Vektor schreiben - Maximum... - einen Vektor normalisieren (selbe Richtung wie alter Vektor, aber Länge = 1)
Zusammenfassung • Vektorfunktionen: • D3DXVec3Add Addition • D3DXVec3Subtract Subtraktion • D3DXVec3Scale Skalieren • D3DXVec3Dot Skalarprodukt • D3DXVec3Cross Kreuzprodukt • D3DXVec3Length Länge • D3DXVec3LengthSq Größe Längenquadrat • D3DXVec3Lerp lineare Interpolation • D3DXVec3Minimize Minima der 3 Richtungsvektoren • D3DXVec3Maximize Maxima der 3 Richtungsvektoren • D3DXVec3Normalize Normieren
Demoprogramm • auf der CD zum Buch, :\Demos\Vektor.exe