jPCT-AE - a 3d engine for Android > Support

Find an object at a 3D location

(1/2) > >>

nathan:
Suppose I have a cursor in 3D space and want to perform a click.  I want to know what object the cursor is intersecting.  Is there a way to ask the world what object is at X,Y,Z location?  The checkCollision functions only check collision with the polygons of an object, so it only detects collisions on entering/exiting the object.

The best solution I can come up with is to constantly check collision whenever the cursor moves,  and keep track of entering/exiting objects. 

However, this solution isn't perfect, and I can think of many ways that this will fail.  An obvious example is that the object moves far enough away, without the cursor moving / updating, and next time the cursor moves, it doesn't realize it has left the object.

Is there any way to get the bounding box of the object?  I know you can setBoundingBox, and calculationBoundingBox, but there is no getBoundingBox, as far as I can tell.

nathan:
Okay, I found that you can get the BoundingBox using

object.getMesh().getBoundingBox();

This solves my problem.

But just to confirm (it works now), I would do:


--- Code: ---boolean doesIntersect;
SimpleVector cursorLocation = new SimpleVector(x,y,z);
SimpleVector centerOfObject = object.getTransformedCenter();
SimpleVector relativeLocation = new SimpleVector(cursorLocation);
relativeLocation.sub(centerOfObject);

float[] bb = object.getMesh().getBoundingBox();
if(relativeLocation.x < bb[0]) doesIntersect = false;
else if(relativeLocation.x > bb[1]) doesIntersect = false;
..
..
..
else doesIntersect = true;

--- End code ---

Is there any other way?  And will object.getTransformedCenter() always be good?

What if there are child objects? Will this method still work?



EgonOlsen:
You are mixing object and world space with that approach. In this case, it might not matter that much, but it's better to use world space bounds anyway: http://www.jpct.net/wiki/index.php/Getting_Worldspace_Bounds

nathan:
Thank you, that will help.

But, what if the object has children?  I would have to do getWorldSpaceBounds() on every child, and their children recursively. 

For instance, I loaded a 3DS file of a car.  The wheels are different objects than the car body.  I then created a new empty Object3D and added these loaded Object3Ds as children to it.  However, of course, getWorldSpaceBounds() only works on the object itself, not its children.  How do I get the objects children?  There is no getChildren() method?

Alternatively (and I don't want to do this), is to check collision for every object (including the children) and then follow the parent trail up.  A problem here is an object can have multiple parents.

Another solution that I haven't tested, and I think will have other drawbacks, is to use mergeAll().  Will this remove animations / ability for the wheels to rotate?  It seems that it would merge the meshes so that getWorldSpaceBounds() would work.

EgonOlsen:
One solution would be to create an invisible bounding object (like a box) that includes all sub-objects and use that for your checks. I'm doing that for collisions too (which is why i usually call this approach "collision mesh") and prevent the player from climbing up NPCs for example...

Navigation

[0] Message Index

[#] Next page

Go to full version