@Test public void testReflect() { final Plane plane1 = new Plane(Vector3.UNIT_X, 5.0); assertEquals(new Vector3(), plane1.reflectVector(new Vector3(), new Vector3())); assertEquals(new Vector3(-1, 0, 0), plane1.reflectVector(new Vector3(1, 0, 0), null)); assertEquals(new Vector3(-1, 1, 1).normalizeLocal(), plane1.reflectVector(new Vector3(1, 1, 1).normalizeLocal(), null)); assertEquals(new Vector3(-3, 2, -1).normalizeLocal(), plane1.reflectVector(new Vector3(3, 2, -1).normalizeLocal(), null)); final Plane plane2 = new Plane(Vector3.UNIT_Z, 1.0); assertEquals(new Vector3(), plane2.reflectVector(new Vector3(), new Vector3())); assertEquals(new Vector3(0, 0, -1), plane2.reflectVector(new Vector3(0, 0, 1), null)); assertEquals(new Vector3(1, 1, -1).normalizeLocal(), plane2.reflectVector(new Vector3(1, 1, 1).normalizeLocal(), null)); assertEquals(new Vector3(3, 2, 1).normalizeLocal(), plane2.reflectVector(new Vector3(3, 2, -1).normalizeLocal(), null)); } }
@Override public void apply(final double dt, final Particle particle, final int index) { // Is particle alive, AND "under" our floor? if (particle.getStatus() == Particle.Status.Alive && _floor.pseudoDistance(particle.getPosition()) <= 0) { final Vector3 tempVect1 = Vector3.fetchTempInstance(); final double scale = particle.getVelocity().length(); tempVect1.set(particle.getVelocity()).divideLocal(scale); // normalize // Is the particle moving further into the floor? if (_floor.getNormal().smallestAngleBetween(tempVect1) > MathUtils.HALF_PI) { // reflect our velocity vector across the floor plane _floor.reflectVector(tempVect1, tempVect1); // apply the "bounciness" factor tempVect1.multiplyLocal(scale * _bounciness); // write back to particle particle.setVelocity(tempVect1); } Vector3.releaseTempInstance(tempVect1); } }
@Override public void apply(final double dt, final Particle particle, final int index) { // Is particle alive, AND "under" our floor? if (particle.getStatus() == Particle.Status.Alive && _floor.pseudoDistance(particle.getPosition()) <= 0) { final Vector3 tempVect1 = Vector3.fetchTempInstance(); final double scale = particle.getVelocity().length(); tempVect1.set(particle.getVelocity()).divideLocal(scale); // normalize // Is the particle moving further into the floor? if (_floor.getNormal().smallestAngleBetween(tempVect1) > MathUtils.HALF_PI) { // reflect our velocity vector across the floor plane _floor.reflectVector(tempVect1, tempVect1); // apply the "bounciness" factor tempVect1.multiplyLocal(scale * _bounciness); // write back to particle particle.setVelocity(tempVect1); } Vector3.releaseTempInstance(tempVect1); } }