ang_to_matrix(ANGLE* angle, float* matrix)
ang_for_matrix(ANGLE* angle, float* matrix)
LC Konvertiert einen Eulerwinkel in eine float4x4-DirectX-Drehungsmatrix und umgekehrt. Läßt sich dazu verwenden, Entities um Drehungsmatritzen, die von anderen Softwarepaketen, wie etwa Physik-Engines, empfangen wurden, zu drehen.
Parameter:
angle - pan/tilt/roll-Eulerwinkel
matrix - Pointer auf eine float[16]-Drehungsmatrix oder eine D3DXMATRIX*.
Geschwindigkeit:
Mittel
Bemerkungen:
- Aufgrund der Vieldeutigkeit von Eulerwinkeln (der Euloerwinkel (0,90,0) ist beispielsweise derselbe wie (180,90,180)), garantiert das Konvertieren eines Winkels in eine Matrix und zurück nicht, dass das Ergebnis dieselben Winkelwerte hat. Allerdings ist im Ergebnis dieselbe Objektausrichtung garantiert.
- Die Funktion ang_to_matrix generiert eine 4x4 DirectX-Welttransformatrionsmatrix zur Vektordrehung in DirectX-Koordinaten d.h.: mit vertauschten y- und z-Achsen. Diese Matrix läßt sich für Drehungen in Shadern verwenden.
Algorithmus:
matrix[0][0] = cos(tilt)*cos(pan);
matrix[0][2] = cos(tilt)*sin(pan);
matrix[0][1] = sin(tilt);
matrix[0][3] = 0;
matrix[1][0] = -cos(roll)*sin(tilt)*cos(pan)+sin(roll)*sin(pan);
matrix[1][1] = cos(roll)*cos(tilt);
matrix[1][2] = -cos(roll)*sin(tilt)*sin(pan)-sin(roll)*cos(pan);
matrix[1][3] = 0;
matrix[2][0] = -sin(roll)*sin(tilt)*cos(pan)-cos(roll)*sin(pan);
matrix[2][1] = sin(roll)*cos(tilt);
matrix[2][2] = cos(roll)*cos(pan)-sin(roll)*sin(tilt)*sin(pan);
matrix[2][3] = 0;
matrix[3][0] = 0;
matrix[3][1] = 0;
matrix[3][2] = 0;
matrix[3][3] = 1;
Beispiele (lite-C):
...
#include <d3d9.h>
// calculate the difference between two angles
function ang_from_1_to_2(ANGLE *a,ANGLE *a1,ANGLE *a2)
{
D3DXMATRIX m1,m2,m2i,m;
ang_to_matrix(a1,&m1);
ang_to_matrix(a2,&m2);
D3DXMatrixTranspose(&m2i,&m2);
D3DXMatrixMultiply(&m,&m2i,&m1);
ang_for_matrix(a,&m);
}
Siehe auch:
vec_to_angle,
vec_rotate,
ang_rotate, ang_for_axis, ang_diff, view_to_matrix
► latest
version online