/** * Sets the values of this quaternion to the values represented by a given angle and axis of rotation. Note that * this method creates an object, so use fromAngleNormalAxis if your axis is already normalized. If axis == 0,0,0 * the quaternion is set to identity. * * @param angle * the angle to rotate (in radians). * @param axis * the axis of rotation. * @return this quaternion for chaining * @throws NullPointerException * if axis is null */ public Quaternion fromAngleAxis(final double angle, final ReadOnlyVector3 axis) { final Vector3 temp = Vector3.fetchTempInstance(); final Quaternion quat = fromAngleNormalAxis(angle, axis.normalize(temp)); Vector3.releaseTempInstance(temp); return quat; }
/** * Sets the values of this quaternion to the values represented by a given angle and axis of rotation. Note that * this method creates an object, so use fromAngleNormalAxis if your axis is already normalized. If axis == 0,0,0 * the quaternion is set to identity. * * @param angle * the angle to rotate (in radians). * @param axis * the axis of rotation. * @return this quaternion for chaining * @throws NullPointerException * if axis is null */ public Quaternion fromAngleAxis(final double angle, final ReadOnlyVector3 axis) { final Vector3 temp = Vector3.fetchTempInstance(); final Quaternion quat = fromAngleNormalAxis(angle, axis.normalize(temp)); Vector3.releaseTempInstance(temp); return quat; }
@Test public void testMultiply() { final Quaternion quat1 = new Quaternion(0.5, 1, 2, 3); final Quaternion quat2 = new Quaternion(); assertEquals(new Quaternion(1, 2, 4, 6), quat1.multiply(2, null)); assertEquals(new Quaternion(2, 4, 8, 12), quat1.multiply(4, quat2)); assertEquals(new Quaternion(1, 2, 4, 6), quat1.multiplyLocal(2)); quat1.fromAngleNormalAxis(MathUtils.QUARTER_PI, Vector3.UNIT_Y); quat1.multiply(quat1, quat2); final ReadOnlyVector3 vec = Vector3.UNIT_Z; assertTrue(Math.abs(Vector3.UNIT_X.distance(quat2.apply(vec, null))) <= Quaternion.ALLOWED_DEVIANCE); quat1.multiplyLocal(quat1.getX(), quat1.getY(), quat1.getZ(), quat1.getW()); assertTrue(Math.abs(Vector3.UNIT_X.distance(quat1.apply(vec, null))) <= Quaternion.ALLOWED_DEVIANCE); quat2.fromAngleNormalAxis(MathUtils.HALF_PI, Vector3.UNIT_Y); quat1.multiplyLocal(quat2); assertTrue(Math.abs(Vector3.NEG_UNIT_Z.distance(quat1.apply(vec, null))) <= Quaternion.ALLOWED_DEVIANCE); quat1.multiplyLocal(new Matrix3().applyRotationY(MathUtils.HALF_PI)); assertTrue(Math.abs(Vector3.NEG_UNIT_X.distance(quat1.apply(vec, null))) <= Quaternion.ALLOWED_DEVIANCE); }
@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); }
final ReadOnlyVector3 norm = triModel.getNormal(); if (orient != 0) { tempQuat.fromAngleNormalAxis(orient, norm);
final ReadOnlyVector3 norm = triModel.getNormal(); if (orient != 0) { tempQuat.fromAngleNormalAxis(orient, norm);