Collision problem.

classic Classic list List threaded Threaded
18 messages Options
Reply | Threaded
Open this post in threaded view
|

Collision problem.

dfewfew
Why there is collision when the objects are 10000 meters one from another?


package com.daltonfilho.tutorials.java3d;
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.FileNotFoundException;
import java.util.Enumeration;

import javax.media.j3d.AmbientLight;
import javax.media.j3d.Appearance;
import javax.media.j3d.Background;
import javax.media.j3d.Behavior;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.Bounds;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.DirectionalLight;
import javax.media.j3d.ImageComponent2D;
import javax.media.j3d.Shape3D;
import javax.media.j3d.Texture;
import javax.media.j3d.Texture2D;
import javax.media.j3d.TextureAttributes;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.media.j3d.View;
import javax.media.j3d.WakeupCriterion;
import javax.media.j3d.WakeupOnCollisionEntry;
import javax.media.j3d.WakeupOnCollisionExit;
import javax.media.j3d.WakeupOnCollisionMovement;
import javax.media.j3d.WakeupOnElapsedTime;
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.loaders.Scene;
import com.sun.j3d.loaders.objectfile.ObjectFile;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import com.sun.j3d.utils.geometry.Primitive;
import com.sun.j3d.utils.geometry.Sphere;
import com.sun.j3d.utils.image.TextureLoader;
import com.sun.j3d.utils.universe.ConfiguredUniverse;
import com.sun.j3d.utils.universe.SimpleUniverse;

class sss
{
        public void aa()
        {}
        }

public class themain extends Applet implements KeyListener {
        public static void main(String[] args)
        {
                themain aa=  new themain();
                new MainFrame(aa,400,400);
                aa.addKeyListener(aa);
        }
        class colision extends Behavior
        {
               
                WakeupCriterion yawn ;
                WakeupCriterion[]
                kolizia =new WakeupCriterion[3];
                 protected WakeupOr oredCriteria;
       Shape3D shape;
                public colision(Shape3D shape,Bounds granici){
                this.shape=shape;
                        System.out.println("bbbaaa");
                        setSchedulingBounds(granici);
                }
                public void initialize() {
                    kolizia[0]=new WakeupOnCollisionEntry(shape);
                kolizia[1] = new WakeupOnCollisionExit(shape);
                kolizia[2] = new WakeupOnCollisionMovement(shape);
                oredCriteria = new WakeupOr(kolizia);
                wakeupOn(oredCriteria);
               
                }
                public  void processStimulus(Enumeration criteria) {
                          WakeupCriterion theCriterion = (WakeupCriterion) criteria.nextElement();
                            if (theCriterion instanceof WakeupOnCollisionEntry) {
                         themain.this.update(true);
                              System.out.println("Collided with ");
                            } else if (theCriterion instanceof WakeupOnCollisionExit) {
                             themain.this.update(true);
                              System.out.println("Stopped colliding with  "
                                );
                            } else {
                             themain.this.update(true);
                              System.out.println("Moved whilst colliding with "
                            );
                            }
                            wakeupOn(oredCriteria);

                       
                }
                }
       
        class main extends Behavior
        {
                WakeupCriterion yawn ;

                public main(){
       
                        System.out.println("bbb");
                        yawn  = new WakeupOnElapsedTime(30);

                }
                public void initialize() {

                        wakeupOn(yawn);
                }
                public  void processStimulus(Enumeration criteria) {
       
                themain.this.update(false);
                        wakeupOn(yawn);
                       
                }
                }
       

        float posokaz = 0.0f;
        float posokay=0.0f;
        float posokax=5.0f;
        float posoka2z = 10.0f;
        float posoka2y=0.0f;
        float posoka2x=0.0f;
    double zawurtane = 0;
         Transform3D transform;
         Vector3f mqsto;
         Transform3D transform2;
         Transform3D transform3;
         Vector3f mqstomishena;
         View gledka;
         TransformGroup view;
         TransformGroup tg;
         TransformGroup tg2;
          DirectionalLight light1;
          Shape3D korab;
          Background background =null;
          //Shape3D mishena;
          Shape3D truba;
          Transform3D lookat ;
          ConfiguredUniverse ss;
          ConfiguredUniverse universe ;
           ObjectFile f;
           Scene s = null;
           BranchGroup b ;
public themain ()
{
        //javax.media.j3d.View.setFrontClipDistance(22);
       

        setLayout(new BorderLayout());
         GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
         
         Canvas3D canvas = new Canvas3D(config);
        // canvas.setBounds(10000, 10000, 10000, 10000);
         universe = new ConfiguredUniverse(canvas);
 
  tg = new TransformGroup();
  tg2 =new TransformGroup();

  tg2.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  transform = new Transform3D();
  transform2 = new Transform3D();
  transform3 = new Transform3D();
  lookat= new Transform3D();
  View view = canvas.getView();
  view.setBackClipDistance(3000f);
   mqsto =new Vector3f(posokax,posokay,posokaz);
   mqstomishena =new Vector3f(0,0,0);
  // mqstomishena =new Vector3f(20,0,0);
   add( canvas);
   canvas.addKeyListener(this);
   transform.setTranslation(mqsto);
   background=new Background();
   TextureAttributes texAttr = new TextureAttributes();
   texAttr.setTextureMode(TextureAttributes.MODULATE);
   //background.setColor(1.0f, 0.0f, 0.0f);
   background.setCapability(Background.ALLOW_APPLICATION_BOUNDS_WRITE);
   gledka=new View();
   lookat.lookAt(new Point3d(0,0,0), new Point3d(mqsto.getX(),mqsto.getY(),mqsto.getZ()), new Vector3d() );
   lookat.setTranslation(mqsto);
   transform2.setTranslation(mqstomishena);
   transform3.setTranslation(new Vector3f(0,0,0));
   tg.setTransform(transform);
   gledka.setBackClipDistance(3);
   gledka.setFrontClipDistance(30000);
//   gledka.addCanvas3D(canvas);
   tg2.setTransform(transform);
   String s1 = "mishena.obj";
   String s2 = "mishena.obj";
   String s3 = "truba.obj";

TextureLoader loader = new TextureLoader("rujda.jpg",this);
ImageComponent2D brick2 = loader.getImage();

Texture2D brick= new Texture2D(Texture2D.BASE_LEVEL, Texture2D.RGB, brick2.getWidth(), brick2.getHeight());
brick.setEnable(true);
brick.setImage(0, brick2);
TextureAttributes ta = new TextureAttributes();    

   BranchGroup group = new BranchGroup();
   korab=loader(s1);
   b.removeChild(0);
  // mishena = loader(s2);
 ////  b.removeChild(0);
   truba=loader(s3);
   b.removeChild(0);
   Color3f light1Color = new Color3f(0f, 255f, 1f);
   BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0,
                      0.0), 0.0);
   bounds.setRadius(Float.MAX_VALUE);
   Vector3f light1Direction = new Vector3f(4.0f, -7.0f, -12.0f);
    light1 = new DirectionalLight(light1Color, light1Direction);
   light1.setInfluencingBounds(bounds);
   background.setApplicationBounds(bounds);
   background.setName("rujda.jpg");
   
   AmbientLight ambientLightNode = new AmbientLight (light1Color);
        ambientLightNode.setInfluencingBounds (bounds);
   Appearance ap = new Appearance();
    Color3f col = new Color3f(0.0f, 0.0f, 22.0f);
   ap.setTextureAttributes(texAttr);
   ap.setTexture(brick);
 //  mishena.setAppearance(ap);
   truba.setAppearance(ap);
 
   korab.setAppearance(ap);
//  tg.addChild(mishena);
   tg.addChild(truba);
   tg2.addChild(korab);
   Sphere mySphere = new Sphere(0.7f,Primitive.GENERATE_TEXTURE_COORDS,ap);
tg2.addChild(mySphere);
   //tg.addChild(view);
   tg.addChild(ambientLightNode);
   MouseRotate myMouseRotate = new MouseRotate();
   myMouseRotate.setTransformGroup(tg);
   myMouseRotate.setSchedulingBounds(new BoundingSphere());
    group.addChild(tg);
   group.addChild(background);
    group.addChild(tg2);
 
    group.addChild(light1);
    main loop = new main();
    colision colisions = new colision(korab,bounds);
    colision colisions2 = new colision(truba,bounds);
    loop.setSchedulingBounds(bounds);
    colisions.setSchedulingBounds(bounds);
    group.addChild(loop);
    group.addChild(colisions);
    group.addChild(colisions2);
 
   
  universe.getViewingPlatform().setNominalViewingTransform();
 universe.getViewingPlatform().getViewPlatformTransform().setTransform(transform);
   universe.addBranchGraph(group);
   this.setVisible(true);
}
public static Texture getTexture(String path)
{
       TextureLoader texLoader = new TextureLoader(path, null);
       Texture texture =  texLoader.getTexture();
       if (texture == null)
         System.out.println("Cannot load texture from " + path);
       else {
         System.out.println("Loaded texture from " + path);
       //  texture.setEnable(true);
       }
       return texture;
}
public void keyPressed(KeyEvent e){
        if(e.getKeyCode()==KeyEvent.VK_NUMPAD2)
        {
                System.out.println("aa");
         
posokax=posokax+10.f;
mqsto.setX(posokax);
transform.setTranslation(mqsto);
tg.setTransform(transform);
        }
        if(e.getKeyCode()==KeyEvent.VK_A)
        {
                System.out.println("aa");
         
zawurtane=zawurtane+0.01;
transform2.rotZ(zawurtane);
tg2.setTransform(transform2);
        }
        if(e.getKeyCode()==KeyEvent.VK_D)
        {

zawurtane=zawurtane-0.01;
transform2.rotZ(zawurtane);
tg2.setTransform(transform2);
        }
        if(e.getKeyCode()==KeyEvent.VK_NUMPAD2)
        {
                System.out.println("aa");
         
posokax=posokax+10.f;
mqsto.setX(posokax);
transform.setTranslation(mqsto);
tg.setTransform(transform);
        }
       
        if(e.getKeyCode()==KeyEvent.VK_NUMPAD8)
        {
                System.out.println("aa");
posokax=posokax-10.f;
mqsto.setX(posokax);
transform.setTranslation(mqsto);
tg.setTransform(transform);
        }
        if(e.getKeyCode()==KeyEvent.VK_NUMPAD4)
        {
                System.out.println("aa");
posokay=posokay+10.f;
mqsto.setY(posokay);
transform.setTranslation(mqsto);
tg.setTransform(transform);
zawurtane=zawurtane+0.05;
transform.rotZ(zawurtane);
tg.setTransform(transform);
        }
        if(e.getKeyCode()==KeyEvent.VK_NUMPAD6)
        {
                System.out.println("aa");
posokay=posokay-10.f;
mqsto.setY(posokay);
transform.setTranslation(mqsto);
tg.setTransform(transform);
zawurtane=zawurtane-0.05;
transform.rotZ(zawurtane);
tg.setTransform(transform);
        }

        }
public void keyReleased(KeyEvent e){

         }
public void keyTyped(KeyEvent e){

         }

public Shape3D loader(String s1)
{
          f = new ObjectFile ();
           try{
                        s = f.load (s1);
                   }
                   catch(FileNotFoundException e)
                   {
                           System.out.println(e);
                   }
       b = s.getSceneGroup();
           return (Shape3D) b.getChild(0);
}
public  void update(boolean kol)
{
        if (kol==true)
        {
                transform.setTranslation(new Vector3f(0,0,0));
                tg.setTransform(transform);
                posokaz=0f;
                System.out.println("bbbbb");
        }
        else{
        posokaz=posokaz+100f;
       
transform.rotY(0);
transform.setTranslation(new Vector3f(posokay,posokax,posokaz));
tg.setTransform(transform);
        }
transform2.setTranslation(new Vector3f(posoka2y,posoka2x,10000));
tg2.setTransform(transform2);
transform3.setTranslation(new Vector3f(posoka2y,posoka2x+200,10500));
//lookat.lookAt(new Point3d(0,0,0), new Point3d(mqsto.getX(),mqsto.getY(),mqsto.getZ()), new Vector3d() );
universe.getViewingPlatform().getViewPlatformTransform().setTransform(transform3);

}

        }
Reply | Threaded
Open this post in threaded view
|

Re: Collision problem.

gouessej
Administrator
Hi

Please could you use variable names in English? I hardly understand Estonian or Polish. Are you sure you correctly set their bounding volumes?
Julien Gouesse | Personal blog | Website
Reply | Threaded
Open this post in threaded view
|

Re: Collision problem.

dfewfew
how to set the volumes?
Reply | Threaded
Open this post in threaded view
|

Re: Collision problem.

gouessej
Administrator
By default, a Shape3D is pickable and collidable, it automatically computes its bounding volume. If it does not work, you can use setBoundsAutoCompute(false) and setCollisionBounds().

I advise you to read this tutorial about collisions and Java3D:
http://ex.osaka-kyoiku.ac.jp/~fujii/JREC6/onlinebook_selman/Htmls/3DJava_Ch05.htm
Julien Gouesse | Personal blog | Website
Reply | Threaded
Open this post in threaded view
|

Re: Collision problem.

dfewfew
Ok but how to set the bounds from a obj file?I have no idea.
Reply | Threaded
Open this post in threaded view
|

Re: Collision problem.

gouessej
Administrator
setCollisionBounds is a method of the class Shape3D. I try to help you but you should really look at the examples I gave you and in the documentation.
Julien Gouesse | Personal blog | Website
Reply | Threaded
Open this post in threaded view
|

Re: Collision problem.

dfewfew
I do but there the use cubes and spheres and my object is torus.I whant to set the collision bounds in the shape of the object how to do this?
Reply | Threaded
Open this post in threaded view
|

Re: Collision problem.

gouessej
Administrator
Your method called loader() already returns a Shape3D, what's wrong then? What is missing?
Julien Gouesse | Personal blog | Website
Reply | Threaded
Open this post in threaded view
|

Re: Collision problem.

dfewfew
The collision bounds are in the shape of box ,not in the shape of the object.
Reply | Threaded
Open this post in threaded view
|

Re: Collision problem.

gouessej
Administrator
Yes, that's not a problem. A bounding volume is used to avoid heavy computations when it is easy and fast to determine that there is no collision, a more simple volume (a box, a sphere) is cheaper to use and it doesn't prevent you from using more accurate collision tests later. A modeler can give you an approximate bounding box and you can use it in your code or you can compute it.
Julien Gouesse | Personal blog | Website
Reply | Threaded
Open this post in threaded view
|

Re: Collision problem.

dfewfew
Yes  when I try to go through the center of the torus it collide.
Reply | Threaded
Open this post in threaded view
|

Re: Collision problem.

gouessej
Administrator
Then, is your problem solved?
Julien Gouesse | Personal blog | Website
Reply | Threaded
Open this post in threaded view
|

Re: Collision problem.

dfewfew
No I want to pass through the torus.But to collide if i hit the torus
Reply | Threaded
Open this post in threaded view
|

Re: Collision problem.

gouessej
Administrator
I see what you mean but I don't know how to achieve that with a single Shape3D.
Julien Gouesse | Personal blog | Website
Reply | Threaded
Open this post in threaded view
|

Re: Collision problem.

dfewfew
then what do you suggest?
Reply | Threaded
Open this post in threaded view
|

Re: Collision problem.

gouessej
Administrator
The library Jiglib is able to do that, maybe you could study its source code and adapt it for your needs.

Edit.: Maybe use the parametric equation of the torus:
http://www.joachim-reichel.de/publications/silvia-sm02.pdf
Julien Gouesse | Personal blog | Website
Reply | Threaded
Open this post in threaded view
|

Re: Collision problem.

dfewfew
But I dont want a new engine.
Reply | Threaded
Open this post in threaded view
|

Re: Collision problem.

gouessej
Administrator
What you are trying to do goes beyond the abilities of Java3D, you have to use a physics engine with it or to use parametric equations in your own code.
Julien Gouesse | Personal blog | Website