Hi All,
I am trying to write a collision detection
routine. I have followed the examples in the "Ready-to-Run Java 3D" book
and also from mail archive from Tony Burrows. I have been unable to get it
to work. Whenever I try to use the collision detection routine it hangs
the process and I have to go into Task Manager on WinNT and shut down the
task. I have also looked at the "TickTockCollision" Example and have not
been able to get any farther. I am reading in a VRML file with named nodes
and am setting collision detection on those nodes. Can anyone help?
Please.
Also, do I set the collision detection on the node
that I am moving or on all the other nodes? That part was not quite clear
to me.
Below is my collision detector class:
import java.util.*;
import javax.media.j3d.*; import javax.vecmath.*; import com.sun.j3d.utils.geometry.Primitive; public class CollisionDetector extends
Behavior
{ private boolean inCollision = false; private WakeupOnCollisionEntry wEnter; private WakeupOnCollisionExit wExit; private TransformGroup targetObject; public CollisionDetector(TransformGroup obj) { inCollision = false; targetObject = obj; System.out.println("Collider Created..."); } public void initialize() { wEnter = new WakeupOnCollisionEntry(targetObject); wExit = new WakeupOnCollisionExit(targetObject); wakeupOn(wEnter); System.out.println("Collider Initialized..."); } public void processStimulus(Enumeration criteria) { inCollision = !inCollision; if (inCollision) { System.out.println("Collision Detected ..."); wakeupOn(wExit); } else { wakeupOn(wEnter); } } } Below is where I instantiate the collision detector
class:
file://Load
in the Fixture VRML file
Scene scene = null; VrmlLoader loader = new VrmlLoader(); try { URL loadURL = new URL(this.getCodeBase(),fixtureFile); try { System.out.println("loadURL = " + loadURL.toString()); scene = loader.load(loadURL); } catch (Exception e) { System.out.println("Exception loading URL:" + e); } } catch (MalformedURLException badURL) { file://location may be a path name try { scene = loader.load(fixtureFile); } catch (Exception e) { System.out.println("Exception loading file from path: " + e.getMessage()); } } if (scene != null) { fixture_BG = scene.getSceneGroup(); fixture_BG.setCapability(BranchGroup.ALLOW_DETACH); fixture_BG.setCapability(BranchGroup.ALLOW_BOUNDS_READ); fixture_BG.setCapability(BranchGroup.ALLOW_BOUNDS_WRITE); file://Add the machine to the transform group fixture_TG.addChild(fixture_BG); file://Set capabilities on all named nodes TransformGroup nodeGroup = new TransformGroup(); String nodeID; Hashtable allNodes = scene.getNamedObjects(); if (!allNodes.isEmpty()) { Enumeration e = allNodes.keys(); if (e.hasMoreElements()) { do { nodeID = (String)e.nextElement(); if (allNodes.get(nodeID).getClass() == nodeGroup.getClass()) { System.out.println("NodeID = " + nodeID); file://Get the node group (transformaion group) nodeGroup = (TransformGroup)allNodes.get(nodeID); file://Set node group capabilities nodeGroup.setCapability(TransformGroup.ALLOW_BOUNDS_READ); nodeGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); nodeGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); nodeGroup.setCapability(TransformGroup.ALLOW_COLLISION_BOUNDS_READ); nodeGroup.setCapability(TransformGroup.ALLOW_COLLISION_BOUNDS_WRITE); nodeGroup.setCapability(TransformGroup.ALLOW_COLLIDABLE_READ); nodeGroup.setCapability(TransformGroup.ALLOW_COLLIDABLE_WRITE); if (nodeID.equals("Part")) { file://Create the collision detector for this node. CollisionDetector cd = new CollisionDetector(nodeGroup); // cd.setSchedulingBounds(nodeBounds); nodeGroup.addChild(cd); detectors.put((String)nodeID,(CollisionDetector)cd); } System.out.println("number of children = " + nodeGroup.numChildren()); file://Set collidable status for the node group to true; nodeGroup.setCollidable(true); validNodes.put((String)nodeID,(TransformGroup)nodeGroup); } } while (e.hasMoreElements()); } allNodes.clear(); } } file://Add the scene to the scene graph to the locale locale.addBranchGraph(world_BG); file://now that the scene group is "live" calculate the new bounds BoundingSphere sceneBounds = (BoundingSphere)world_BG.getBounds(); file://set up a view point to include the bounds SetViewPoint(sceneBounds); file://Now that a scene bounds has been established, Set the scheduling bounds for each of the collision detectors created. CollisionDetector temp_CD; TransformGroup temp_Node; if (!validNodes.isEmpty()) { String nodeID; Enumeration e = validNodes.keys(); if (e.hasMoreElements()) { do { nodeID = (String)e.nextElement(); temp_Node = (TransformGroup) validNodes.get(nodeID); temp_Node.setCollisionBounds(temp_Node.getBounds()); validNodes.put((String)nodeID, (TransformGroup)temp_Node); if (detectors.contains(nodeID)) { temp_CD = (CollisionDetector) detectors.get(nodeID); temp_CD.setSchedulingBounds(temp_Node.getBounds()); System.out.println("temp_Node = " + temp_Node.getBounds()); } } while (e.hasMoreElements()); } detectors.clear(); } Thanks for any suggestion that you can give
me.
Dean
|
- Re: [JAVA3D] Collision Detection Dean Keeler
- Re: [JAVA3D] Collision Detection Daniel Selman
- Re: [JAVA3D] Collision Detection Tony Burrows
- [JAVA3D] Collision Detection Steve Grenier
- [JAVA3D] Collision Detection Anders Breivik
- Re: [JAVA3D] Collision Detection Eric Arnold
- Re: [JAVA3D] Collision Detection Andrew Kimsey
- Re: [JAVA3D] Collision Detection Larry Hope
- Re: [JAVA3D] Collision Detection Dean Keeler
- Re: [JAVA3D] Collision Detection Tony Burrows
- Re: [JAVA3D] Collision Detection Dan Petersen