public static Quaternion operator *(Quaternion q1, Quaternion q2)
{
if(q1 == null) return null;
if(q2 == null) return null;
Vector v1 = new Vector(q1.x, q1.y, q1.z);
Vector v2 = new Vector(q2.x, q2.y, q2.z);
double angle = ((q1.w * q2.w) - Vector.Dot(v1, v2));
Vector cross = Vector.Cross(v1, v2);
v1 *= q2.w;
v2 *= q1.w;
Quaternion result = new Quaternion(angle,
(v1.x + v2.x + cross.x),
(v1.y + v2.y + cross.y),
(v1.z + v2.z + cross.z)
);
return result;
}