/** * @param worldVertices * an array of vectors describing a polygon * @return the distance from our origin to the primitive or POSITIVE_INFINITY if we do not intersect. */ @Override public double getDistanceToPrimitive(final Vector3[] worldVertices) { // Intersection test final Vector3 intersect = Vector3.fetchTempInstance(); try { if (intersects(worldVertices, intersect)) { return getOrigin().distance(intersect); } } finally { Vector3.releaseTempInstance(intersect); } return Double.POSITIVE_INFINITY; }
@Override public Ray3 clone() { return new Ray3(this); }
/** * @param polygonVertices * @param locationStore * @return true if this ray intersects a polygon described by the given vertices. */ @Override public boolean intersects(final Vector3[] polygonVertices, final Vector3 locationStore) { if (polygonVertices.length == 3) { // TRIANGLE return intersectsTriangle(polygonVertices[0], polygonVertices[1], polygonVertices[2], locationStore); } else if (polygonVertices.length == 4) { // QUAD return intersectsQuad(polygonVertices[0], polygonVertices[1], polygonVertices[2], polygonVertices[3], locationStore); } // TODO: Add support for line and point return false; }
@Test public void testData() { final Ray3 ray = new Ray3(); assertEquals(Vector3.UNIT_Z, ray.getDirection()); assertEquals(Vector3.ZERO, ray.getOrigin()); ray.setDirection(Vector3.NEG_UNIT_X); assertEquals(Vector3.NEG_UNIT_X, ray.getDirection()); ray.setOrigin(Vector3.ONE); assertEquals(Vector3.ONE, ray.getOrigin()); final Ray3 ray2 = new Ray3(ray); assertEquals(Vector3.NEG_UNIT_X, ray2.getDirection()); assertEquals(Vector3.ONE, ray2.getOrigin()); ray.set(new Ray3()); assertEquals(Vector3.UNIT_Z, ray.getDirection()); assertEquals(Vector3.ZERO, ray.getOrigin()); }
public Vector3 getTerrainIntersection(final ReadOnlyTransform terrainWorldTransform, final ReadOnlyVector3 eyePos, final ReadOnlyRay3 pickRay, final Vector3 store, final Vector3 normalStore) { _workRay.setOrigin(terrainWorldTransform.applyInverse(pickRay.getOrigin(), null)); _workRay.setDirection(terrainWorldTransform.applyInverseVector(pickRay.getDirection(), null).normalizeLocal()); terrainWorldTransform.applyInverse(eyePos, _workEyePos); int index = findClipIndex(_workRay.getOrigin().subtract(_workEyePos, null)); final Vector3 loc = new Vector3(_workRay.getDirection()).multiplyLocal(dist).addLocal(_workRay.getOrigin()); final int newIndex = findClipIndex(loc.subtract(_workEyePos, null)); _workRay.setOrigin(loc); index = newIndex; tracer = _tracers.get(index);
@Override public void startWalk(final Ray3 walkRay) { _walkRay.set(walkRay); final ReadOnlyVector3 direction = _walkRay.getDirection(); final Vector3 start = _walkRay.getOrigin().subtract(_gridOrigin, null);
_rayLocation.set(_walkRay.getDirection()).multiplyLocal(_totalTravel).addLocal(_walkRay.getOrigin());
result = new Ray3(); getWorldCoordinates(pos, 0, origin); getWorldCoordinates(pos, 0.3, direction).subtractLocal(origin).normalizeLocal(); result.setOrigin(origin); result.setDirection(direction); Vector2.releaseTempInstance(pos); Vector3.releaseTempInstance(origin);
final double triDistanceSq = ray.getDistanceToPrimitive(vertices); distances[i] = triDistanceSq; positions[i] = ray.getDirection().multiply(distances[i], new Vector3()).addLocal(ray.getOrigin());
final ReadOnlyRay3 pickRayA = new Ray3(new Vector3(2, 2, 10), new Vector3(0, 0, -1)); final ReadOnlyRay3 pickRayB = new Ray3(new Vector3(2, 4, 10), new Vector3(0, 0, -1)); assertTrue(pickRayA.intersectsQuad(v0, v1, v2, v3, intersectionPoint)); assertTrue(pickRayB.intersectsQuad(v0, v1, v2, v3, intersectionPoint)); final Ray3 pickRay2 = new Ray3(new Vector3(-1, 0, 10), new Vector3(0, 0, -1)); assertFalse(pickRay2.intersectsQuad(v0, v1, v2, v3, intersectionPoint)); assertTrue(Double.POSITIVE_INFINITY == pickRay2.getDistanceToPrimitive(new Vector3[] { v0, v1, v2, v3 })); assertFalse(pickRay2.intersects(new Vector3[] { v0, v1 }, null)); assertFalse(new Ray3(new Vector3(0, 0, -1), Vector3.UNIT_Y).intersectsQuadPlanar(v0, v1, v2, v3, intersectionPoint)); intersectionPoint = new Vector3();
Ray3 pickRay = new Ray3(new Vector3(0.5, -0.5, 3), new Vector3(0, 0, -1)); assertTrue(pickRay.intersectsTriangle(v0, v1, v2, intersectionPoint)); pickRay = new Ray3(new Vector3(0, -1, 3), new Vector3(0, 0, -1)); assertTrue(pickRay.intersectsTriangle(v0, v1, v2, intersectionPoint)); pickRay = new Ray3(new Vector3(0, 0, 3), new Vector3(0, 0, -1)); assertTrue(pickRay.intersectsTriangle(v0, v1, v2, intersectionPoint)); pickRay = new Ray3(new Vector3(+1, 0, 3), new Vector3(0, 0, -1)); assertTrue(pickRay.intersectsTriangle(v0, v1, v2, intersectionPoint)); pickRay = new Ray3(new Vector3(-1, -1, 3), new Vector3(0, 0, -1)); assertTrue(pickRay.intersectsTriangle(v0, v1, v2, intersectionPoint)); pickRay = new Ray3(new Vector3(+1, -1, 3), new Vector3(0, 0, -1)); assertTrue(pickRay.intersectsTriangle(v0, v1, v2, intersectionPoint)); pickRay = new Ray3(new Vector3(1, 1, 3), new Vector3(0, 0, -1)); assertTrue(pickRay.intersectsTriangle(v0, v1, v2, intersectionPoint)); pickRay = new Ray3(new Vector3(0, -1.1, 3), new Vector3(0, 0, -1)); assertFalse(pickRay.intersectsTriangle(v0, v1, v2, intersectionPoint)); pickRay = new Ray3(new Vector3(-0.1, 0.1, 3), new Vector3(0, 0, -1)); assertFalse(pickRay.intersectsTriangle(v0, v1, v2, intersectionPoint)); pickRay = new Ray3(new Vector3(+1.1, 0, 3), new Vector3(0, 0, -1)); assertFalse(pickRay.intersectsTriangle(v0, v1, v2, intersectionPoint));
@Test public void testValid() { final Ray3 ray1 = new Ray3(new Vector3(0, 0, 0), new Vector3(0, 0, 1)); final Ray3 ray2 = new Ray3(new Vector3(Double.POSITIVE_INFINITY, 0, 0), new Vector3(0, 0, 1)); final Ray3 ray3 = new Ray3(new Vector3(0, 0, 0), new Vector3(Double.POSITIVE_INFINITY, 0, 1)); assertTrue(Ray3.isValid(ray1)); assertFalse(Ray3.isValid(ray2)); assertFalse(Ray3.isValid(ray3)); assertFalse(Ray3.isValid(null)); // couple if equals validity tests assertEquals(ray1, ray1); assertFalse(ray1.equals(null)); assertFalse(ray1.equals(new Vector3())); // throw in a couple pool accesses for coverage final Ray3 ray4 = Ray3.fetchTempInstance(); ray4.set(ray1); assertEquals(ray1, ray4); assertNotSame(ray1, ray4); Ray3.releaseTempInstance(ray4); // cover more of equals assertFalse(ray1.equals(new Ray3(Vector3.ZERO, Vector3.NEG_UNIT_X))); }
/** * @param pointA * @param pointB * @param pointC * @param locationStore * if not null, and this ray intersects, the point of intersection is calculated and stored in this * Vector3 * @return true if this ray intersects a triangle formed by the given three points. * @throws NullPointerException * if any of the points are null. */ @Override public boolean intersectsTriangle(final ReadOnlyVector3 pointA, final ReadOnlyVector3 pointB, final ReadOnlyVector3 pointC, final Vector3 locationStore) { return intersects(pointA, pointB, pointC, locationStore, false); }
@Override public IntersectionRecord intersectsPrimitivesWhere(final Ray3 ray) { if (_picker != null) { final Vector3 normalStore = new Vector3(); final Vector3 intersect = _picker.getTerrainIntersection(getWorldTransform(), _terrainCamera.getLocation(), ray, null, normalStore); if (intersect != null) { final double distance = intersect.distance(ray.getOrigin()); final IntersectionRecord record = new IntersectionRecord(new double[] { distance }, new Vector3[] { intersect }, new Vector3[] { normalStore }, null); return record; } } return null; }
Ray3 pickRay = new Ray3(new Vector3(0, 3, 0), new Vector3(0, 0, 1)); assertFalse(pickRay.intersectsPlane(plane, intersectionPoint)); pickRay = new Ray3(new Vector3(0, 3, 0), new Vector3(0, 1, 0)); assertFalse(pickRay.intersectsPlane(plane, intersectionPoint)); pickRay = new Ray3(new Vector3(0, 2, 0), new Vector3(0, 1, 0)); assertFalse(pickRay.intersectsPlane(plane, intersectionPoint)); pickRay = new Ray3(new Vector3(0, 1, 0), new Vector3(0, 1, 0)); assertTrue(pickRay.intersectsPlane(plane, intersectionPoint)); pickRay = new Ray3(new Vector3(0, 0, 0), new Vector3(1, 0, 0)); assertFalse(pickRay.intersectsPlane(plane, intersectionPoint)); pickRay = new Ray3(new Vector3(0, -3, 0), new Vector3(0, 0, 1)); assertFalse(pickRay.intersectsPlane(plane, intersectionPoint)); pickRay = new Ray3(new Vector3(0, 3, 0), new Vector3(0, -1, 0)); assertTrue(pickRay.intersectsPlane(plane, intersectionPoint)); pickRay = new Ray3(new Vector3(0, -3, 0), new Vector3(1, 1, 1)); assertTrue(pickRay.intersectsPlane(plane, intersectionPoint)); pickRay = new Ray3(new Vector3(0, -3, 0), new Vector3(-1, -1, -1)); assertFalse(pickRay.intersectsPlane(plane, intersectionPoint)); pickRay = new Ray3(new Vector3(0, 0, 0), new Vector3(1, -1, 1)); assertFalse(pickRay.intersectsPlane(plane, intersectionPoint));
@Test public void testDistance() { final Ray3 ray1 = new Ray3(); assertTrue(25.0 == ray1.distanceSquared(new Vector3(0, 5, 3), null)); final Vector3 store = new Vector3(); assertTrue(9.0 == ray1.distanceSquared(new Vector3(0, 3, 3), store)); assertEquals(new Vector3(0, 0, 3), store); assertTrue(18.0 == ray1.distanceSquared(new Vector3(0, 3, -3), store)); assertEquals(new Vector3(0, 0, 0), store); }
if (!_workRay.intersectsTriangle(_gridTriA.getA(), _gridTriA.getB(), _gridTriA.getC(), store)) { final boolean intersects = _workRay.intersectsTriangle(_gridTriB.getA(), _gridTriB.getB(), _gridTriB.getC(), store); if (intersects && normalStore != null) {
public Vector3 getTerrainIntersection(final ReadOnlyTransform terrainWorldTransform, final ReadOnlyVector3 eyePos, final ReadOnlyRay3 pickRay, final Vector3 store, final Vector3 normalStore) { _workRay.setOrigin(terrainWorldTransform.applyInverse(pickRay.getOrigin(), null)); _workRay.setDirection(terrainWorldTransform.applyInverseVector(pickRay.getDirection(), null).normalizeLocal()); terrainWorldTransform.applyInverse(eyePos, _workEyePos); int index = findClipIndex(_workRay.getOrigin().subtract(_workEyePos, null)); final Vector3 loc = new Vector3(_workRay.getDirection()).multiplyLocal(dist).addLocal(_workRay.getOrigin()); final int newIndex = findClipIndex(loc.subtract(_workEyePos, null)); _workRay.setOrigin(loc); index = newIndex; tracer = _tracers.get(index);
@Override public void startWalk(final Ray3 walkRay) { _walkRay.set(walkRay); final ReadOnlyVector3 direction = _walkRay.getDirection(); final Vector3 start = _walkRay.getOrigin().subtract(_gridOrigin, null);