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); } } |
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
|
how to set the volumes?
|
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
|
Ok but how to set the bounds from a obj file?I have no idea.
|
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
|
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?
|
Administrator
|
Your method called loader() already returns a Shape3D, what's wrong then? What is missing?
Julien Gouesse | Personal blog | Website
|
The collision bounds are in the shape of box ,not in the shape of the object.
|
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
|
Yes when I try to go through the center of the torus it collide.
|
Administrator
|
Then, is your problem solved?
Julien Gouesse | Personal blog | Website
|
No I want to pass through the torus.But to collide if i hit the torus
|
Administrator
|
I see what you mean but I don't know how to achieve that with a single Shape3D.
Julien Gouesse | Personal blog | Website
|
then what do you suggest?
|
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
|
But I dont want a new engine.
|
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
|
Free forum by Nabble | Edit this page |