/** * @return this quaternion, modified to be unit length, for chaining. */ public Quaternion normalizeLocal() { final double n = 1.0 / magnitude(); final double x = getX() * n; final double y = getY() * n; final double z = getZ() * n; final double w = getW() * n; return set(x, y, z, w); }
/** * @return this quaternion, modified to be unit length, for chaining. */ public Quaternion normalizeLocal() { final double n = 1.0 / magnitude(); final double x = getX() * n; final double y = getY() * n; final double z = getZ() * n; final double w = getW() * n; return set(x, y, z, w); }
@Test public void testNormalize() { final Quaternion quat = new Quaternion(0, 1, 2, 3); final Quaternion quat2 = quat.normalize(null); assertEquals(quat2, quat.normalizeLocal()); assertTrue(Math.abs(1 - quat.magnitude()) <= MathUtils.EPSILON); assertTrue(Math.abs(1 - quat2.magnitude()) <= MathUtils.EPSILON); }
/** * @param store * the Quaternion to store the result in. if null, a new one is created. * @return a new quaternion that represents a unit length version of this Quaternion. */ @Override public Quaternion normalize(final Quaternion store) { Quaternion result = store; if (result == null) { result = new Quaternion(); } final double n = 1.0 / magnitude(); final double x = getX() * n; final double y = getY() * n; final double z = getZ() * n; final double w = getW() * n; return result.set(x, y, z, w); }
/** * @param store * the Quaternion to store the result in. if null, a new one is created. * @return a new quaternion that represents a unit length version of this Quaternion. */ @Override public Quaternion normalize(final Quaternion store) { Quaternion result = store; if (result == null) { result = new Quaternion(); } final double n = 1.0 / magnitude(); final double x = getX() * n; final double y = getY() * n; final double z = getZ() * n; final double w = getW() * n; return result.set(x, y, z, w); }
@Test public void testEulerAngles() { final Quaternion quat = new Quaternion().fromEulerAngles(new double[] { MathUtils.HALF_PI, 0, 0 }); assertTrue(1.0 == quat.magnitude()); assertTrue(Math.abs(Vector3.NEG_UNIT_Z.distance(quat.apply(Vector3.UNIT_X, null))) <= MathUtils.EPSILON); quat.fromEulerAngles(0, -MathUtils.HALF_PI, 0); assertTrue(1.0 == quat.magnitude()); assertTrue(Math.abs(Vector3.NEG_UNIT_Y.distance(quat.apply(Vector3.UNIT_X, null))) <= MathUtils.EPSILON); quat.fromEulerAngles(0, 0, MathUtils.HALF_PI); assertTrue(1.0 == quat.magnitude()); assertTrue(Math.abs(Vector3.UNIT_Z.distance(quat.apply(Vector3.UNIT_Y, null))) <= MathUtils.EPSILON); quat.fromEulerAngles(0, MathUtils.HALF_PI, 0); double[] angles = quat.toEulerAngles(null); final Quaternion quat2 = new Quaternion().fromEulerAngles(angles); assertEquals(quat, quat2); quat.fromEulerAngles(0, -MathUtils.HALF_PI, 0); angles = quat.toEulerAngles(null); quat2.fromEulerAngles(angles); assertEquals(quat, quat2); quat.fromEulerAngles(0, 0, MathUtils.HALF_PI); angles = quat.toEulerAngles(null); quat2.fromEulerAngles(angles); assertEquals(quat, quat2); }
@Test public void testAngleAxis() { final Quaternion quat = new Quaternion().fromAngleAxis(MathUtils.HALF_PI, new Vector3(2, 0, 0)); final Quaternion quat2 = new Quaternion().fromAngleNormalAxis(MathUtils.HALF_PI, new Vector3(1, 0, 0)); assertEquals(quat2, quat); assertTrue(1 - quat.magnitude() <= MathUtils.EPSILON); assertEquals(quat.apply(Vector3.ONE, null), quat2.apply(Vector3.ONE, null)); assertTrue(Math.abs(new Vector3(0, -1, 0).distance(quat.apply(new Vector3(0, 0, 1), null))) <= MathUtils.EPSILON); assertEquals(Quaternion.IDENTITY, new Quaternion(1, 2, 3, 4).fromAngleAxis(MathUtils.HALF_PI, new Vector3(0, 0, 0))); final Vector3 axisStore = new Vector3(); double angle = quat.toAngleAxis(axisStore); assertEquals(quat, new Quaternion().fromAngleAxis(angle, axisStore)); quat.set(0, 0, 0, 0); angle = quat.toAngleAxis(axisStore); assertTrue(0.0 == angle); assertEquals(Vector3.UNIT_X, axisStore); }