From the function definition we can see that, while the documentation says “It IS safe for this and res to be the same object” this is NOT the case!

/**

* `mult`

multiplies this quaternion by a parameter quaternion.

* The result is returned as a new quaternion. It should be noted that

* quaternion multiplication is not commutative so q * p != p * q.

*

* It IS safe for q and res to be the same object.

* It IS safe for this and res to be the same object.

*

* @param q

* the quaternion to multiply this quaternion by.

* @param res

* the quaternion to store the result in.

* @return the new quaternion.

*/

public Quaternion mult(Quaternion q, Quaternion res) {

if (res == null) {

res = new Quaternion();

}

float qw = q.w, qx = q.x, qy = q.y, qz = q.z;

res.x = x * qw + y * qz - z * qy + w * qx;

res.y = -x * qz + y * qw + z * qx + w * qy;

res.z = x * qy - y * qx + z * qw + w * qz;

res.w = -x * qx - y * qy - z * qz + w * qw;

return res;

}