Vektor um beliebige Achse rotieren
-
wie der Titel schon sagt möchte ich gerne einen Vektor um eine beliebige Achse drehen. Mir ist bekannt daß es hierfür in Direct X entsprechende Funktionen gibt.
Diese habe ich auch schon verdendet, z.B. in dieser Weise:[/cpp]
D3DXMATRIX rollMatrix;
D3DXMatrixIdentity(&rollMatrix);
D3DXMatrixRotationAxis(&rollMatrix, &vLook, D3DXToRadian(froll));
D3DXVec3TransformCoord(&vRight, &vRight, &rollMatrix);
D3DXVec3TransformCoord(&vUp, &vUp, &rollMatrix);Das funktioniert auch. Aus verschiedenen Gründen wollte ich den Code für die Rotation aber einmal selbst umsetzen. In der Literatur und auch im Internet findet man hierzu entsprechende Anleitungen. Daraus sind bei mir nun folgende Funktionen entstanden:
D3DXDMATRIX *D3DXDMatrixRotationAxis(D3DXDMATRIX *pMatrix, D3DXDVECTOR3 *vDVec, double dAngle)
{
double c = cos(dAngle);
double s = sin(dAngle);
double C = 1 - c;//(n.x*n.x)*(1-cos)+cos,n.x*n.y*(1-cos)+n.z*sin,n.x*n.z*(1-cos)-n.y*sin
pMatrix->_11 = vDVec->x * vDVec->x * C + c;
pMatrix->_12 = vDVec->x * vDVec->y * C + vDVec->z * s;
pMatrix->_13 = vDVec->x * vDVec->z * C - vDVec->y * s;
pMatrix->_14 = 0.0;//n.x*n.y*(1-cos)-n.z*sin,(n.y*n.y)(1-cos)+cos,n.y*n.z*(1-cos)+n.xsin
pMatrix->_21 = vDVec->y * vDVec->x * C - vDVec->z * s;
pMatrix->_22 = vDVec->y * vDVec->y * C + c;
pMatrix->_23 = vDVec->y * vDVec->z * C + vDVec->x * s;
pMatrix->_24 = 0.0;//n.x*n.z*(1-cos)+n.y*sin,n.y*n.z*(1-cos)-n.x*sin,(n.z*n.z)*(1-cos)+cos
pMatrix->_31 = vDVec->z * vDVec->x * C + vDVec->y * s;
pMatrix->_32 = vDVec->z * vDVec->y * C + vDVec->x * s;
pMatrix->_33 = vDVec->z * vDVec->z * C + c;
pMatrix->_34 = 0.0;pMatrix->_41 = 0.0;
pMatrix->_42 = 0.0;
pMatrix->_43 = 0.0;
pMatrix->_44 = 0.0;return pMatrix;
}D3DXDVECTOR3 *D3DXDVec3Transform(D3DXDMATRIX *pMat, D3DXDVECTOR3 *pVec)
{
D3DXDVECTOR3 vTemp;vTemp.x = (pMat->_11 * pVec->x) + (pMat->_21 * pVec->y) + (pMat->_31 * pVec->z);
vTemp.y = (pMat->_12 * pVec->x) + (pMat->_22 * pVec->y) + (pMat->_32 * pVec->z);
vTemp.z = (pMat->_13 * pVec->x) + (pMat->_23 * pVec->y) + (pMat->_33 * pVec->z);pVec->x = vTemp.x;
pVec->y = vTemp.y;
pVec->z = vTemp.z;return pVec;
}
[cpp]aber leider funktioniert die Rotation mit diesen Funktionen nicht korrekt. Hat hier jemand eine Ahnung wo da der Fehler liegt?
-
Gibst du angle in Grad an? Mal probiert das in Radianten umzurechnen? Ansonsten mal hier alter Code von mir, vielleicht hilft der:
template<typename T> BlockMatrix3<T> rotate(GeometricVector3<T> n, T angle) { T rad = make_rad(angle); T crot = cos(rad); T srot = sin(rad); BlockMatrix3<T> mat (GeometricVector3<T> (crot + (n[0] * n[0]) * (1 - crot), n[0] * n[1] * (1 - crot) - n[2] * srot, n[0] * n[2] * (1 - crot) + n[1] * srot), GeometricVector3<T> (n[1] * n[0] * (1 - crot) + n[2] * srot, crot + (n[1] * n[1]) * (1 - crot), n[1] * n[2] * (1 - crot) - n[0] * srot), GeometricVector3<T> (n[2] * n[1] * (1 - crot) - n[1] * srot, n[2] * n[1] * (1 - crot) + n[0] * srot, crot + (n[2] * n[2]) * (1 - crot))); return mat; }
-
erstmal sorry wegen der Formatierung, habe wohl einmal zuviel auf den C/C++-Code Button gedrückt und dann falsch editiert.
Zu der Antwort: Der dAngle-Wert ist nicht in Grad, sollte also eigentlich stimmen. Der von dir angegebene Code ist nicht ganz identisch mit dem von mir verwendeten, ich werde mal ausprobieren ob es damit funktioniert.
Danke für deinen Beitrag.