As far as I remember there is an option for the PickTool which activates geometry-based picking. If you have a look in its sources it is documented there.
Alternatively you can use a library which already implements collision avoidance (or have a look into its sources): http://www.3dchat.org/doc/com/vwp/j3d/utils/behaviors/keyboard/KeyNavigatorBehavior.html > Thanks for the quick response. > > Sounds like a great idea, how can I implement it? Below is part of the > behavior I'm using to do the picking (some of the code is based on > the j3d.ord site). And even lower I post the settings for the Branch > englobing the collidable objets (my Quads). > > Many thanks in advance. > > > ======================================================================== > The behavoir > ======================================================================== > > class behavior2 extends Behavior > { > private TransformGroup TG; > private Transform3D rot=new Transform3D(); > private Transform3D rotation=new Transform3D(); > private Vector3f vctTransl; > private Vector3f forward, backwards, left, right, forwLeft, forwRight, > backwLeft, backwRight; > > protected Transform3D viewTx = new Transform3D(); > protected Transform3D worldEyeTransform = new Transform3D(); > protected Vector3d oneFrameTranslation = new Vector3d(); > protected TransformGroup viewTg; > protected Vector3d locationVector = new Vector3d(); > protected Point3d locationPoint = new Point3d(); > > /** The vector along which we do collision detection */ > private Vector3d collisionVector = new Vector3d(); > > private static final Vector3d COLLISION_DIRECTION = new Vector3d(0, 0, - > 1); > > /** Point 3D use to calculate the end point for collisions per frame > */ > private Point3d locationEndPoint = new Point3d(); > > /** Pick shape for collision detection */ > private PickSegment collisionPicker = new PickSegment(); > > private float deltaStep; > protected BranchGroup collidables; > > private WakeupOnAWTEvent keyEvent=new WakeupOnAWTEvent > (KeyEvent.KEY_PRESSED); > > behavior2(TransformGroup TG) > { > this.TG=TG; > this.viewTg=TG; > deltaStep = 0.2f; > forward = new Vector3f(0.0f, 0.0f, deltaStep); > backwards = new Vector3f(0.0f, 0.0f, -deltaStep); > left = new Vector3f(deltaStep, 0.0f, 0.0f); > right = new Vector3f(-deltaStep, 0.0f, 0.0f); > forwLeft = new Vector3f(deltaStep, 0.0f, deltaStep); > forwRight = new Vector3f(-deltaStep, 0.0f, deltaStep); > backwLeft = new Vector3f(deltaStep, 0.0f, -deltaStep); > backwRight = new Vector3f(-deltaStep, 0.0f, -deltaStep); > > > vctTransl = new Vector3f(); > } > > public void initialize() > { > this.wakeupOn(keyEvent); > } > > public void processStimulus(Enumeration criteria) > { > > Transform3D td = new Transform3D(); > viewTg.getTransform(td); > td.get(oneFrameTranslation); > > viewTx.transform(oneFrameTranslation); > > viewTg.getChild(0).getLocalToVworld(worldEyeTransform); > > worldEyeTransform.mul(viewTx); > > worldEyeTransform.get(locationVector); > locationPoint.set(locationVector); > > worldEyeTransform.transform(COLLISION_DIRECTION, collisionVector); > > collisionVector.scale(0.15f); > > > oneFrameTranslation.set(0.0d, 0.0d, -0.15d); > > locationEndPoint.add(locationVector, collisionVector); > locationEndPoint.add(oneFrameTranslation); > > collisionPicker.set(locationPoint, locationEndPoint); > System.out.println("start..." + locationPoint + "end..." + > locationEndPoint); > SceneGraphPath[] closest = collidables.pickAllSorted(collisionPicker); > > if(closest == null) > return; > > > boolean real_collision = false; > > for(int i = 0; (i < closest.length) && !real_collision; i++) > { > Shape3D i_shape = (Shape3D)closest[i].getObject(); > > System.out.println("shape" + i_shape); > > Enumeration geom_list = i_shape.getAllGeometries(); > > while(geom_list.hasMoreElements() && !real_collision) > { > GeometryArray geom = (GeometryArray)geom_list.nextElement(); > > if(geom == null) > continue; > > real_collision = true; // call specialist routine here > System.out.println("geom" + geom); > } > } > ======================================================================== > > ======================================================================== > The settings > ======================================================================== > wallsBranch = new BranchGroup(); > wallsBranch.setPickable(true); > > //Here I only post one, but I have 8 of these transformGroups > TransformGroup trGrp = new TransformGroup(); > trGrp.setPickable(true); > > //Here I only post one, but I have 8 of these QuadArrays > QuadArray wall = new QuadArray(4, QuadArray.COORDINATES| > QuadArray.TEXTURE_COORDINATE_2); > wall.setCapability(QuadArray.ALLOW_COORDINATE_READ); > wall.setCapability(QuadArray.ALLOW_FORMAT_READ); > wall.setCapability(QuadArray.ALLOW_COUNT_READ); > > //Here I set the coordinates of the vertex, code not worth posting? > > //Here I only post one, but I have 8 of these Shape3D > Shape3D theWall = new Shape3D(wall, appWalls) ; > theWall.setCapability(Shape3D.ALLOW_GEOMETRY_READ); > > //I append the shape3D to the transformGroup, and then this last one > //to the branch > wallsBranch.compile(); > > =========================================================================== > To unsubscribe, send email to [EMAIL PROTECTED] and include in the > body > of the message "signoff JAVA3D-INTEREST". For general help, send email to > [EMAIL PROTECTED] and include in the body of the message "help". > -- +++ Jetzt WLAN-Router für alle DSL-Einsteiger und Wechsler +++ GMX DSL-Powertarife zudem 3 Monate gratis* http://www.gmx.net/dsl =========================================================================== To unsubscribe, send email to [EMAIL PROTECTED] and include in the body of the message "signoff JAVA3D-INTEREST". For general help, send email to [EMAIL PROTECTED] and include in the body of the message "help".