Avatar billede fredand Forsker
16. november 2003 - 20:46 Der er 1 kommentar og
1 løsning

Collison detection problems!

Hello!

I got a small app where I have implanted some collision detection. But The collision detection doesn't work perfect. So if any one could take a look and give me an advice.

There is 2 ColorCubes. One small and one Big, The small one is navigable with the arrow keys. It should not be possible to "drive" through the big ColorCube but with my code it unfortunatly is.

The small cube is supposed to stop immediatly outside the big cube before it run through it.

Best Regards
Fredrik

Below is the hole code to test this:

package java3d;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); //Den som styrs     ColorCube colorCube2 = new ColorCube(0.6);    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();        branchGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);        branchGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);        branchGroup.setCapability(Shape3D.ALLOW_GEOMETRY_READ);        //The cube1        TransformGroup 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);        transformGroup1.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);        transformGroup1.setPickable(false);        transformGroup1.addChild(colorCube1);        branchGroup.addChild(transformGroup1);        canvas3D.addKeyListener( new TestListener(transformGroup1, this) );        //The 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);    }}package java3d;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);        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;        point3d = new Point3d();        vector3d = new Vector3d(0, distance, 0);        transform3D = new Transform3D();        transform3D.setTranslation(new Vector3d(0, distance, 0)); //Funkar det inte kan denna rad vara fel        transform3D.mul(positionTransform3D);        transform3D.transform(point3d);        pickTool.setShapeRay(point3d, vector3d);        PickResult pickResult = pickTool.pickClosest();        if(pickResult != null)        {            Node node = pickResult.getObject();            if(node instanceof ColorCube )            {                //System.out.println("ColorCube");            }            PickIntersection pickIntersection = pickResult.getIntersection(0);            if(pickIntersection != null)            {                Point3d checkPoint = pickIntersection.getPointCoordinates();                if(checkPoint != null)                {                    System.out.println("Boink " + checkPoint.x + " " + checkPoint.y);                    retValue = true;                }            }        }        return retValue;    }    public static void main(String[] args)    {        Frame frame = new MainFrame(new Test(), 600, 350);    }}
Avatar billede arne_v Ekspert
16. november 2003 - 20:49 #1
I think a repost in formatted form would improve readability.
Avatar billede fredand Forsker
17. november 2003 - 11:38 #2
Yes!
This look like crap!
Best regards
Fredrik
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester