Ray Intersection on a Bounding Volume


Can someone tell me why the ray that the actionListener casts does not hit the bounding volume of the box? Here’s the code:


import com.jme3.app.SimpleApplication;

import com.jme3.bounding.BoundingSphere;

import com.jme3.collision.CollisionResult;

import com.jme3.collision.CollisionResults;

import com.jme3.input.MouseInput;

import com.jme3.input.controls.ActionListener;

import com.jme3.input.controls.MouseButtonTrigger;

import com.jme3.material.Material;

import com.jme3.math.ColorRGBA;

import com.jme3.math.Ray;

import com.jme3.math.Vector3f;

import com.jme3.scene.Geometry;

import com.jme3.scene.Node;

import com.jme3.scene.shape.Box;

import com.jme3.scene.shape.Sphere;

public class BoundingSphereInnerRayIntersection extends SimpleApplication {

Box box;

Node boxNode;

Geometry boxGeometry;

Material boxMaterial;

BoundingSphere boxBoundingSphere;

Geometry mark;

private ActionListener actionListener = new ActionListener() {

public void onAction(String name, boolean keyPressed, float tpf) {

if (name.equals(“castray”) && !keyPressed) {

CollisionResults results = new CollisionResults();

Ray ray = new Ray(cam.getLocation(), cam.getDirection());

rootNode.collideWith(ray, results);


Collisions? " + results.size() + "
for (int i = 0; i < results.size(); i++) {
float dist = results.getCollision(i).getDistance();
Vector3f pt = results.getCollision(i).getContactPoint();
String hit = results.getCollision(i).getGeometry().getName();
System.out.println("* Collision #" + i);
System.out.println(" You shot " + hit + " at " + pt + ", " + dist + " wu away.");
if (results.size() > 0) {
CollisionResult closest = results.getClosestCollision();
} else {
// No hits? Then remove the red mark.

public void simpleInitApp() {

inputManager.addMapping("castray", new MouseButtonTrigger(MouseInput.BUTTON_LEFT));
inputManager.addListener(actionListener, "castray");

Sphere sphere = new Sphere(30, 30, 0.2f);
mark = new Geometry("mark", sphere);
Material mark_mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
mark_mat.setColor("Color", ColorRGBA.Red);

box = new Box(Vector3f.ZERO, 1, 1, 1);
boxNode = new Node();
boxGeometry = new Geometry("box", box);
boxMaterial = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
boxMaterial.setColor("Color", ColorRGBA.randomColor());
boxBoundingSphere = new BoundingSphere(10f, box.getCenter());


public void simpleUpdate(float tpf) {


public static void main(String[] args) {
BoundingSphereInnerRayIntersection b = new BoundingSphereInnerRayIntersection();


I read the Documentation and saw that BoundingVolume implements Collidable. Then i changed the code to the following:

boxBoundingSphere.collideWith(ray, results);

I don’t think setting your own bounds works. I think its probably better to put this into a node, which contains a sphere, and set it to CullHint.Always. This way it won’t be visible but still clickable, and you have now emulated a bigger clicking area for the object