Hi everybody,
i have some issues with raycasting. In my programm I shoot rays from different points in the 6 main directions (0,0,1), (0,0,-1), …, (-1, 0, 0). I set their limit to 1. Given an origin and an obviously normalized direction. I still get results where getDistance() gives values > 1. The way I would interpret setLimit is that it would ignore all results that are farther away then direction * limit. But it seems like it is not.
Can anyone tell why that is? Or how its actually working?
Hmm ok consider this mesh. A 3x3 grid with distance 1:
Now I shoot the rays from each of these points in 6 directions as mentioned above:
[java]
public static Vector3f[] rDirections = new Vector3f[] { new Vector3f(0, 0, 1),
new Vector3f(0, 0, -1),
new Vector3f(1, 0, 0),
new Vector3f(-1, 0, 0),
new Vector3f(0, 1, 0),
new Vector3f(0, -1, 0) }
public float extractVoxelData2(Geometry refGeom, Vector3f voxelPos) {
float[] densities0, densities1;
CollisionResults tmpResults = new CollisionResults();
CollisionResult r;
Ray ray = new Ray();
ray.setLimit(1);
for (Vector3f rDirection : rDirections) {
tmpResults.clear();
ray.setOrigin(voxelPos);
ray.setDirection(rDirection);
refGeom.collideWith(ray, tmpResults);
for (int i = 0; i < tmpResults.size(); i++) {
r = tmpResults.getCollision(i);
// dbl = false;
// if (results.size() > 0)
// if (r.getContactPoint()
// .equals(results.getCollision(results.size() - 1).getContactPoint())
// && r.getDistance() == results.getCollision(results.size() - 1)
// .getDistance()) {
// dbl = true;
// }
// if (r.getDistance() <= 1 && !dbl) {
results.addCollision(r);
// } else {
// // results.d
// }
}
}
if (results.size() > 0) {
System.out.println("Results for " + voxelPos);
densities0 = new float[results.size()];
densities1 = new float[results.size()];
for (int i = 0; i < results.size(); i++) {
r = results.getCollision(i);
densities0[0] = r.getDistance();
densities1[0] = r.getDistance();
System.out.println("Result " + i + ": contact " + r.getContactPoint()
+ ",\n normal " + r.getContactNormal()
+ ",\n distance " + r.getDistance()
+ ", triIndex " + r.getTriangleIndex()
+ ", tri distance "
+ r.getTriangle(null).getCenter().distance(voxelPos));
System.out.println();
}
System.out.println("----------------------------------");
}
return .5f;
}
[/java]
With this code I get 8 results for the 6 points outside the mesh and 24 for the one inside the mesh.
I get why its 4 cause it hits 4 triangles … but the others ofcourse also 4 but with distance 1.5f which would be fine if I wouldnt set a limit.