Search in sources :

Example 21 with Ray

use of com.jme3.math.Ray in project jmonkeyengine by jMonkeyEngine.

the class TestJoystick method pick.

private static CollisionResults pick(Camera cam, Vector2f mouseLoc, Node node) {
    CollisionResults results = new CollisionResults();
    Ray ray = new Ray();
    Vector3f pos = new Vector3f(mouseLoc.x, mouseLoc.y, -1);
    Vector3f dir = new Vector3f(mouseLoc.x, mouseLoc.y, 1);
    dir.subtractLocal(pos).normalizeLocal();
    ray.setOrigin(pos);
    ray.setDirection(dir);
    node.collideWith(ray, results);
    return results;
}
Also used : CollisionResults(com.jme3.collision.CollisionResults) Vector3f(com.jme3.math.Vector3f) Ray(com.jme3.math.Ray)

Example 22 with Ray

use of com.jme3.math.Ray in project jmonkeyengine by jMonkeyEngine.

the class TestDepthOfField method simpleUpdate.

@Override
public void simpleUpdate(float tpf) {
    Vector3f origin = cam.getWorldCoordinates(new Vector2f(settings.getWidth() / 2, settings.getHeight() / 2), 0.0f);
    Vector3f direction = cam.getWorldCoordinates(new Vector2f(settings.getWidth() / 2, settings.getHeight() / 2), 0.3f);
    direction.subtractLocal(origin).normalizeLocal();
    Ray ray = new Ray(origin, direction);
    CollisionResults results = new CollisionResults();
    int numCollisions = terrain.collideWith(ray, results);
    if (numCollisions > 0) {
        CollisionResult hit = results.getClosestCollision();
        fpsText.setText("" + hit.getDistance());
        dofFilter.setFocusDistance(hit.getDistance() / 10.0f);
    }
}
Also used : CollisionResult(com.jme3.collision.CollisionResult) CollisionResults(com.jme3.collision.CollisionResults)

Example 23 with Ray

use of com.jme3.math.Ray in project jmonkeyengine by jMonkeyEngine.

the class TerrainQuad method findPick.

/**
     * Gather the terrain patches that intersect the given ray (toTest).
     * This only tests the bounding boxes
     * @param toTest
     * @param results
     */
public void findPick(Ray toTest, List<TerrainPickData> results) {
    if (getWorldBound() != null) {
        if (getWorldBound().intersects(toTest)) {
            // further checking needed.
            for (int i = 0; i < getQuantity(); i++) {
                if (children.get(i) instanceof TerrainPatch) {
                    TerrainPatch tp = (TerrainPatch) children.get(i);
                    tp.ensurePositiveVolumeBBox();
                    if (tp.getWorldBound().intersects(toTest)) {
                        CollisionResults cr = new CollisionResults();
                        toTest.collideWith(tp.getWorldBound(), cr);
                        if (cr != null && cr.getClosestCollision() != null) {
                            cr.getClosestCollision().getDistance();
                            results.add(new TerrainPickData(tp, cr.getClosestCollision()));
                        }
                    }
                } else if (children.get(i) instanceof TerrainQuad) {
                    ((TerrainQuad) children.get(i)).findPick(toTest, results);
                }
            }
        }
    }
}
Also used : TerrainPickData(com.jme3.terrain.geomipmap.picking.TerrainPickData) CollisionResults(com.jme3.collision.CollisionResults)

Example 24 with Ray

use of com.jme3.math.Ray in project jmonkeyengine by jMonkeyEngine.

the class BresenhamTerrainPicker method getTerrainIntersection.

public Vector3f getTerrainIntersection(Ray worldPick, CollisionResults results) {
    worldPickRay.set(worldPick);
    List<TerrainPickData> pickData = new ArrayList<TerrainPickData>();
    root.findPick(worldPick.clone(), pickData);
    Collections.sort(pickData);
    if (pickData.isEmpty())
        return null;
    workRay.set(worldPick);
    for (TerrainPickData pd : pickData) {
        TerrainPatch patch = pd.targetPatch;
        tracer.getGridSpacing().set(patch.getWorldScale());
        tracer.setGridOrigin(patch.getWorldTranslation());
        workRay.getOrigin().set(worldPick.getDirection()).multLocal(pd.cr.getDistance() - .1f).addLocal(worldPick.getOrigin());
        tracer.startWalk(workRay);
        final Vector3f intersection = new Vector3f();
        final Vector2f loc = tracer.getGridLocation();
        if (tracer.isRayPerpendicularToGrid()) {
            Triangle hit = new Triangle();
            checkTriangles(loc.x, loc.y, workRay, intersection, patch, hit);
            float distance = worldPickRay.origin.distance(intersection);
            CollisionResult cr = new CollisionResult(intersection, distance);
            cr.setGeometry(patch);
            cr.setContactNormal(hit.getNormal());
            results.addCollision(cr);
            return intersection;
        }
        while (loc.x >= -1 && loc.x <= patch.getSize() && loc.y >= -1 && loc.y <= patch.getSize()) {
            //System.out.print(loc.x+","+loc.y+" : ");
            // check the triangles of main square for intersection.
            Triangle hit = new Triangle();
            if (checkTriangles(loc.x, loc.y, workRay, intersection, patch, hit)) {
                // we found an intersection, so return that!
                float distance = worldPickRay.origin.distance(intersection);
                CollisionResult cr = new CollisionResult(intersection, distance);
                cr.setGeometry(patch);
                results.addCollision(cr);
                cr.setContactNormal(hit.getNormal());
                return intersection;
            }
            // because of how we get our height coords, we will
            // sometimes be off by a grid spot, so we check the next
            // grid space up.
            int dx = 0, dz = 0;
            Direction d = tracer.getLastStepDirection();
            switch(d) {
                case PositiveX:
                case NegativeX:
                    dx = 0;
                    dz = 1;
                    break;
                case PositiveZ:
                case NegativeZ:
                    dx = 1;
                    dz = 0;
                    break;
            }
            if (checkTriangles(loc.x + dx, loc.y + dz, workRay, intersection, patch, hit)) {
                // we found an intersection, so return that!
                float distance = worldPickRay.origin.distance(intersection);
                CollisionResult cr = new CollisionResult(intersection, distance);
                results.addCollision(cr);
                cr.setGeometry(patch);
                cr.setContactNormal(hit.getNormal());
                return intersection;
            }
            tracer.next();
        }
    }
    return null;
}
Also used : CollisionResult(com.jme3.collision.CollisionResult) Vector2f(com.jme3.math.Vector2f) Vector3f(com.jme3.math.Vector3f) ArrayList(java.util.ArrayList) Triangle(com.jme3.math.Triangle) Direction(com.jme3.terrain.geomipmap.picking.BresenhamYUpGridTracer.Direction) TerrainPatch(com.jme3.terrain.geomipmap.TerrainPatch)

Example 25 with Ray

use of com.jme3.math.Ray in project jmonkeyengine by jMonkeyEngine.

the class BresenhamYUpGridTracer method startWalk.

public void startWalk(final Ray walkRay) {
    // store ray
    this.walkRay.set(walkRay);
    // simplify access to direction
    Vector3f direction = this.walkRay.getDirection();
    // Move start point to grid space
    Vector3f start = this.walkRay.getOrigin().subtract(gridOrigin);
    gridLocation.x = (int) (start.x / gridSpacing.x);
    gridLocation.y = (int) (start.z / gridSpacing.z);
    Vector3f ooDirection = new Vector3f(1.0f / direction.x, 1, 1.0f / direction.z);
    // Check which direction on the X world axis we are moving.
    if (direction.x > TOLERANCE) {
        distToNextXIntersection = ((gridLocation.x + 1) * gridSpacing.x - start.x) * ooDirection.x;
        distBetweenXIntersections = gridSpacing.x * ooDirection.x;
        stepXDirection = 1;
    } else if (direction.x < -TOLERANCE) {
        distToNextXIntersection = (start.x - (gridLocation.x * gridSpacing.x)) * -direction.x;
        distBetweenXIntersections = -gridSpacing.x * ooDirection.x;
        stepXDirection = -1;
    } else {
        distToNextXIntersection = Float.MAX_VALUE;
        distBetweenXIntersections = Float.MAX_VALUE;
        stepXDirection = 0;
    }
    // Check which direction on the Z world axis we are moving.
    if (direction.z > TOLERANCE) {
        distToNextZIntersection = ((gridLocation.y + 1) * gridSpacing.z - start.z) * ooDirection.z;
        distBetweenZIntersections = gridSpacing.z * ooDirection.z;
        stepZDirection = 1;
    } else if (direction.z < -TOLERANCE) {
        distToNextZIntersection = (start.z - (gridLocation.y * gridSpacing.z)) * -direction.z;
        distBetweenZIntersections = -gridSpacing.z * ooDirection.z;
        stepZDirection = -1;
    } else {
        distToNextZIntersection = Float.MAX_VALUE;
        distBetweenZIntersections = Float.MAX_VALUE;
        stepZDirection = 0;
    }
    // Reset some variables
    rayLocation.set(start);
    rayLength = 0.0f;
    stepDirection = Direction.None;
}
Also used : Vector3f(com.jme3.math.Vector3f)

Aggregations

Vector3f (com.jme3.math.Vector3f)13 TempVars (com.jme3.util.TempVars)12 CollisionResult (com.jme3.collision.CollisionResult)10 CollisionResults (com.jme3.collision.CollisionResults)8 Ray (com.jme3.math.Ray)8 BoundingBox (com.jme3.bounding.BoundingBox)3 Vector2f (com.jme3.math.Vector2f)3 PhysicsRayTestResult (com.jme3.bullet.collision.PhysicsRayTestResult)2 UnsupportedCollisionException (com.jme3.collision.UnsupportedCollisionException)2 Spatial (com.jme3.scene.Spatial)2 Matrix4f (com.jme3.math.Matrix4f)1 Quaternion (com.jme3.math.Quaternion)1 Triangle (com.jme3.math.Triangle)1 VertexBuffer (com.jme3.scene.VertexBuffer)1 TerrainPatch (com.jme3.terrain.geomipmap.TerrainPatch)1 Direction (com.jme3.terrain.geomipmap.picking.BresenhamYUpGridTracer.Direction)1 TerrainPickData (com.jme3.terrain.geomipmap.picking.TerrainPickData)1 FloatBuffer (java.nio.FloatBuffer)1 IntBuffer (java.nio.IntBuffer)1 ShortBuffer (java.nio.ShortBuffer)1