не уверен, что это то что надо и что это вообще работает, но попробуй.
Код
void MatrixToQuaternion( tVector* right, tVector* up, tVector* at, float &quaterW, float &quaterX, float &quaterY, float &quaterZ )
{
long double v13; // st7@1
long double v14; // st7@3
long double v15; // st5@5
float v16; // st6@5
float v17; // st7@5
long double v18; // st6@7
int result = 0; // eax@17
float v20; // ST28_8@17
float v21; // ST10_8@17
float v22; // st7@17
float v23; // [sp+10h] [bp-20h]@7
float v24; // [sp+18h] [bp-18h]@9
float v25; // [sp+20h] [bp-10h]@3
v13 = right->X + up->Y + at->Z + 1.0f;
if ( v13 < 0.0f )
v13 = 0.0f;
v25 = (float)sqrt(v13) * 0.5f;
v14 = right->X + 1.0 - up->Y - at->Z;
if ( v14 < 0.0f)
v14 = 0.0f;
v17 = (float)sqrt(v14) * 0.5f;
v16 = 1.0f - right->X;
v15 = up->Y + v16 - at->Z;
if ( v15 < 0.0f )
v15 = 0.0f;
v23 = (float)sqrt(v15) * 0.5f;
v18 = v16 - up->Y + at->Z;
if ( v18 < 0.0f )
v18 = 0.0f;
v24 = (float)sqrt(v18) * 0.5f;
if ( v25 < 0.0f )
v25 = 0.0f;
if ( v17 < 0.0f )
v17 = 0.0f;
if ( v23 < 0.0f )
v23 = 0.0f;
if ( v24 < 0.0f )
v24 = 0.0f;
v20 = (float)_copysign(v17, at->Y - up->Z);
v21 = (float)_copysign(v23, right->Z - at->X);
v22 = (float)_copysign(v24, up->X - right->Y);
quaterW = v25;
quaterX = v20;
quaterY = v21;
quaterZ = v22;
}
void MatrixToQuaternion( MATRIX4X4* matrix, tQuaternionVector* quaternion )
{
MatrixToQuaternion( &matrix->right, &matrix->up, &matrix->at, quaternion->W, quaternion->X, quaternion->Y, quaternion->Z );
}