Hello! I have struggled with this problem for a month now, so I really need some help. I try to develop a game with collision detection with Java3D. To narrow it down I have made two test-java-files for you. File 1) Applet where I add all my objects (2 ColorCubes) File 2) A KeyListener to stear one of the cubes. The key listener also checks for collisions. All code is below, just compile and try. The idea is that the cube that I can stear should stop immediately outside the other cube from any direction. I should not intersect at all. But I can't detect that other cube at all. Now it just run through. So if any one could try the code and give me some hints or example I would be most thankfull.
Best regards Fredrik //The Main class import java.applet.*; import java.awt.*; import java.awt.Frame;import java.awt.event.*; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.universe.*; import com.sun.j3d.utils.geometry.*; import com.sun.j3d.utils.behaviors.keyboard.*; import javax.media.j3d.*; import javax.vecmath.*; import javax.swing.*; import java.util.*; public class Test extends Applet { BranchGroup branchGroup; ColorCube colorCube1 = new ColorCube(0.4); //The cube that you can navigate ColorCube colorCube2 = new ColorCube(0.4); TransformGroup transformGroup1; public void init() { setLayout(new BorderLayout()); GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); Canvas3D canvas3D = new Canvas3D(config); add("Center", canvas3D); SimpleUniverse simpleUniverse = new SimpleUniverse(canvas3D); branchGroup = new BranchGroup(); //Cube1 transformGroup1 = new TransformGroup(); Transform3D transform3D1 = new Transform3D(); transform3D1.set(new Vector3f(0.0f, 0.0f, -20.0f)); transformGroup1.setTransform(transform3D1); transformGroup1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); //for setShapeBounds transformGroup1.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); colorCube1.setCapability(Node.ALLOW_BOUNDS_READ); transformGroup1.setPickable(false); transformGroup1.addChild(colorCube1); branchGroup.addChild(transformGroup1); canvas3D.addKeyListener( new TestListener(transformGroup1, this) ); //Cube2 TransformGroup transformGroup2 = new TransformGroup(); Transform3D transform3D2 = new Transform3D(); transform3D2.set(new Vector3f(0.0f, 2.0f, -20.0f)); transformGroup2.setTransform(transform3D2); colorCube2.setPickable(true); transformGroup2.addChild(colorCube2); branchGroup.addChild(transformGroup2); branchGroup.compile(); simpleUniverse.addBranchGraph(branchGroup); } public static void main(String[] args) { Frame frame = new MainFrame(new Test(), 600, 400); } } //The KeyListener and Collision detection class import java.awt.event.*; import javax.media.j3d.*; import javax.vecmath.*; import java.awt.Frame; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.picking.*; import com.sun.j3d.utils.geometry.*; public class TestListener implements KeyListener { final static float DISTANCE = 0.1f; final static double TURNANGLE = 0.1; float x = 0.0f; float y = 0.0f; float z = -20.0f; private double angle = 0.0; TransformGroup transformGroup; Transform3D positionTransform3D = new Transform3D(); Transform3D angleTransform3D = new Transform3D(); Test test; PickTool pickTool; Point3d point3d; Vector3d vector3d; Transform3D transform3D; public TestListener(TransformGroup tfg, Test t) { test = t; transformGroup = tfg; pickTool = new PickTool(test.branchGroup); pickTool.setCapabilities(test.colorCube2, PickTool.INTERSECT_FULL); pickTool.setMode( PickTool.BOUNDS ); positionTransform3D.set(new Vector3f(x, y, z)); } public void keyTyped(KeyEvent e) { } public void keyPressed(KeyEvent e) { if( e.getKeyCode() == KeyEvent.VK_UP ) { if(isMovePossible(DISTANCE)) { Transform3D temp = new Transform3D(); temp.set(new Vector3f(0, DISTANCE, 0)); positionTransform3D.mul(temp); transformGroup.setTransform( positionTransform3D ); } } else if( e.getKeyCode() == KeyEvent.VK_DOWN ) { if(isMovePossible(-DISTANCE)) { Transform3D temp = new Transform3D(); temp.set(new Vector3f(0, -DISTANCE, 0)); positionTransform3D.mul(temp); transformGroup.setTransform( positionTransform3D ); } } else if( e.getKeyCode() == KeyEvent.VK_LEFT ) { angle = angle + TURNANGLE; angleTransform3D.rotZ(TURNANGLE); positionTransform3D.mul(angleTransform3D); transformGroup.setTransform( positionTransform3D ); } else if( e.getKeyCode() == KeyEvent.VK_RIGHT ) { angle = angle - TURNANGLE; angleTransform3D.rotZ(-TURNANGLE); positionTransform3D.mul(angleTransform3D); transformGroup.setTransform( positionTransform3D ); } } public void keyReleased(KeyEvent e) { } public boolean isMovePossible(float distance) { boolean retValue = true; PickBounds pickBounds = new PickBounds( test.colorCube1.getBounds() ); pickTool.setShape( pickBounds, getCordinate(test.transformGroup1) ); PickResult pickResult = pickTool.pickAny( ); if ( pickResult != null ) { System.out.println("Boink"); retValue = false; } else { retValue = true; } return retValue; } public static void main(String[] args) { Frame frame = new MainFrame(new Test(), 600, 350); } public Point3d getCordinate(TransformGroup transformGroup) { Transform3D pointTransform3D = new Transform3D(); transformGroup.getTransform( pointTransform3D ); float[] cordinates = new float[16]; pointTransform3D.get(cordinates); Point3d point = new Point3d(cordinates[3], cordinates[7], cordinates[11]); return point; } public void printOutCordinates(TransformGroup transformGroup) { Transform3D printOutTransform3D = new Transform3D(); transformGroup.getTransform( printOutTransform3D ); float[] cordinates = new float[16]; printOutTransform3D.get(cordinates); for(int i = 0; i < cordinates.length; i++) { System.out.println(i + ":" + cordinates[i]); } System.out.println(); } } =========================================================================== 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".