Reply – Re: Collision Detection Bug in Java 3D 1.5.2
Your Name
Subject
Message
or Cancel
In Reply To
Re: Collision Detection Bug in Java 3D 1.5.2
— by Christian Christian
I had a look to the source code of "Arabian Flights". The developer don't use the Behavior class for collision detection. If I see it right he made his own detection in class PhysicsEngine method collisionCheck(Particle part1, Particle part2). I think out intention should be to solve that the Java3D Behavior for collision detection is working properly.

I do not believe that the problem has to do with adding a node and a children of the node to the SceneGraph, because I didn't. The TransformGroup consisting the Sphere I added to the SceneGraph is not a children of the Behaviour class in the SceneGraph. It is just a attribute in the class.

If you concern about this I improved the code a bit to make it more clear:

package com.example.coll;

import java.util.Enumeration;

import javax.media.j3d.Behavior;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.DirectionalLight;

import javax.media.j3d.Node;
import javax.media.j3d.Shape3D;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.media.j3d.WakeupCriterion;
import javax.media.j3d.WakeupOnCollisionEntry;
import javax.media.j3d.WakeupOnCollisionExit;
import javax.media.j3d.WakeupOnCollisionMovement;
import javax.media.j3d.WakeupOr;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;

import javax.vecmath.Vector3d;
import javax.vecmath.Vector3f;


import com.sun.j3d.utils.geometry.Sphere;
import com.sun.j3d.utils.universe.SimpleUniverse;

public class CollisionBugExample {

        public CollisionBugExample() {
                SimpleUniverse universe = new SimpleUniverse();
                BranchGroup group = new BranchGroup();

                Particle shape1 = new Particle(0.3f);
                group.addChild(shape1.getSphereTGrp());
                shape1.setPosition(new Vector3d(+0.2, 0.0, 0.0));
           
                Particle shape2 = new Particle(0.3f);
                group.addChild(shape2.getSphereTGrp());
                shape2.setPosition(new Vector3d(-0.2, 0.0, 0.0));
           
                Particle shape3 = new Particle(0.1f);
                group.addChild(shape3.getSphereTGrp());
               
                CollisionDetection collDet = new CollisionDetection(shape3.getShape());
                group.addChild(collDet);
               
                Color3f light1Color = new Color3f(1.8f, 0.1f, 0.1f);
                BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
                Vector3f light1Direction = new Vector3f(4.0f, -7.0f, -12.0f);
                DirectionalLight light1 = new DirectionalLight(light1Color, light1Direction);
                light1.setInfluencingBounds(bounds);
                group.addChild(light1);

                universe.getViewingPlatform().setNominalViewingTransform();
                universe.addBranchGraph(group);
           
                // move the moving sphere
           
                for(double i = 1.0; i > -1.0; i -= 0.01) {
                        shape3.setPosition(new Vector3d(i, 0.0, 0.0));
                        try {
                                Thread.sleep(100);
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                }
        }

        public static void main(String[] args) {
                new CollisionBugExample();
        }
}

class Particle {
       
        private Sphere sphere;
       
        private TransformGroup transGrp;
       
        public Particle(float size) {
                transGrp = new TransformGroup();
                transGrp.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                sphere = new Sphere(size);
                transGrp.addChild(sphere);
        }

        public TransformGroup getSphereTGrp() {
                return transGrp;
        }
       
        public Shape3D getShape() {
                return sphere.getShape();
        }
       
        public void setPosition(Vector3d position) {
                Transform3D transform = new Transform3D();
                transform.setTranslation(position);
                transGrp.setTransform(transform);
        }
}

class CollisionDetection extends Behavior {
       
        private Shape3D shape;

        private WakeupCriterion[] collisionCriteria;
        private WakeupOr oredCriteria;
       
        public CollisionDetection(Shape3D shape) {
                this.shape = shape;
                setSchedulingBounds(new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0));
        }
       
        @Override
        public void initialize() {
                collisionCriteria = new WakeupCriterion[3];
                collisionCriteria[0] = new WakeupOnCollisionEntry(shape);
                collisionCriteria[1] = new WakeupOnCollisionExit(shape);
                collisionCriteria[2] = new WakeupOnCollisionMovement(shape);
                oredCriteria = new WakeupOr(collisionCriteria);
                wakeupOn(oredCriteria);
        }

        @Override
        public void processStimulus(Enumeration criteria) {
                WakeupCriterion theCriterion = (WakeupCriterion) criteria.nextElement();
                Node collisionShape;

                if(theCriterion instanceof WakeupOnCollisionEntry) {
                        collisionShape = ((WakeupOnCollisionEntry) theCriterion).getTriggeringPath().getObject();
                } else if(theCriterion instanceof WakeupOnCollisionExit) {
                        collisionShape = ((WakeupOnCollisionExit) theCriterion).getTriggeringPath().getObject();
                } else {
                        collisionShape = ((WakeupOnCollisionMovement) theCriterion).getTriggeringPath().getObject();
                }
               
                System.out.println(theCriterion + " : collide with " + collisionShape);
               
                wakeupOn(oredCriteria);
        }
}

With this implementation the problem still exists.

Christian