Ejemplo n.º 1
0
// Multiplication
Quat4& Quat4::operator *= (Quat4& B)
{
	Quat4 A = Quat4(this);

	q[0] = A[0]*B[0] - A[1]*B[1] - A[2]*B[2] - A[3]*B[3];
	q[1] = A[0]*B[1] + A[1]*B[0] + A[2]*B[3] - A[3]*B[2];
	q[2] = A[0]*B[2] - A[1]*B[3] + A[2]*B[0] + A[3]*B[1];
	q[3] = A[0]*B[3] + A[1]*B[2] - A[2]*B[1] + A[3]*B[0];

	return *this;
}
Ejemplo n.º 2
0
Quat4 Quat4::fromMatrix(float m00, float m01, float m02,
                        float m10, float m11, float m12,
                        float m20, float m21, float m22) {
    // taken from http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm
    float tr = m00 + m11 + m22;

    float w,x,y,z;

    if (tr > 0) {
        float S = (float)sqrt(tr + 1.0) * 2; // S=4*qw
        w = 0.25f * S;
        x = (m21 - m12) / S;
        y = (m02 - m20) / S;
        z = (m10 - m01) / S;
    } else if ((m00 > m11) & (m00 > m22)) {
        float S = (float)sqrt(1.0 + m00 - m11 - m22) * 2; // S=4*qx
        w = (m21 - m12) / S;
        x = 0.25f * S;
        y = (m01 + m10) / S;
        z = (m02 + m20) / S;
    } else if (m11 > m22) {
        float S = (float)sqrt(1.0 + m11 - m00 - m22) * 2; // S=4*qy
        w = (m02 - m20) / S;
        x = (m01 + m10) / S;
        y = 0.25f * S;
        z = (m12 + m21) / S;
    } else {
        float S = (float)sqrt(1.0 + m22 - m00 - m11) * 2; // S=4*qz
        w = (m10 - m01) / S;
        x = (m02 + m20) / S;
        y = (m12 + m21) / S;
        z = 0.25f * S;
    }

    return Quat4(w,x,y,z);
}
Ejemplo n.º 3
0
Quat4 Quat4::operator * (Quat4& B)
{
	Quat4 A = Quat4(this);
	A *= B;
	return A;
}