Beispiel für Kollisionserkennung gesucht

Seppel

Bekanntes Mitglied
Hi, neue Frage:

Da ich das letzte Thema mit dem Texturen geschnallt habe wll ich mich mit dem nächsten Thema beschäftigen:
Kollision

Da zu ahbe ich einige schöne Beispiel gefunden die aber mit vergleich von der Position funktionieren

auch für 3d habe ich ein zwei dinge gefunden die mir zwar die Grundidee rübergebracht haben, aber so das ich das dann auch anwenden kann wars dann doch nicht.

Hier mal was ich gefunden habe:
Java Tips - Collision Detection with Java3D

mein problem jetzt wo er kommen die bounds:
Java:
//Add our CollisionDetector class to detect collisions with
    //the movable cube.
    CollisionDetector myColDet = new CollisionDetector(moveCube, bounds);
    contentBranch.addChild(myColDet);

Ich hoffe das ich dann eventuell das Beispiel verwenden kann, vileicht gibt es ja noch irgend wo versteckt ein schöners
Das schönste wa ig gefunden habe war:
www2.hs-fulda.de/caelabor/inhalte/java/.../JAVA3D.doc

leider fehlt hier aber die verknüpfung zwischen der class und der transform, also der aufruf des behavior
danke
 
Zuletzt bearbeitet:

Michael...

Top Contributor
mein problem jetzt wo er kommen die bounds
die werden vermutlich irgendwo gesetzt oder berechnet.
Ich kenne Kollisionsberechnung primär aus dem CAD, hier wird u.a. mit Bounding-Boxes - Quadern, welche die Geometrie komplett umschließen - um ersteinmal auf groben Level festzustellen, ob eine Kollision grundsätzlich möglich wäre.
Daher nehme ich mal an, das die
Code:
bounds
hier auch einen solchen Quader beschreiben.
 

Seppel

Bekanntes Mitglied
ja wusst ig schon, habe die bound jetzt auch gefunden, so sieht jetzt mein Code aus:

ich erzeuge eine welt die im Transgroup "alle" steht
und einen Würfel
Java:
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0,     0.0), 100.0);
        CollisionDetector myColDet = new CollisionDetector(alle);
        
        Transform3D formen2=new Transform3D();
        formen2.setTranslation (new Vector3f (0,0, -20));
	    TransformGroup wurfel = new TransformGroup();	
	    
	    wurfel.setTransform(formen2);
	    wurfel.addChild(new Box(1,1,1, meinAchsenSetAppearance(new Color3f (Color.RED))));	
        wurfel.addChild(myColDet);

meine Class für die Collision ist:
Java:
class CollisionDetector extends Behavior    {
      TransformGroup t;
      WakeupCriterion [] conditions = new WakeupCriterion [3];

	public  CollisionDetector (TransformGroup t) { 
        this.t = t;
        //setSchedulingBounds(bounds);

        conditions [0] = new WakeupOnCollisionEntry (t);
        conditions [1] = new WakeupOnCollisionMovement (t);
        conditions [2] = new WakeupOnCollisionExit (t);
      }

      public void initialize (){        
    	  this.wakeupOn (new WakeupOr (conditions));
      }

      public void processStimulus (Enumeration criteria)  {       
        System.out.println("Kollision");        
        this.wakeupOn (new WakeupOnCollisionEntry (t));
      }
    }

als zum anfang gibt es jetzt zwei kollisionen, aber dann nicht mehr, wo liegt der Fehler?
 
Zuletzt bearbeitet:

Seppel

Bekanntes Mitglied
war schon dran, hoffe ist kurz genug
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.Enumeration;
import java.util.regex.Pattern;

import javax.media.j3d.*;
import javax.vecmath.*;

import com.sun.j3d.utils.universe.*;  //SimpleUniverse
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.geometry.Box;
import com.sun.j3d.utils.image.TextureLoader;

public class First3DProgram extends JFrame {
	//Fixe Zahlen
	int Max_ElEMENTE=100;
	int Max_TEXTUREN=100;
	int HÖCHE_MENSCH=2;
	static int xdurch=1;
	static int ydurch=1;
	public static final long serialVersionUID = 121121112l; 
	//Fenster Elemente
	static JFrame fenster;	SimpleUniverse simpleU;	Canvas3D c3d;
	//Bewegung/Steuerung
	Robot r; //verhindert Event
	int xRot=0, yRot=0, zRot=0;
	double  x=0,y=0,z=0;
	boolean left = false, right = false, up=false, down=false,hoch=false,runter=false,shut=false;
	boolean robotmove;
	
	//zum laden der Bilder
	ImageComponent2D image[]=new ImageComponent2D [Max_TEXTUREN];
    String imageName[]=new String[Max_TEXTUREN];
	
    //Groupen zur Bewegung
    //Statische
	Vector3f vector;
	Transform3D Transform= new Transform3D();
	TransformGroup alletrans = new TransformGroup();
	TransformGroup allerotX = new TransformGroup();
	TransformGroup allerotY = new TransformGroup();
	TransformGroup alle = new TransformGroup();
	//Selbstorganisierende
	int h2;
	Transform3D formSelbstorganisiered[]= new Transform3D[100];
	TransformGroup selbstorganisiered[] = new TransformGroup[100];
	
	//geladene Objekte
    TransformGroup childName[] = new TransformGroup[Max_ElEMENTE]; 
    String transgruppeName[] = new String[Max_ElEMENTE]; 
	
    //Adapter Klassen
    class WindowListener extends WindowAdapter {
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    }
    class MeinKeylistener extends KeyAdapter{
    	public void keyPressed(KeyEvent arg0) {
            if (arg0.getKeyCode() == KeyEvent.VK_LEFT) 				{left = true;} 	
            else if (arg0.getKeyCode() == KeyEvent.VK_RIGHT) 		{right = true;}	
            if (arg0.getKeyCode() == KeyEvent.VK_UP) 				{up = true;}	
            else if (arg0.getKeyCode() == KeyEvent.VK_DOWN) 		{down = true;}	
            if (arg0.getKeyCode() == KeyEvent.VK_PAGE_UP) 			{hoch = true;}	
            else if (arg0.getKeyCode() == KeyEvent.VK_PAGE_DOWN) 	{runter = true;}
            if (arg0.getKeyCode() == KeyEvent.VK_SPACE) 			{shut = true;}	
        }
     
        public void keyReleased(KeyEvent arg0) {
        	 if (arg0.getKeyCode() == KeyEvent.VK_LEFT) 			{left = false;} 	
        	 else if (arg0.getKeyCode() == KeyEvent.VK_RIGHT) 		{right = false;}	
             if (arg0.getKeyCode() == KeyEvent.VK_UP) 				{up = false;}	
             else if (arg0.getKeyCode() == KeyEvent.VK_DOWN) 		{down = false;}	
             if (arg0.getKeyCode() == KeyEvent.VK_PAGE_UP) 			{hoch = false;}	
             else if (arg0.getKeyCode() == KeyEvent.VK_PAGE_DOWN) 	{runter = false;}
             if (arg0.getKeyCode() == KeyEvent.VK_SPACE) 			{shut = false;}	
        }
     
        public void keyTyped(KeyEvent arg0) {}
     
       
    }
    class meineMausSicht2 extends MouseMotionAdapter{
    	

		public void mouseMoved(MouseEvent e) {
			if (robotmove==false ){
	    		//Roboter-Modus um Events zu ignorieren 			
	    		robotmove=true; 
	    		//Maus an neue Position bewegen 
	    		yRot=yRot+(e.getX()-c3d.getWidth()/2);	    		
	    		xRot=xRot+(e.getY()-c3d.getHeight()/2);
	    		if (xRot>120) xRot=120;
	    		if (xRot<-120) xRot=-120;
	    		r.mouseMove(fenster.getWidth()/2+(int) fenster.getLocation().getX(),fenster.getHeight()/2+(int) fenster.getLocation().getY()+11); 
	    		//Robotermodus aus 
	    		robotmove=false; 
			}
    	}
		public void mouseDragged(MouseEvent e) {
    		//Roboter-Modus um Events zu ignorieren 
    		robotmove=true; 
    		//Maus an neue Position bewegen 
    		//r.mouseMove(fenster.getWidth()/2,fenster.getHeight()/2); 
    		//Robotermodus aus 
    		robotmove=false; 
    	}
    }
    class meinActionListener implements ActionListener{
		public void actionPerformed(ActionEvent arg0) {
			System.exit(0);			
		}    	
    }
    
    class CollisionDetector extends Behavior    {
      TransformGroup t;
      WakeupCriterion [] conditions = new WakeupCriterion [3];

	public  CollisionDetector (TransformGroup t,Bounds bounds) { 
        this.t = t;
        setSchedulingBounds(bounds); 
        conditions [0] = new WakeupOnCollisionEntry (t);
        conditions [1] = new WakeupOnCollisionMovement (t);
        conditions [2] = new WakeupOnCollisionExit (t);
      }

      public void initialize (){       
    	  this.wakeupOn (new WakeupOr (conditions));
      }

      public void processStimulus (Enumeration criteria)  {       
        System.out.println("Kollision");        
        this.wakeupOn (new WakeupOnCollisionEntry (t));
      }
    }

	//Konstruktor
	public First3DProgram()  {
	    super ("Ein ColorCube");
	    try {r=new Robot();}   catch (AWTException e) {} 
	        
	    setCloseMenuBar (this);
	     //Jetzt kommt der 2D-Teil
	    c3d = new Canvas3D (SimpleUniverse.getPreferredConfiguration()){    	
			private static final long serialVersionUID = 1L;
			public void postRender()  {
	          super.postRender();
	          J3DGraphics2D g = getGraphics2D();
	          g.setColor (Color.RED);
	          g.setFont (new Font ("Serif", Font.BOLD, 15));
	          g.drawString ("2D Text Test", 20, getSize().height - 10);          
	          g.flush (true);
	        }      
	    };  
	    
	    //3DTeil
	    simpleU = new SimpleUniverse (c3d); 	   
	    BranchGroup scene = createSceneGraph();	    
	    simpleU.addBranchGraph (scene); 	    

        c3d.addKeyListener(new MeinKeylistener());
        c3d.addMouseMotionListener(new meineMausSicht2());
	    //simpleU.getViewingPlatform().setNominalViewingTransform();  
	   
	    //Sichtweite ändern
	    View v = simpleU.getViewer().getView();
	    v.setBackClipDistance(100); 
	    
	    add (c3d); 
	    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
	    
	}
	
	public BranchGroup createSceneGraph() {  
		vector=new Vector3f();
		vector.setX(0); vector.setY(0);    vector.setZ(-5);
	    BranchGroup objRoot = new BranchGroup();	    
	    Transform3D formen =new Transform3D();
	    
	    final Transform3D Rotationx =new Transform3D();
	    final Transform3D Rotationy =new Transform3D();
	    final Transform3D Rotationz =new Transform3D();	    
	    
	    TransformGroup alleWürfel = new TransformGroup();	

	    //Koordinatenachsen
	    formen.setTranslation (new Vector3f (34,0, 0));
	    TransformGroup xAchse = new TransformGroup();	
	    xAchse.setTransform(formen);
	    xAchse.addChild(new Box(35,1,1, meinAchsenSetAppearance(new Color3f (Color.RED))));	
	    formen.setTranslation (new Vector3f (0,19, 0));
	    TransformGroup yAchse = new TransformGroup();	
	    yAchse.setTransform(formen);
	    yAchse.addChild(new Box(1,20,1, meinAchsenSetAppearance(new Color3f (Color.BLUE))));	
	    formen.setTranslation (new Vector3f (0,0, 19));
	    TransformGroup zAchse = new TransformGroup();	
	    zAchse.setTransform(formen);	    
	    zAchse.addChild(new Box(1,1,20, meinAchsenSetAppearance(new Color3f (Color.GREEN))));	
	    alletrans.addChild(xAchse);
	    alletrans.addChild(yAchse);
	    alletrans.addChild(zAchse);
	    
	    String[] satz = null;
	    int i=0;
       	 
     	 //Add our CollisionDetector class to detect collisions with
        //the movable cube.
        BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0,     0.0), 100.0);
        CollisionDetector myColDet = new CollisionDetector(alle,bounds);        
        Transform3D formen2=new Transform3D();
        formen2.setTranslation (new Vector3f (0,0, -20));
	    TransformGroup wurfel = new TransformGroup();	
	    
	    wurfel.setTransform(formen2);
	    wurfel.addChild(new Box(1,1,1, meinAchsenSetAppearance(new Color3f (Color.RED))));	
        wurfel.addChild(myColDet);
        objRoot.addChild (wurfel); 	    
	    
	    Transform.setTranslation(vector);        	        
	    alletrans.setTransform(Transform);	    
	    alletrans.addChild(alleWürfel);	 	    
	    allerotY.addChild(alletrans);	    
	    allerotX.addChild(allerotY);
        alle.addChild(allerotX);     
	    objRoot.addChild (alle);    
	    
	    //Bewegung aktivieren
	    alle.setCapability( TransformGroup.ALLOW_TRANSFORM_WRITE );
	    alle.setCapability( TransformGroup.ALLOW_TRANSFORM_READ );
	    alletrans.setCapability( TransformGroup.ALLOW_TRANSFORM_WRITE );
	    alletrans.setCapability( TransformGroup.ALLOW_TRANSFORM_READ );
	    allerotX.setCapability( TransformGroup.ALLOW_TRANSFORM_WRITE );
	    allerotX.setCapability( TransformGroup.ALLOW_TRANSFORM_READ );
	    allerotY.setCapability( TransformGroup.ALLOW_TRANSFORM_WRITE );
	    allerotY.setCapability( TransformGroup.ALLOW_TRANSFORM_READ );
	    
        (new Thread() {
        	@Override
        	public void run() {
        	    while (!isInterrupted()) {
        	    	//Das Bewegen mit Winkel
        	    	double winkel=(Math.PI*2/100 * 	yRot*100/c3d.getWidth());
        	    	double winkel2=(Math.PI*2/100 * xRot*100/c3d.getHeight()); //erst nötg wenn: 1. Kollision erledigt ist und zweitens Erdanzieungskraft eingeschaltet ist
        	    	if (up == true) {
        	    		z = z + 0.2*(Math.cos(winkel));
        	    		x = x - 0.2*(Math.sin(winkel));        	    		
        	    	}else if (down == true)  {
        	    		z = z - 0.2*(Math.cos(winkel));
        	    		x = x + 0.2*(Math.sin(winkel));
        	    	}
        	    	if (left == true) {
        	    		x = x + 0.2*(Math.cos(winkel));
        	    		z = z + 0.2*(Math.sin(winkel));        	    		
        	    	}else if (right == true)  { 
        	    		x = x - 0.2*(Math.cos(winkel));
        	    		z = z - 0.2*(Math.sin(winkel));
        	    	}
        	    	if (hoch==true) y=y-0.2;
        	    	else if(runter==true) y=y+0.2;
        	    	
        	    	//Neuen Schuß auslösen
        	    	if(shut==true) { 
        	    		h2++;  
        	    		int k=0;
        	    		while(k<99){
        	    			formSelbstorganisiered[k].setTranslation (new Vector3f (0, -HÖCHE_MENSCH-1, -h2));	        
        	    			k++;
        	    	    }
        	    			      	    			     		
        		        
        	    	}
        	        
        	        vector.setX((float) x);
        	        vector.setY((float)y);
        	        vector.setZ((float)z);
        	        Transform.setTranslation(vector);  
        	        alletrans.setTransform(Transform);
        	        
        	        Rotationy.rotY (Math.PI*2/100 * yRot*100/ydurch);
        	        Rotationx.rotX (Math.PI*2/100 * xRot*100/xdurch); 
        	        Rotationz.rotZ (0); 
        	        allerotX.setTransform(Rotationx); 
        	        Rotationy.mul(Rotationz);
        	        allerotY.setTransform(Rotationy);        	        
            		
        	        try {sleep(10);}
        	        catch (InterruptedException e) {interrupt();}
        	    }
        	}
        	}).start();
              
	    //Licht
	    Color3f ambientLightColour = new Color3f(1f, 1f, 1f);
	    AmbientLight ambientLight = new AmbientLight(ambientLightColour);
	    ambientLight.setInfluencingBounds(new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 1000.0));
	    objRoot.addChild(ambientLight);
	    Color3f directionLightColour = new Color3f(1.0f, 1.0f, 1.0f);
	    Vector3f directionLightDir = new Vector3f(-1.0f, -1.0f, -1.0f);
	    DirectionalLight directionLight = new DirectionalLight(directionLightColour, directionLightDir);
	    directionLight.setInfluencingBounds(new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 1000.0));
	    objRoot.addChild(directionLight);
	    //
	    objRoot.compile ();	    
	    return objRoot;
	}	

	private Appearance meinAchsenSetAppearance(Color3f col){
		Appearance coneApp = new Appearance();
		coneApp.setColoringAttributes (new ColoringAttributes (col, ColoringAttributes.NICEST));
		
		return coneApp;
	}

	private void setCloseMenuBar (JFrame f)  {
	    JMenuBar jmb = new JMenuBar();
	    JMenu jm = new JMenu ("Datei");   jmb.add (jm);
	    JMenuItem close = new JMenuItem ("Beenden");   jm.add (close);
	    close.addActionListener (new meinActionListener());
	    f.setJMenuBar (jmb);
	}
	public static void main (String[]args)  {
		fenster=	new First3DProgram();
		fenster.setUndecorated(true);
		fenster.setSize (500, 500);
		xdurch=fenster.getHeight();
		ydurch=fenster.getWidth();
		fenster.setLocationRelativeTo (null);  //zentrieren
		fenster.setVisible (true);
	}
}
 

Marco13

Top Contributor
Mit der Collision Detection hatte ich selbst noch nicht gearbeitet (für das, was ich mit Java3D mal machen sollte, war die nicht genau genug - immerhin war das dann ein Anlass, eine Diplomarbeit über Kollisionserkennung zu schreiben ;) ) aber auch hab' jetzt mal als ersten Test auf die Schnelle die Methode zu
Java:
      public void processStimulus (Enumeration criteria)  {
        System.out.println("Kollision");
        WakeupCriterion theCriterion = (WakeupCriterion) criteria.nextElement();
        if (theCriterion instanceof WakeupOnCollisionEntry) {
              Node theLeaf = ((WakeupOnCollisionEntry) theCriterion)
                  .getTriggeringPath().getObject();
              System.out.println("Collided with " + theLeaf.getUserData());
            } else if (theCriterion instanceof WakeupOnCollisionExit) {
              Node theLeaf = ((WakeupOnCollisionExit) theCriterion)
                  .getTriggeringPath().getObject();
              System.out.println("Stopped colliding with  "
                  + theLeaf.getUserData());
            } else {
              Node theLeaf = ((WakeupOnCollisionMovement) theCriterion)
                  .getTriggeringPath().getObject();
              System.out.println("Moved whilst colliding with "
                  + theLeaf.getUserData());
        }
        this.wakeupOn (new WakeupOr (conditions));
      }
    }
geändert (von Java Tips - Collision Detection with Java3D ) und er gibt ständig was aus. Vielleicht hilft das ja schon.
 

Seppel

Bekanntes Mitglied
Jup, aber halt nur noch, selbst wenn keine Kolision ist, und wenn man den boundingsphere verkleinert gibts nen Fehler

Bachelarbeit darüber?
wenn de ne bessere Methode für die Kolision hast würde ich das auch nehmen ;)

ander Seits kann man ja auch erst mal eins hinbekommen :(
 

Marco13

Top Contributor
Ja, man muss auch prüfen, ob man "criteria.nextElement()" überhaupt aufrufen kann (d.h. ob es ein nextElement überhaupt gibt).
Diplomarbeit. Diplom war das, was man damals gemacht hat, als ich noch jung war ;) Das Thema war aber sehr speziell, d.h. es ging nicht um irgendwelche Boxes, die sich überschneiden oder nicht ;)
 

Seppel

Bekanntes Mitglied
sorry, aber muss deine Hilfe doch in anspruchnehmen, also habe die Fehlermeldung über Try abgewendet, jetzt merk ich das ja wirklich immer eine Meldung kommt, ich glaub ich habe das mit den Bounds net recht verstanden, habe mal den kompletten code beigefügt. muss man den dedector nun dem würfel oder doch dem rest als kind übergeben?
Übrigens danke für deine bisherige und zukünftige Hilfe

Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.Enumeration;
import java.util.regex.Pattern;

import javax.media.j3d.*;
import javax.vecmath.*;

import com.sun.j3d.utils.universe.*;  //SimpleUniverse
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.geometry.Box;
import com.sun.j3d.utils.image.TextureLoader;

public class First3DProgram extends JFrame {
	//Fixe Zahlen
		//Elemente
		int Max_ElEMENTE=100;
		int Max_TEXTUREN=100;
		// Allgemein
		int HÖCHE_MENSCH=2;
		static int xdurch=1;
		static int ydurch=1;
		public static final long serialVersionUID = 121121112l; 
		//Waffen
		int MAX_KUGELN=100,MAX_ROCKET=10,MAX_MINES=10;
	
	//Fenster Elemente
	static JFrame fenster;	SimpleUniverse simpleU;	Canvas3D c3d;
	
	//Bewegung/Steuerung
	Robot r; //verhindert Event
	int xRot=0, yRot=0, zRot=0;
	double  x=0,y=0,z=0;
	boolean left = false, right = false, up=false, down=false,hoch=false,runter=false,shut=false,reloot=false;
	int shutTime, reloadTime;
	boolean robotmove;
	
	//zum laden der Texturen
	ImageComponent2D image[]=new ImageComponent2D [Max_TEXTUREN];
    String imageName[]=new String[Max_TEXTUREN];
	
    //Groupen zur Bewegung
    //Statische
	Vector3f vector;
	Transform3D Transform= new Transform3D();
	TransformGroup alletrans = new TransformGroup();
	TransformGroup allerotX = new TransformGroup();
	TransformGroup allerotY = new TransformGroup();
	TransformGroup alle = new TransformGroup();
	
	//geladene Objekte
    TransformGroup childName[] = new TransformGroup[Max_ElEMENTE]; 
    String transgruppeName[] = new String[Max_ElEMENTE]; 
	
    //Kolision
    CollisionDetector myColDet; 
    
    //Adapter Klassen
    class WindowListener extends WindowAdapter {
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    }
    class MeinKeylistener extends KeyAdapter{
    	public void keyPressed(KeyEvent arg0) {
            if (arg0.getKeyCode() == KeyEvent.VK_LEFT) 				{left = true;} 	
            else if (arg0.getKeyCode() == KeyEvent.VK_RIGHT) 		{right = true;}	
            if (arg0.getKeyCode() == KeyEvent.VK_UP) 				{up = true;}	
            else if (arg0.getKeyCode() == KeyEvent.VK_DOWN) 		{down = true;}	
            if (arg0.getKeyCode() == KeyEvent.VK_PAGE_UP) 			{hoch = true;}	
            else if (arg0.getKeyCode() == KeyEvent.VK_PAGE_DOWN) 	{runter = true;}
            if (arg0.getKeyCode() == KeyEvent.VK_SPACE) 			{shut = true;}	
        }
     
        public void keyReleased(KeyEvent arg0) {
        	 if (arg0.getKeyCode() == KeyEvent.VK_LEFT) 			{left = false;} 	
        	 else if (arg0.getKeyCode() == KeyEvent.VK_RIGHT) 		{right = false;}	
             if (arg0.getKeyCode() == KeyEvent.VK_UP) 				{up = false;}	
             else if (arg0.getKeyCode() == KeyEvent.VK_DOWN) 		{down = false;}	
             if (arg0.getKeyCode() == KeyEvent.VK_PAGE_UP) 			{hoch = false;}	
             else if (arg0.getKeyCode() == KeyEvent.VK_PAGE_DOWN) 	{runter = false;}
             if (arg0.getKeyCode() == KeyEvent.VK_SPACE) 			{shut = false;}	
             if (arg0.getKeyCode() == KeyEvent.VK_R) 				{reloot=true;} 	
         	
        }
     
        public void keytypKugelned(KeyEvent arg0) {
        	
        	
        }
     
       
    }
    class meineMausSicht2 extends MouseMotionAdapter{
		public void mouseMoved(MouseEvent e) {
			if (robotmove==false ){
	    		//Roboter-Modus um Events zu ignorieren 			
	    		robotmove=true; 
	    		//Maus an neue Position bewegen 
	    		yRot=yRot+(e.getX()-c3d.getWidth()/2);	    		
	    		xRot=xRot+(e.getY()-c3d.getHeight()/2);
	    		if (xRot>120) xRot=120;
	    		if (xRot<-120) xRot=-120;
	    		r.mouseMove(fenster.getWidth()/2+(int) fenster.getLocation().getX(),fenster.getHeight()/2+(int) fenster.getLocation().getY()+11); 
	    		//Robotermodus aus 
	    		robotmove=false; 
			}
    	}
		public void mouseDragged(MouseEvent e) {
			if (robotmove==false ){
	    		//Roboter-Modus um Events zu ignorieren 			
	    		robotmove=true; 
	    		//Maus an neue Position bewegen 
	    		yRot=yRot+(e.getX()-c3d.getWidth()/2);	    		
	    		xRot=xRot+(e.getY()-c3d.getHeight()/2);
	    		if (xRot>120) xRot=120;
	    		if (xRot<-120) xRot=-120;
	    		r.mouseMove(fenster.getWidth()/2+(int) fenster.getLocation().getX(),fenster.getHeight()/2+(int) fenster.getLocation().getY()+11); 
	    		//Robotermodus aus 
	    		robotmove=false; 
			}
    	}
    }
    class meineMausKlick extends MouseAdapter{
    	public void mousePressed(MouseEvent e) {
    		shut=true;
    	    }

    	    public void mouseReleased(MouseEvent e) {
    	    	shut=false;
    	    }

    	    public void mouseEntered(MouseEvent e) {
    	     
    	    }

    	    public void mouseExited(MouseEvent e) {
    	      
    	    }

    	    public void mouseClicked(MouseEvent e) {
    	      shut=true;
    	    }


    }
    class meinActionListener implements ActionListener{
		public void actionPerformed(ActionEvent arg0) {
			System.exit(0);			
		}    	
    }
        
    class CollisionDetector extends Behavior    {
      TransformGroup t;
      WakeupCriterion [] conditions = new WakeupCriterion [3];

	public  CollisionDetector (TransformGroup t,Bounds bounds) { 
        this.t = t;
        setSchedulingBounds(bounds); 
        conditions [0] = new WakeupOnCollisionEntry (t);
        conditions [1] = new WakeupOnCollisionMovement (t);
        conditions [2] = new WakeupOnCollisionExit (t);
      }

      public void initialize (){       
    	  this.wakeupOn (new WakeupOr (conditions));
      }

      public void processStimulus (Enumeration criteria)  {
         try{
          WakeupCriterion theCriterion = (WakeupCriterion) criteria.nextElement();
          if (theCriterion instanceof WakeupOnCollisionEntry) {
                Node theLeaf = ((WakeupOnCollisionEntry) theCriterion).getTriggeringPath().getObject();
                System.out.println("Collided with " + theLeaf.getUserData()+ theLeaf.getName());
          } else if (theCriterion instanceof WakeupOnCollisionExit) {
                Node theLeaf = ((WakeupOnCollisionExit) theCriterion).getTriggeringPath().getObject();
                System.out.println("Stopped colliding with  "+ theLeaf.getUserData());
          } else {
                Node theLeaf = ((WakeupOnCollisionMovement) theCriterion).getTriggeringPath().getObject();
                System.out.println("Moved whilst colliding with "+ theLeaf.getUserData());
          }
         }
         catch(Exception e){}
          this.wakeupOn (new WakeupOr (conditions));
        }
      
    }

	//Konstruktor
	public First3DProgram()  {
	    super ("Ein ColorCube");
	    try {r=new Robot();}   catch (AWTException e) {} 
	        
	    setCloseMenuBar (this);
	     //Jetzt kommt der 2D-Teil
	    c3d = new Canvas3D (SimpleUniverse.getPreferredConfiguration());
	    
	    //3DTeil
	    simpleU = new SimpleUniverse (c3d); 	   
	    BranchGroup scene = createSceneGraph();	    
	    simpleU.addBranchGraph (scene); 	    

        c3d.addKeyListener(new MeinKeylistener());
        c3d.addMouseMotionListener(new meineMausSicht2());
	    //simpleU.getViewingPlatform().setNominalViewingTransform();  
	   
	    //Sichtweite ändern
	    View v = simpleU.getViewer().getView();
	    v.setBackClipDistance(100); 
	    
	    add (c3d); 
	    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
	    
	}
	
	//unterfunktionen für createSceneGraph
	public void loadTextur(){		 
	    //Texturen laden
	    try{
	    	int j=0;  		    
	        File dir = new File("Texturen" + File.separatorChar);       
	        String[] files = dir.list();
	        while (files.length>j){     
	        	 if(files[j].endsWith(".jpg") || files[j].endsWith(".gif")){
	        		TextureLoader loader = new TextureLoader("Texturen" + File.separatorChar + files[j], this);
	        		image[j] = loader.getImage();
	     			image[j].setCapability(ImageComponent2D.FORMAT_RGBA8);
	     			imageName[j]=files[j];
	     			System.out.println(files[j] + " geladen!");
	             }        	          
	        	 j++;
	        }
	    }catch(Exception e){}
	}
	public void loadKoordinaten(){
		Transform3D formen =new Transform3D();
		formen.setTranslation (new Vector3f (34,0, 0));
	    TransformGroup xAchse = new TransformGroup();	
	    xAchse.setTransform(formen);
	    xAchse.addChild(new Box(35,1,1, meinAchsenSetAppearance(new Color3f (Color.RED))));	
	    formen.setTranslation (new Vector3f (0,19, 0));
	    TransformGroup yAchse = new TransformGroup();	
	    yAchse.setTransform(formen);
	    yAchse.addChild(new Box(1,20,1, meinAchsenSetAppearance(new Color3f (Color.BLUE))));	
	    formen.setTranslation (new Vector3f (0,0, 19));
	    TransformGroup zAchse = new TransformGroup();	
	    zAchse.setTransform(formen);	    
	    zAchse.addChild(new Box(1,1,20, meinAchsenSetAppearance(new Color3f (Color.GREEN))));	
	    alletrans.addChild(xAchse);
	    alletrans.addChild(yAchse);
	    alletrans.addChild(zAchse);
	}
	
	public TransformGroup himmel(){
		//Himmel
		TransformGroup transgruppe = new TransformGroup(); 
	    QuadArray polygon2 = new QuadArray (4,QuadArray.COORDINATES | GeometryArray.TEXTURE_COORDINATE_2);
    	polygon2.setCoordinate (0, new Point3f (-10f, 50f, -10f));
    	polygon2.setCoordinate (1, new Point3f (1000f, 50f, -10f));
    	polygon2.setCoordinate (2, new Point3f (1000f, 50f, 1000f));
    	polygon2.setCoordinate (3, new Point3f (-10f, 50f, 1000f));
    	polygon2.setTextureCoordinate (0, new Point2f(0.0f,0.0f));
    	polygon2.setTextureCoordinate (1, new Point2f(1.0f,0.0f)); 
        polygon2.setTextureCoordinate (2, new Point2f(1.0f,1.0f));
        polygon2.setTextureCoordinate (3, new Point2f(0.0f,1.0f));
        transgruppe.addChild(new Shape3D(polygon2,meinSetAppearance(new Color3f (Color.BLUE),"Rasen3.jpg"))); 
        return  transgruppe;    
	}
	public TransformGroup boden(){
		//Boden
		TransformGroup transgruppe = new TransformGroup(); 
	    QuadArray polygon1 = new QuadArray (4,QuadArray.COORDINATES | GeometryArray.TEXTURE_COORDINATE_2);
    	polygon1.setCoordinate (3, new Point3f (-10f, -4.1f, -10f));
    	polygon1.setCoordinate (2, new Point3f (1000f, -4.1f, -10f));
    	polygon1.setCoordinate (1, new Point3f (1000f, -4.1f, 1000f));
    	polygon1.setCoordinate (0, new Point3f (-10f, -4.1f, 1000f));
    	polygon1.setTextureCoordinate (0, new Point2f(0.0f,0.0f));
    	polygon1.setTextureCoordinate (1, new Point2f(1.0f,0.0f)); 
        polygon1.setTextureCoordinate (2, new Point2f(1.0f,1.0f));
        polygon1.setTextureCoordinate (3, new Point2f(0.0f,1.0f));
        transgruppe.addChild(new Shape3D(polygon1,meinSetAppearance(new Color3f (Color.GREEN),"Rasen3.jpg")));        
        return  transgruppe;  
	}
	
	public BranchGroup createSceneGraph() {  
		vector=new Vector3f();
		vector.setX(0); vector.setY(0);    vector.setZ(-5);
	    BranchGroup objRoot = new BranchGroup();
	    
	    final Transform3D Rotationx =new Transform3D();
	    final Transform3D Rotationy =new Transform3D();
	    final Transform3D Rotationz =new Transform3D();	
	    TransformGroup transgruppe[] = new TransformGroup[Max_ElEMENTE]; 
	    TransformGroup alleWürfel = new TransformGroup();	
	   
	    //texturen laden
	    loadTextur();
	    //Koordinatenachsen
	    loadKoordinaten();
	    //Add our CollisionDetector class to detect collisions with
        //the movable cube.
	    Transform3D formen2=new Transform3D();
        formen2.setTranslation (new Vector3f (0,0, -20));
        TransformGroup wurfel = new TransformGroup();   
        wurfel.setTransform(formen2);
        wurfel.addChild(new Box(1,1,1, meinAchsenSetAppearance(new Color3f (Color.RED))));  
        
        BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0,     0.0), 1.0);
        myColDet = new CollisionDetector(wurfel,bounds);        
        alle.addChild(myColDet);
        objRoot.addChild (wurfel); 
   
        
	    //Welt zeichnen
	    //alletrans.addChild(weltZeichnen());	sollteste nicht brauchen, da die txt Datei wo die vektoren drin sind eh ne hast
	    //Himmel und erde
	    alletrans.addChild(himmel());
	    alletrans.addChild(boden());    
	    
        //Zusammensetzen
	    Transform.setTranslation(vector);        	        
	    alletrans.setTransform(Transform);
	    allerotY.addChild(alletrans);	    
	    allerotX.addChild(allerotY);
        alle.addChild(allerotX);     
	    objRoot.addChild (alle);    
	    
	    //Bewegung aktivieren
	    alle.setCapability( TransformGroup.ALLOW_TRANSFORM_WRITE );
	    alle.setCapability( TransformGroup.ALLOW_TRANSFORM_READ );
	    alletrans.setCapability( TransformGroup.ALLOW_TRANSFORM_WRITE );
	    alletrans.setCapability( TransformGroup.ALLOW_TRANSFORM_READ );
	    allerotX.setCapability( TransformGroup.ALLOW_TRANSFORM_WRITE );
	    allerotX.setCapability( TransformGroup.ALLOW_TRANSFORM_READ );
	    allerotY.setCapability( TransformGroup.ALLOW_TRANSFORM_WRITE );
	    allerotY.setCapability( TransformGroup.ALLOW_TRANSFORM_READ );
	
        (new Thread() {
        	@Override
        	public void run() {
        	    while (!isInterrupted()) {
        	    	//Das Bewegen mit Winkel
        	    	double winkel=(Math.PI*2/100 * 	yRot*100/c3d.getWidth());
        	    	double winkel2=(Math.PI*2/100 * xRot*100/c3d.getHeight()); //erst nötg wenn: 1. Kollision erledigt ist und zweitens Erdanzieungskraft eingeschaltet ist
        	    	if (up == true) {
        	    		z = z + 0.2*(Math.cos(winkel));
        	    		x = x - 0.2*(Math.sin(winkel));        	    		
        	    	}else if (down == true)  {
        	    		z = z - 0.2*(Math.cos(winkel));
        	    		x = x + 0.2*(Math.sin(winkel));
        	    	}
        	    	if (left == true) {
        	    		x = x + 0.2*(Math.cos(winkel));
        	    		z = z + 0.2*(Math.sin(winkel));        	    		
        	    	}else if (right == true)  { 
        	    		x = x - 0.2*(Math.cos(winkel));
        	    		z = z - 0.2*(Math.sin(winkel));
        	    	}
        	    	if (hoch==true) y=y-0.2;
        	    	else if(runter==true) y=y+0.2;
        	    	
    	    		
        	        vector.setX((float) x);
        	        vector.setY((float)y);
        	        vector.setZ((float)z);
        	        Transform.setTranslation(vector);  
        	        alletrans.setTransform(Transform);
        	        
        	        Rotationy.rotY (Math.PI*2/100 * yRot*100/ydurch);
        	        Rotationx.rotX (Math.PI*2/100 * xRot*100/xdurch); 
        	        Rotationz.rotZ (0); 
        	        allerotX.setTransform(Rotationx); 
        	        Rotationy.mul(Rotationz);
        	        allerotY.setTransform(Rotationy);        	        
            		
        	        try {sleep(10);}
        	        catch (InterruptedException e) {interrupt();}
        	    }
        	}
        	}).start();
              
	    //Licht
	    Color3f ambientLightColour = new Color3f(1f, 1f, 1f);
	    AmbientLight ambientLight = new AmbientLight(ambientLightColour);
	    ambientLight.setInfluencingBounds(new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 1000.0));
	    objRoot.addChild(ambientLight);
	    Color3f directionLightColour = new Color3f(1.0f, 1.0f, 1.0f);
	    Vector3f directionLightDir = new Vector3f(-1.0f, -1.0f, -1.0f);
	    DirectionalLight directionLight = new DirectionalLight(directionLightColour, directionLightDir);
	    directionLight.setInfluencingBounds(new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 1000.0));
	    objRoot.addChild(directionLight);
	    //
	    objRoot.compile ();
	    
	    return objRoot;
	}	

  
			
	private Appearance meinSetAppearance(Color3f col,String Textur){
		Appearance coneApp = new Appearance();

		int j=0;
		try{
			while (!imageName[j].equals(Textur) && j<99){j++;}
			if(j!=99){
				ImageComponent2D imageNow = image[j];	
				Texture2D texture = new Texture2D();
				int form  = texture.getFormat();
			    int base = texture.getMipMapMode();
			    texture = new Texture2D(base,form,imageNow.getWidth(),imageNow.getHeight());			    
			    coneApp.setTexture(texture);			    
				texture.setImage(0, imageNow);	
			}
			else{System.out.println("Textur exestiert nicht!");}
			
		}catch(Exception e){
			if(!Textur.equals(""))System.out.println(Textur +" kann nicht geladen werden! "+e);
		}
		
		coneApp.setColoringAttributes (new ColoringAttributes (col, ColoringAttributes.NICEST));
		coneApp.setPolygonAttributes (new PolygonAttributes (PolygonAttributes.POLYGON_FILL, PolygonAttributes.CULL_BACK, 0));
		TextureAttributes texat = new TextureAttributes(TextureAttributes.MODULATE ,new          Transform3D(),new Color4f(),TextureAttributes.NICEST);
		coneApp.setTextureAttributes(texat);
		coneApp.setMaterial(new Material());
		return coneApp;
	}
	private Appearance meinAchsenSetAppearance(Color3f col){
		Appearance coneApp = new Appearance();
		coneApp.setColoringAttributes (new ColoringAttributes (col, ColoringAttributes.NICEST));
		
		return coneApp;
	}
	
	//Beenden-Menu
	private void setCloseMenuBar (JFrame f)  {
	    JMenuBar jmb = new JMenuBar();
	    JMenu jm = new JMenu ("Datei");   jmb.add (jm);
	    JMenuItem close = new JMenuItem ("Beenden");   jm.add (close);
	    close.addActionListener (new meinActionListener());
	    f.setJMenuBar (jmb);
	}
	
    //Startmethode
	public static void main (String[]args)  {
		fenster=	new First3DProgram();
		fenster.setUndecorated(true);
		fenster.setSize (500, 500);
		xdurch=fenster.getHeight();
		ydurch=fenster.getWidth();
		fenster.setLocationRelativeTo (null);  //zentrieren
		fenster.setVisible (true);
	}
}
Und wie gesagt hast Zeit, ich kann auch erst mal anderes machen...
Danke
 

Marco13

Top Contributor
Wie schon erwähnt hatte ich mit CollisionDetection in Java3D noch nichts gemacht, ich müßte mir das näher ansehen. Wenn du nächste Woche, so Mi oder Do den Thread hier mal 'BUMP'st oder eine PN schreibst, falls es sich bis dahin noch nicht erledigt hat, schau' ich nochmal. Aber auch bei mir würde es teilweise darauf rauslaufen, dass ich an dem KSKB ein bißchen rumspiele, um zu sehen, wie das so funktioniert... also, eine konkrete Frage wäre dann vielleicht schon hilfreich.
 

Seppel

Bekanntes Mitglied
Ja mach ich, ich denke s wird einfach am verständniss dafür fehlen
habe da Programmm nach dem kürzen nur noch einen Würfel und ein Fläche erzeuegen lassen, sowie aus der Bouning Spehre ine Bounding Box gemacht, aber es kommt immer:
Moved whilst colliding with null
egal wo in dieser "Welt"

Ich nehme an: wenn ich die statische Welt, also alles was sich umeinen dreht,(Häuser, Bäume..) in eine Transgruppe adde, und diese Gruppe dann dem Collsionsdedector übergebe so macht der um alles einen "Bound" oder?, wäre ja auch nicht garade ideal, aber über jede Box ein eigenes Bound zumachen wäre sehr umfangreich
Vielleicht erst mal das versuchen zu klären,
aber am ende selbst wenn ich nur zwei Würfel habe, so kommt es immer zur Collision with null
 

Seppel

Bekanntes Mitglied
versteh ich dich recht:
also wenn ich eine Gruppe dem Collisions Adapter adde so ist der bound um alle?, wie aber soll ich das am besten für jedes objekt machen?:
Java:
 //Add our CollisionDetector class to detect collisions with
        //the movable cube.
        BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0,     0.0), 1.0);
        myColDet = new CollisionDetector(alleObjekteInEinerGruppe,bounds);        
        Transform3D formen2=new Transform3D();
        formen2.setTranslation (new Vector3f (0,0, -10));
        TransformGroup wurfel = new TransformGroup();   
        
        wurfel.setTransform(formen2);
        wurfel.addChild(new Box(1,1,1, meinAchsenSetAppearance(new Color3f (Color.RED))));  
        wurfel.addChild(myColDet);
        objRoot.addChild (wurfel);

ich kann doch nicht für jedes Objekt:
myColDet = new CollisionDetector(????????,bounds);
neu schreiben!?
 

Marco13

Top Contributor
Vielleicht schon, aber dazu müßte ich mir 1. das bisher gepostete genauer ansehen, 2. die Java3D-CollDet genauer ansehen, 3. genauer wissen, was du vorhast...
 

Seppel

Bekanntes Mitglied
1. --> hast ja Zeit
2. -->wie 1.
3. --> eine kleine 3d Welt mit Häußern (zwei sind schon fertig) und Bäumen w man durchlaufen kann eventuell schießen --> also ein kleines 3d ballerspiel, vorbei nicht auf das ballern viel wert gelegt werden soll, sondern darauf das die Grundlagen funktionieren.

Im Moment habe ich die Häußer als Boxen zusammengesetzt. Die vektoren hierfü stehen in txt -datein, die ausgelesenund dann dargestellt werden.

Ich könnte dir sicher die ganze Welt geben, aber im Prinzip müsste es ja schon reichen wenn die 3 koordinaten achsen angezeigt werden und man mit diesen eventuell die Kollision testet, so das halt immer kontrolliert wird ob mit einem der Achsen kontakt aufgenommen wird. Erweitern lässt sich das dann sicherlich. Zum Test soll der Rote Quarder fr die kollision dienen.

:)
 

Seppel

Bekanntes Mitglied
So mal ein bump, bin nicht weiter gekommen bezüglich kolision.
Ich habe zwar vorige Woche welche angeschrieben die das Thema hier im Forum schon gelöst haben , aber keiner antwortet
 

Seppel

Bekanntes Mitglied
Also im grunde hier noch mal die alte vesion, da neuerungen bezüglich Kollision nix gebracht haben und die anderen kürzbar sind.
Also zusehen sind Boden und Himmel sowie 3 Koordianten achsen Bewegung ist noch möglich über w-a-s-d,maus und bild up und down
Wenn du durch die Welt gehts kommt immer eine Meldung:
"Moved whilst colliding with null"
mit Null ist ja uninteresant, aber es kollidiert nur mit ull und nix anderem
hoffe du hast ne Idee, bzw findest den Fehler, sonst lass ig es sein.

Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Enumeration;
import java.util.regex.Pattern;

import javax.media.j3d.*;
import javax.vecmath.*;

import com.sun.j3d.utils.universe.*;  //SimpleUniverse
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.geometry.Box;
import com.sun.j3d.utils.image.TextureLoader;

public class First3DProgram extends JFrame {
	//Fixe Zahlen
		//Elemente
		int  Max_ElEMENTE=300;
		int Max_TEXTUREN=50;
		// Allgemein
		static int xdurch=1;
		static int ydurch=1;
		public static final long serialVersionUID = 121121112l; 

	//Fenster Elemente
	static JFrame fenster;	SimpleUniverse simpleU;	Canvas3D c3d;
	
	//Bewegung/Steuerung
	Robot r; //verhindert Event
	int xRot=0, yRot=0, zRot=0;
	double  x=0,y=0,z=0;
	boolean left = false, right = false, up=false, down=false,hoch=false,runter=false,shut=false,reloot=false;	

	boolean robotmove;
	
	//zum laden der Texturen
	ImageComponent2D image[]=new ImageComponent2D [Max_TEXTUREN];
    String imageName[]=new String[Max_TEXTUREN];
	
    //Groupen zur Bewegung
	    //Statische
		Vector3f vector;
		Transform3D Transform= new Transform3D();
		TransformGroup alletrans = new TransformGroup();
		TransformGroup allerotX = new TransformGroup();
		TransformGroup allerotY = new TransformGroup();
		TransformGroup alle = new TransformGroup();
	
		//Selbstorganisierende
		//Bewegung
		TransformGroup selbsttrans = new TransformGroup();
		
		//Bei Man
		TransformGroup transgruppeMove[] = new TransformGroup[Max_ElEMENTE]; 
	
	//geladene Objekte
    TransformGroup childName[] = new TransformGroup[Max_ElEMENTE]; 
    String transgruppeName[] = new String[Max_ElEMENTE]; 
	
    //Kolision
    CollisionDetector myColDet; 

    //Adapter Klassen
    class WindowListener extends WindowAdapter {
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    }
    class MeinKeylistener extends KeyAdapter{
    	public void keyPressed(KeyEvent arg0) {
            if (arg0.getKeyCode() == KeyEvent.VK_A) 				{left = true;} 	
            else if (arg0.getKeyCode() == KeyEvent.VK_D) 		{right = true;}	
            if (arg0.getKeyCode() == KeyEvent.VK_W) 				{up = true;}	
            else if (arg0.getKeyCode() == KeyEvent.VK_S) 		{down = true;}	
            if (arg0.getKeyCode() == KeyEvent.VK_PAGE_UP) 			{hoch = true;}	
            else if (arg0.getKeyCode() == KeyEvent.VK_PAGE_DOWN) 	{runter = true;}
        }
     
        public void keyReleased(KeyEvent arg0) {
        	//bewegung        	
        	 if (arg0.getKeyCode() == KeyEvent.VK_A) 			{left = false;} 	
        	 else if (arg0.getKeyCode() == KeyEvent.VK_D) 		{right = false;}	
             if (arg0.getKeyCode() == KeyEvent.VK_W) 				{up = false;}	
             else if (arg0.getKeyCode() == KeyEvent.VK_S) 		{down = false;}	
             if (arg0.getKeyCode() == KeyEvent.VK_PAGE_UP) 			{hoch = false;}	
             else if (arg0.getKeyCode() == KeyEvent.VK_PAGE_DOWN) 	{runter = false;}
        }
     
        public void keytypKugelned(KeyEvent arg0) {
        	
        	
        }
     
       
    }
    class meineMausSicht2 extends MouseMotionAdapter{
		public void mouseMoved(MouseEvent e) {
			if (robotmove==false ){
	    		//Roboter-Modus um Events zu ignorieren 			
	    		robotmove=true; 
	    		//Maus an neue Position bewegen 
	    		yRot=yRot+(e.getX()-c3d.getWidth()/2);	    		
	    		xRot=xRot+(e.getY()-c3d.getHeight()/2);
	    		if (xRot>120) xRot=120;
	    		if (xRot<-120) xRot=-120;
	    		r.mouseMove(fenster.getWidth()/2+(int) fenster.getLocation().getX(),fenster.getHeight()/2+(int) fenster.getLocation().getY()+11); 
	    		//Robotermodus aus 
	    		robotmove=false; 
			}
    	}
		public void mouseDragged(MouseEvent e) {
			if (robotmove==false ){
	    		//Roboter-Modus um Events zu ignorieren 			
	    		robotmove=true; 
	    		//Maus an neue Position bewegen 
	    		yRot=yRot+(e.getX()-c3d.getWidth()/2);	    		
	    		xRot=xRot+(e.getY()-c3d.getHeight()/2);
	    		if (xRot>120) xRot=120;
	    		if (xRot<-120) xRot=-120;
	    		r.mouseMove(fenster.getWidth()/2+(int) fenster.getLocation().getX(),fenster.getHeight()/2+(int) fenster.getLocation().getY()+11); 
	    		//Robotermodus aus 
	    		robotmove=false; 
			}
    	}
    }
   
    class meinActionListener implements ActionListener{
		public void actionPerformed(ActionEvent arg0) {
			System.exit(0);			
		}    	
    }
    class CollisionDetector extends Behavior    {
      TransformGroup t;
      WakeupCriterion [] conditions = new WakeupCriterion [3];

      public  CollisionDetector (TransformGroup t,Bounds bounds) { 
        this.t = t;
        setSchedulingBounds(bounds); 
        conditions [0] = new WakeupOnCollisionEntry (t);
        conditions [1] = new WakeupOnCollisionMovement (t);
        conditions [2] = new WakeupOnCollisionExit (t);
      }

      public void initialize (){       
    	  this.wakeupOn (new WakeupOr (conditions));
      }

      public void processStimulus (Enumeration criteria)  {
         try{
        	 WakeupCriterion theCriterion;
             while (criteria.hasMoreElements()) {
            	 theCriterion = (WakeupCriterion) criteria.nextElement();

		          if (theCriterion instanceof WakeupOnCollisionEntry) {
		                Node theLeaf = ((WakeupOnCollisionEntry) theCriterion).getTriggeringPath().getObject();
		                System.out.println("Collided with " + theLeaf.getUserData()+ theLeaf.getName());
		          } else if (theCriterion instanceof WakeupOnCollisionExit) {
		                Node theLeaf = ((WakeupOnCollisionExit) theCriterion).getTriggeringPath().getObject();
		                System.out.println("Stopped colliding with  "+ theLeaf.getUserData());
		          } else {
		                Node theLeaf = ((WakeupOnCollisionMovement) theCriterion).getTriggeringPath().getObject();
		                System.out.println("Moved whilst colliding with "+ theLeaf.getUserData());
		          }
             }
         }
         catch(Exception e){}
          this.wakeupOn (new WakeupOr (conditions));
        }
      
    }

	//Konstruktor
	public First3DProgram()  {
	    super ("Ein ColorCube");
	    try {r=new Robot();}   catch (AWTException e) {} 
	        
	    setCloseMenuBar (this);
	     //Jetzt kommt der 2D-Teil
	    c3d = new Canvas3D (SimpleUniverse.getPreferredConfiguration());  
	    
	    //3DTeil
	    simpleU = new SimpleUniverse (c3d); 	   
	    BranchGroup scene = createSceneGraph();	    
	    simpleU.addBranchGraph (scene); 	    

        c3d.addKeyListener(new MeinKeylistener());
        c3d.addMouseMotionListener(new meineMausSicht2());
        
	    //simpleU.getViewingPlatform().setNominalViewingTransform();  
	   
	    //Sichtweite ändern
	    View v = simpleU.getViewer().getView();
	    v.setBackClipDistance(1000); 
	    setCursor(java.awt.Toolkit.getDefaultToolkit().createCustomCursor(new BufferedImage(1,1,BufferedImage.TYPE_4BYTE_ABGR),new java.awt.Point(0,0),"NOCURSOR"));
	    add (c3d); 
	    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
	    
	}
	
	//unterfunktionen für createSceneGraph
	public void loadKoordinaten(){
		Transform3D formen =new Transform3D();
		formen.setTranslation (new Vector3f (34,0, 0));
	    TransformGroup xAchse = new TransformGroup();	
	    xAchse.setTransform(formen);
	    xAchse.addChild(new Box(35,1,1, meinAchsenSetAppearance(new Color3f (Color.RED))));	
	    formen.setTranslation (new Vector3f (0,19, 0));
	    TransformGroup yAchse = new TransformGroup();	
	    yAchse.setTransform(formen);
	    yAchse.addChild(new Box(1,20,1, meinAchsenSetAppearance(new Color3f (Color.BLUE))));	
	    formen.setTranslation (new Vector3f (0,0, 19));
	    TransformGroup zAchse = new TransformGroup();	
	    zAchse.setTransform(formen);	    
	    zAchse.addChild(new Box(1,1,20, meinAchsenSetAppearance(new Color3f (Color.GREEN))));	
	    alletrans.addChild(xAchse);
	    alletrans.addChild(yAchse);
	    alletrans.addChild(zAchse);
	}
	public TransformGroup himmel(){
		//Himmel
		TransformGroup transgruppe = new TransformGroup(); 
	    QuadArray polygon2 = new QuadArray (4,QuadArray.COORDINATES | GeometryArray.TEXTURE_COORDINATE_2);
    	polygon2.setCoordinate (0, new Point3f (-10f, 50f, -10f));
    	polygon2.setCoordinate (1, new Point3f (1000f, 50f, -10f));
    	polygon2.setCoordinate (2, new Point3f (1000f, 50f, 1000f));
    	polygon2.setCoordinate (3, new Point3f (-10f, 50f, 1000f));
    	polygon2.setTextureCoordinate (0, new Point2f(0.0f,0.0f));
    	polygon2.setTextureCoordinate (1, new Point2f(1.0f,0.0f)); 
        polygon2.setTextureCoordinate (2, new Point2f(1.0f,1.0f));
        polygon2.setTextureCoordinate (3, new Point2f(0.0f,1.0f));
        transgruppe.addChild(new Shape3D(polygon2,meinAchsenSetAppearance(new Color3f (Color.BLUE)))); 
        return  transgruppe;    
	}
	public TransformGroup boden(){
		//Boden
		TransformGroup transgruppe = new TransformGroup(); 
	    QuadArray polygon1 = new QuadArray (4,QuadArray.COORDINATES | GeometryArray.TEXTURE_COORDINATE_2);
    	polygon1.setCoordinate (3, new Point3f (-10f, -4.1f, -10f));
    	polygon1.setCoordinate (2, new Point3f (1000f, -4.1f, -10f));
    	polygon1.setCoordinate (1, new Point3f (1000f, -4.1f, 1000f));
    	polygon1.setCoordinate (0, new Point3f (-10f, -4.1f, 1000f));
    	polygon1.setTextureCoordinate (0, new Point2f(0.0f,0.0f));
    	polygon1.setTextureCoordinate (1, new Point2f(1.0f,0.0f)); 
        polygon1.setTextureCoordinate (2, new Point2f(1.0f,1.0f));
        polygon1.setTextureCoordinate (3, new Point2f(0.0f,1.0f));
        transgruppe.addChild(new Shape3D(polygon1,meinAchsenSetAppearance(new Color3f (Color.GREEN))));        
        return  transgruppe;  
	}

	public BranchGroup createSceneGraph() {  
		vector=new Vector3f();
		vector.setX(0); vector.setY(0);    vector.setZ(-5);
	    BranchGroup objRoot = new BranchGroup();
	    objRoot.setCapability(BranchGroup.ALLOW_DETACH);
	    objRoot.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND);
	    
	     
	    final Transform3D Rotationx =new Transform3D();
	    final Transform3D Rotationy =new Transform3D();
	    final Transform3D Rotationz =new Transform3D();	
	    TransformGroup transgruppe[] = new TransformGroup[Max_ElEMENTE]; 
	    TransformGroup alleWürfel = new TransformGroup();	   
	   
	    //Koordinatenachsen
	    loadKoordinaten();
	    
	    //Add our CollisionDetector class to detect collisions with
        //the movable cube.
        BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0,     0.0), 1.0);
        myColDet = new CollisionDetector(alle,bounds);        
        Transform3D formen2=new Transform3D();
        formen2.setTranslation (new Vector3f (0,0, -10));
        TransformGroup wurfel = new TransformGroup();   
        
        wurfel.setTransform(formen2);
        wurfel.addChild(new Box(1,1,1, meinAchsenSetAppearance(new Color3f (Color.RED))));  
        wurfel.addChild(myColDet);
        objRoot.addChild (wurfel);    
        
	    //Himmel und erde
	    alletrans.addChild(himmel());
	    alletrans.addChild(boden());   
	    
        //Zusammensetzen
	    Transform.setTranslation(vector);        	        
	    alletrans.setTransform(Transform);
	    allerotY.addChild(alletrans);	    
	    allerotX.addChild(allerotY);
        alle.addChild(allerotX);     
	    objRoot.addChild (alle);    
	    
	    //Bewegung aktivieren
	    alle.setCapability( TransformGroup.ALLOW_TRANSFORM_WRITE );
	    alle.setCapability( TransformGroup.ALLOW_TRANSFORM_READ );
	    alletrans.setCapability( TransformGroup.ALLOW_TRANSFORM_WRITE );
	    alletrans.setCapability( TransformGroup.ALLOW_TRANSFORM_READ );
	    allerotX.setCapability( TransformGroup.ALLOW_TRANSFORM_WRITE );
	    allerotX.setCapability( TransformGroup.ALLOW_TRANSFORM_READ );
	    allerotY.setCapability( TransformGroup.ALLOW_TRANSFORM_WRITE );
	    allerotY.setCapability( TransformGroup.ALLOW_TRANSFORM_READ );
	    
        (new Thread() {
        	@Override
        	public void run() {
        	    while (!isInterrupted()) {
        	    	//Das Bewegen mit Winkel
        	    	double winkel=(Math.PI*2/100 * 	yRot*100/c3d.getWidth());
        	    	
        	    	float geschw=0.3f;        	    	
        	    	if (up == true) {
        	    		z = z + geschw*(Math.cos(winkel));
        	    		x = x - geschw*(Math.sin(winkel));        	    		
        	    	}else if (down == true)  {
        	    		z = z - geschw*(Math.cos(winkel));
        	    		x = x + geschw*(Math.sin(winkel));
        	    	}
        	    	if (left == true) {
        	    		x = x + geschw*(Math.cos(winkel));
        	    		z = z + geschw*(Math.sin(winkel));        	    		
        	    	}else if (right == true)  { 
        	    		x = x - geschw*(Math.cos(winkel));
        	    		z = z - geschw*(Math.sin(winkel));
        	    	}
        	    	if (hoch==true) y=y-geschw;
        	    	else if(runter==true) y=y+geschw;        	    	
        	        
        	        //statisch
        	        vector.setX((float) x);
        	        vector.setY((float)y);
        	        vector.setZ((float)z);
        	        Transform.setTranslation(vector);  
        	        alletrans.setTransform(Transform);
        	        
        	        Rotationy.rotY (Math.PI*2/100 * yRot*100/ydurch);
        	        Rotationx.rotX (Math.PI*2/100 * xRot*100/xdurch); 
        	        Rotationz.rotZ (0); 
        	        allerotX.setTransform(Rotationx); 
        	        Rotationy.mul(Rotationz);
        	        allerotY.setTransform(Rotationy);        	        
            		
        	        try {sleep(10);}
        	        catch (InterruptedException e) {interrupt();}
        	    }
        	}
        	}).start();
              
	    //Licht
	    Color3f ambientLightColour = new Color3f(1f, 1f, 1f);
	    AmbientLight ambientLight = new AmbientLight(ambientLightColour);
	    ambientLight.setInfluencingBounds(new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 1000.0));
	    objRoot.addChild(ambientLight);
	    Color3f directionLightColour = new Color3f(1.0f, 1.0f, 1.0f);
	    Vector3f directionLightDir = new Vector3f(-1.0f, -1.0f, -1.0f);
	    DirectionalLight directionLight = new DirectionalLight(directionLightColour, directionLightDir);
	    directionLight.setInfluencingBounds(new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 1000.0));
	    objRoot.addChild(directionLight);
	    //
	    objRoot.compile ();
	    
	    return objRoot;
	}	
			
	private Appearance meinAchsenSetAppearance(Color3f col){
		Appearance coneApp = new Appearance();
		coneApp.setColoringAttributes (new ColoringAttributes (col, ColoringAttributes.NICEST));
		
		return coneApp;
	}
		
	//Beenden-Menu
	private void setCloseMenuBar (JFrame f)  {
	    JMenuBar jmb = new JMenuBar();
	    JMenu jm = new JMenu ("Datei");   jmb.add (jm);
	    JMenuItem close = new JMenuItem ("Beenden");   jm.add (close);
	    close.addActionListener (new meinActionListener());
	    f.setJMenuBar (jmb);
	}
	
    //Startmethode
	public static void main (String[]args)  {
		//Fenster+Welt
		fenster=	new First3DProgram();
		fenster.setUndecorated(true);
		fenster.setSize (500, 500);
		xdurch=fenster.getHeight();
		ydurch=fenster.getWidth();
		fenster.setLocationRelativeTo (null);  //zentrieren
		
		fenster.setVisible (true);
	}
}
 

Marco13

Top Contributor
Es sein zu lassen wäre nich so gut wie nochmal damit anzufangen. Und zwar from Scratch. Ich gehe davon aus, dass das kein schnell zusammengehacktes KSKB ist, sondern dein Program. Ohne Klassen, aber dafür mit einem haufen Strukturfreier Methoden und nichtssagenden, chaotischen Variablennamen (groß geschrieben), einem Fenster, das man nicht schließen kann, und irgendwelchem Robot-Kack.

Das Beispiel, das du selbst verlinkt hast, funktioniert in dieser Form
Java:
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Enumeration;

import javax.media.j3d.AmbientLight;
import javax.media.j3d.Appearance;
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.IndexedQuadArray;
import javax.media.j3d.Locale;
import javax.media.j3d.Material;
import javax.media.j3d.Node;
import javax.media.j3d.PhysicalBody;
import javax.media.j3d.PhysicalEnvironment;
import javax.media.j3d.Shape3D;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.media.j3d.View;
import javax.media.j3d.ViewPlatform;
import javax.media.j3d.VirtualUniverse;
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.Matrix4f;
import javax.vecmath.Point3d;
import javax.vecmath.Point3f;
import javax.vecmath.Vector3d;
import javax.vecmath.Vector3f;

import com.sun.j3d.utils.picking.PickTool;
import com.sun.j3d.utils.picking.behaviors.PickTranslateBehavior;
import com.sun.j3d.utils.universe.SimpleUniverse;

/**
 * This class demonstrates the use of the CollisionDetector class to perform
 * processing when objects collide. When this program is run the white cube can
 * be selected and moved by dragging on it with the right mouse button. You
 * should notice that there is a problem if the movable cube comes into contact
 * with both of the static cubes at one time. A way round this is given in the
 * SimpleCollision2 application.
 * 
 * @see CollisionDetector
 * @see SimpleCollision2
 * @author I.J.Palmer
 * @version 1.0
 */
public class SimpleCollision extends Frame implements ActionListener {
	protected Canvas3D myCanvas3D;

	protected Button exitButton = new Button("Exit");

	protected BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0,
			0.0), 100.0);

	/** Transform for the left cube. */
	protected TransformGroup leftGroup;

	/** Transform for the right cube */
	protected TransformGroup rightGroup;

	/**
	 * Transform for the movable cube. This has read, write and pick reporting
	 * capabilities enabled.
	 */
	protected TransformGroup moveGroup;

	/** A transform to change the size of the movable cube. */
	protected TransformGroup scaleGroup;

	/** The left static cube. */
	protected Shape3D leftCube;

	/** The right static cube. */
	protected Shape3D rightCube;

	/** The movable cube that will collide with the other two cubes */
	protected Shape3D moveCube;

	/**
	 * This adds some lights to the content branch of the scene graph.
	 * 
	 * @param b
	 *            The BranchGroup to add the lights to.
	 */
	protected void addLights(BranchGroup b) {
		Color3f ambLightColour = new Color3f(0.5f, 0.5f, 0.5f);
		AmbientLight ambLight = new AmbientLight(ambLightColour);
		ambLight.setInfluencingBounds(bounds);
		Color3f dirLightColour = new Color3f(1.0f, 1.0f, 1.0f);
		Vector3f dirLightDir = new Vector3f(-1.0f, -1.0f, -1.0f);
		DirectionalLight dirLight = new DirectionalLight(dirLightColour,
				dirLightDir);
		dirLight.setInfluencingBounds(bounds);
		b.addChild(ambLight);
		b.addChild(dirLight);
	}

	/**
	 * Creates the content branch of the scene graph.
	 * 
	 * @return BranchGroup with content attached.
	 */
	protected BranchGroup buildContentBranch() {
		//First create a different appearance for each cube
		Appearance app1 = new Appearance();
		Appearance app2 = new Appearance();
		Appearance app3 = new Appearance();
		Color3f ambientColour1 = new Color3f(1.0f, 0.0f, 0.0f);
		Color3f ambientColour2 = new Color3f(1.0f, 1.0f, 0.0f);
		Color3f ambientColour3 = new Color3f(1.0f, 1.0f, 1.0f);
		Color3f emissiveColour = new Color3f(0.0f, 0.0f, 0.0f);
		Color3f specularColour = new Color3f(1.0f, 1.0f, 1.0f);
		Color3f diffuseColour1 = new Color3f(1.0f, 0.0f, 0.0f);
		Color3f diffuseColour2 = new Color3f(1.0f, 1.0f, 0.0f);
		Color3f diffuseColour3 = new Color3f(1.0f, 1.0f, 1.0f);
		float shininess = 20.0f;
		app1.setMaterial(new Material(ambientColour1, emissiveColour,
				diffuseColour1, specularColour, shininess));
		app2.setMaterial(new Material(ambientColour2, emissiveColour,
				diffuseColour2, specularColour, shininess));
		app3.setMaterial(new Material(ambientColour3, emissiveColour,
				diffuseColour3, specularColour, shininess));

		//Create the vertex data for the cube. Since each shape is
		//a cube we can use the same vertex data for each cube
		IndexedQuadArray indexedCube = new IndexedQuadArray(8,
				IndexedQuadArray.COORDINATES | IndexedQuadArray.NORMALS, 24);
		Point3f[] cubeCoordinates = { new Point3f(1.0f, 1.0f, 1.0f),
				new Point3f(-1.0f, 1.0f, 1.0f),
				new Point3f(-1.0f, -1.0f, 1.0f),
				new Point3f(1.0f, -1.0f, 1.0f), new Point3f(1.0f, 1.0f, -1.0f),
				new Point3f(-1.0f, 1.0f, -1.0f),
				new Point3f(-1.0f, -1.0f, -1.0f),
				new Point3f(1.0f, -1.0f, -1.0f) };
		Vector3f[] cubeNormals = { new Vector3f(0.0f, 0.0f, 1.0f),
				new Vector3f(0.0f, 0.0f, -1.0f),
				new Vector3f(1.0f, 0.0f, 0.0f),
				new Vector3f(-1.0f, 0.0f, 0.0f),
				new Vector3f(0.0f, 1.0f, 0.0f), new Vector3f(0.0f, -1.0f, 0.0f) };
		int cubeCoordIndices[] = { 0, 1, 2, 3, 7, 6, 5, 4, 0, 3, 7, 4, 5, 6, 2,
				1, 0, 4, 5, 1, 6, 7, 3, 2 };
		int cubeNormalIndices[] = { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3,
				3, 3, 4, 4, 4, 4, 5, 5, 5, 5 };
		indexedCube.setCoordinates(0, cubeCoordinates);
		indexedCube.setNormals(0, cubeNormals);
		indexedCube.setCoordinateIndices(0, cubeCoordIndices);
		indexedCube.setNormalIndices(0, cubeNormalIndices);

		//Create the three cubes
		leftCube = new Shape3D(indexedCube, app1);
		rightCube = new Shape3D(indexedCube, app2);
		moveCube = new Shape3D(indexedCube, app3);

		//Define the user data so that we can print out the
		//name of the colliding cube.
		leftCube.setUserData(new String("left cube"));
		rightCube.setUserData(new String("right cube"));

		//Create the content branch and add the lights
		BranchGroup contentBranch = new BranchGroup();
		addLights(contentBranch);

		//Create and set up the movable cube's TransformGroup.
		//This scales and translates the cube and then sets the
		// read, write and pick reporting capabilities.
		Transform3D moveXfm = new Transform3D();
		moveXfm.set(0.7, new Vector3d(0.0, 2.0, 1.0));
		moveGroup = new TransformGroup(moveXfm);
		moveGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		moveGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
		moveGroup.setCapability(TransformGroup.ENABLE_PICK_REPORTING);

		//Create the left cube's TransformGroup
		Transform3D leftGroupXfm = new Transform3D();
		leftGroupXfm.set(new Vector3d(-1.5, 0.0, 0.0));
		leftGroup = new TransformGroup(leftGroupXfm);

		//Create the right cube's TransformGroup
		Transform3D rightGroupXfm = new Transform3D();
		rightGroupXfm.set(new Vector3d(1.5, 0.0, 0.0));
		rightGroup = new TransformGroup(rightGroupXfm);

		//Add the behaviour to allow us to move the cube
		PickTranslateBehavior pickTranslate = new PickTranslateBehavior(
				contentBranch, myCanvas3D, bounds);
		contentBranch.addChild(pickTranslate);

		//Add our CollisionDetector class to detect collisions with
		//the movable cube.
		CollisionDetector myColDet = new CollisionDetector(moveCube, bounds);
		contentBranch.addChild(myColDet);

		//Create the content branch hierarchy.
		contentBranch.addChild(moveGroup);
		contentBranch.addChild(leftGroup);
		contentBranch.addChild(rightGroup);
		moveGroup.addChild(moveCube);
		leftGroup.addChild(leftCube);
		rightGroup.addChild(rightCube);

		return contentBranch;

	}

	/**
	 * Process the exit button action to exit the application.
	 */
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == exitButton) {
			dispose();
			System.exit(0);
		}
	}

	public SimpleCollision() {

		myCanvas3D = new Canvas3D(SimpleUniverse.getPreferredConfiguration());	  
		SimpleUniverse simpleUniverse = new SimpleUniverse (myCanvas3D);
		BranchGroup scene = buildContentBranch();
		simpleUniverse.addBranchGraph (scene);

		Matrix4f m = new Matrix4f();
		m.setIdentity();
		m.setTranslation(new Vector3f(0,0,20));
		Transform3D t = new Transform3D(m);
		simpleUniverse.getViewingPlatform().getViewPlatformTransform().setTransform(t);

		setTitle("SimpleWorld");
		setSize(400, 400);
		setLayout(new BorderLayout());
		Panel bottom = new Panel();
		bottom.add(exitButton);
		add(BorderLayout.CENTER, myCanvas3D);
		add(BorderLayout.SOUTH, bottom);
		exitButton.addActionListener(this);
		setVisible(true);
	}

	public static void main(String[] args) {
		SimpleCollision sw = new SimpleCollision();
	}
}

/**
 * A simple collision detector class. This responds to a collision event by
 * printing a message with information about the type of collision event and the
 * object that has been collided with.
 * 
 * @author I.J.Palmer
 * @version 1.0
 */

class CollisionDetector extends Behavior {
	/** The separate criteria used to wake up this beahvior. */
	protected WakeupCriterion[] theCriteria;

	/** The OR of the separate criteria. */
	protected WakeupOr oredCriteria;

	/** The shape that is watched for collision. */
	protected Shape3D collidingShape;

	/**
	 * @param theShape
	 *            Shape3D that is to be watched for collisions.
	 * @param theBounds
	 *            Bounds that define the active region for this behaviour
	 */
	public CollisionDetector(Shape3D theShape, Bounds theBounds) {
		collidingShape = theShape;
		setSchedulingBounds(theBounds);
	}

	/**
	 * This creates an entry, exit and movement collision criteria. These are
	 * then OR'ed together, and the wake up condition set to the result.
	 */
	public void initialize() {
		theCriteria = new WakeupCriterion[3];
		theCriteria[0] = new WakeupOnCollisionEntry(collidingShape);
		theCriteria[1] = new WakeupOnCollisionExit(collidingShape);
		theCriteria[2] = new WakeupOnCollisionMovement(collidingShape);
		oredCriteria = new WakeupOr(theCriteria);
		wakeupOn(oredCriteria);
	}

	/**
	 * Where the work is done in this class. A message is printed out using the
	 * userData of the object collided with. The wake up condition is then set
	 * to the OR'ed criterion again.
	 */
	public void processStimulus(Enumeration criteria) {
		WakeupCriterion theCriterion = (WakeupCriterion) criteria.nextElement();
		if (theCriterion instanceof WakeupOnCollisionEntry) {
			Node theLeaf = ((WakeupOnCollisionEntry) theCriterion)
			.getTriggeringPath().getObject();
			System.out.println("Collided with " + theLeaf.getUserData());
		} else if (theCriterion instanceof WakeupOnCollisionExit) {
			Node theLeaf = ((WakeupOnCollisionExit) theCriterion)
			.getTriggeringPath().getObject();
			System.out.println("Stopped colliding with  "
					+ theLeaf.getUserData());
		} else {
			Node theLeaf = ((WakeupOnCollisionMovement) theCriterion)
			.getTriggeringPath().getObject();
			System.out.println("Moved whilst colliding with "
					+ theLeaf.getUserData());
		}
		wakeupOn(oredCriteria);  }
}


Wenn du das auf dein eigenes """Programm""" anwenden willst, und das nicht klappt, musst du genauer beschreiben, wo das Problem liegt.



BTW: Dass es immer mit 'null' zu kollidieren schien, lag daran, dass du dort immer das "UserData" ausgeben hast, aber keinem deiner Objekte "UserData" zugewiesen hattest. In Wirklichkeit war das Kollisionsobjekt ein "Shape3D", aber welches, weiß ich auch nicht. Außerdem frage ich mich, was sich an der Kollision ändern sollte, wenn immer dasselbe Objekt an der selben Position mit den selben Bounds kollidiert. Eine etwas systematischere Vorgehensweise (und das kann auch heißen: Rumspielen mit existierenden Beispielen!!!) würde vielleicht eher zum Erfolg führen.
 
Zuletzt bearbeitet:

Seppel

Bekanntes Mitglied
ich gug mir das ja noch mal an, aber es ist eigentlich nicht das Polem das es null anzeigt, sondern überhaupt null, denn wenn es scheinbar, wenn dem Age betrachtet mit nix in verbindung kommt, und dennoch eine Meldung kommt stimmt ja was nicht

gut ja
variablen-->mag sein
das mit dem robo habe ich bei mehrerern Beispielen gefunden wenn es darum geht die Maus zuzentrieren
das meiste wurde gelöscht
das fenster läst sich schließen
im beispiel gibt es aber auch nicht mehr classen!?

und solange ich ich von Grundauf hier und da Probleme auftauchen und das ganze system noch Probleme macht, schreib ich das Programm doch nicht bei jeden erfolg sofort neu und schön hin, um beim nächsten Problem wieder das ganze zuzerstöen

meld mich mal am Sonntag oder nächste Woche wieder, werde bisdahin das ganze noch mal probieren

trozdem danke das de noch Gedult hast
 

Seppel

Bekanntes Mitglied
Also, denke Fehler gefunden zu haben
man muss doch jede Box jedes Sphere und jedes andere Objekt einzeln dem collisionsdedector übergeben, damit es funktionieren kann. werde noch bissel experimentieren und dann mal einmal ein ganzes Programm schreiben, was ne zusammengeschustert ist.
Meld mich wieder wenn ig so weit bin und noch fragen habe.
Hast ja recht das der code ne grad sauber war.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J AWT Einmal FileDialog-Beispiel für Dumme bitte AWT, Swing, JavaFX & SWT 6
A Ein Beispiel für Microba AWT, Swing, JavaFX & SWT 3
melaniemueller JavaFX Beispiel kann nicht ausgeführt werden AWT, Swing, JavaFX & SWT 4
F Swing TextField Eingabe in Variable umwandeln um zum Beispiel zu rechnen. AWT, Swing, JavaFX & SWT 3
J Swing MVC-Beispiel unklar(ListSelectionListener und ListDataListener) AWT, Swing, JavaFX & SWT 2
S Bitte um ein Beispiel von JXTreeTable AWT, Swing, JavaFX & SWT 12
H Tutorial bzw. Beispiel eines "GUI Ablaufs" AWT, Swing, JavaFX & SWT 8
Spin Window Event Beispiel AWT, Swing, JavaFX & SWT 6
C Mehrer Fragen zu großem kompletten Swing Beispiel AWT, Swing, JavaFX & SWT 5
W Suche großes vollständiges Swing GUI Beispiel nach MVC Model AWT, Swing, JavaFX & SWT 5
P GridBagLayout einfaches Beispiel geht nicht? AWT, Swing, JavaFX & SWT 5
G Text rotieren: Frage zu einem Beispiel AWT, Swing, JavaFX & SWT 5
V Frage zu JScrollPane mit Custom Headern, mit Beispiel AWT, Swing, JavaFX & SWT 2
M treetable einfaches beispiel gesucht AWT, Swing, JavaFX & SWT 6
P Prefuse: Beispiel mit beschrifteten Kanten gesucht? AWT, Swing, JavaFX & SWT 9
M [SOLVED]MVC Beispiel von dbac AWT, Swing, JavaFX & SWT 2
S Fragen zu einem Beispiel(Swings und AWT) AWT, Swing, JavaFX & SWT 33
R Falsches Beispiel im Buch? AWT, Swing, JavaFX & SWT 4
Juelin setzen background color für selected Row im Tableview AWT, Swing, JavaFX & SWT 21
Juelin Für Java-Spezialisten AWT, Swing, JavaFX & SWT 4
H JTabel - RowFilter Daten für Berechnung filtern AWT, Swing, JavaFX & SWT 6
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
M Eigene Java Klasse für allgemeine Grafikelemente AWT, Swing, JavaFX & SWT 8
M Vokabelprogram - Schleife für Liste soll schrittweise durchlaufen werden AWT, Swing, JavaFX & SWT 3
tommybalbor JavaFx Anwendung klappt nicht für macOs Nutzern, wenn ich zwei dependecies bei maven hinzufüge AWT, Swing, JavaFX & SWT 6
I Libraries für AWT für andere Grafik-Frameworks tauglich machen AWT, Swing, JavaFX & SWT 6
R auto. Importanweisungen für javafx funktioniert in Eclipse nicht mehr AWT, Swing, JavaFX & SWT 4
komplettlost Vollbildmodus für MacOs Nutzer geht nicht AWT, Swing, JavaFX & SWT 13
D JavaFX Schadensberechnung für Kartenspiel AWT, Swing, JavaFX & SWT 1
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
L actionListener für Button AWT, Swing, JavaFX & SWT 97
izoards Textfeld für Zeit AWT, Swing, JavaFX & SWT 4
CptK Wie funktioniert contains() für Path2D.Double AWT, Swing, JavaFX & SWT 10
T Getter und Setter für eine Stage AWT, Swing, JavaFX & SWT 6
P Swing Programm hängt sich bei Buttondruck auf? (GUI für "Chatbot" erstellen) AWT, Swing, JavaFX & SWT 15
T Button für GUI programmieren AWT, Swing, JavaFX & SWT 1
Z Switch Case für Buttons AWT, Swing, JavaFX & SWT 8
M Hough-Transformation für Kreise und andere Formen AWT, Swing, JavaFX & SWT 3
kodela HTML-tags für JLabel AWT, Swing, JavaFX & SWT 9
E Keystroke für Ausschneiden läßt sich nicht ändern AWT, Swing, JavaFX & SWT 2
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
MiMa Package Struktur für GUI Programmierung AWT, Swing, JavaFX & SWT 26
N JavaFX 1 Listener für mehrere ChoiceBoxen AWT, Swing, JavaFX & SWT 3
B eclipse für JavaFx setuppen AWT, Swing, JavaFX & SWT 4
K Swing Struktur für TreeTable rekursiv aufbauen AWT, Swing, JavaFX & SWT 17
A Swing JTextField an Button übergeben für Popup-Fenster funktioniert nicht AWT, Swing, JavaFX & SWT 3
H Ein Patten für das Gluon Mobile Framework AWT, Swing, JavaFX & SWT 7
J Gibt es einen Grund für 16x16 anstatt z.B. 15x15 Tiles ? AWT, Swing, JavaFX & SWT 10
F JFormattedTextField für kg und Währung AWT, Swing, JavaFX & SWT 6
V Swing für jedes Kästchen eine eigene Farbe AWT, Swing, JavaFX & SWT 2
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
Soloeco JavaFX Dreifachklick für MenuButton erforderlich AWT, Swing, JavaFX & SWT 2
L JavaFX Lösungsvorschläge für dieses coole Control AWT, Swing, JavaFX & SWT 8
looparda Suche Lib für Visualisierung von Graphen AWT, Swing, JavaFX & SWT 12
G LayoutManager Beliebige Anzahl von Panels für LayoutManager AWT, Swing, JavaFX & SWT 3
L Ein Actionlistener für ein Textfeld, anstatt viele Actionlistener für ein Textfeld AWT, Swing, JavaFX & SWT 7
S Swing Finde Grund für NullPointerExeption nicht. AWT, Swing, JavaFX & SWT 2
W JavaFX (j)Unittests für GUI AWT, Swing, JavaFX & SWT 0
B JavaFX JavaFX TableView PropertyValueFactory für Werte aus HashMap AWT, Swing, JavaFX & SWT 2
SchmidiMC Swing Vorschläge für ein Design AWT, Swing, JavaFX & SWT 5
Z JavaFX Pane für wechselnde Sub-Panes mit Auto-Resize AWT, Swing, JavaFX & SWT 2
S 2D-Grafik affine Transformation für Text-Shape AWT, Swing, JavaFX & SWT 0
G Swing Variable Elemente für GroupLayout AWT, Swing, JavaFX & SWT 18
kodela Accalerator für einige Menüoptionen funktioniert nicht mehr AWT, Swing, JavaFX & SWT 3
P Swing Empfehlungen für einfaches Computerspiel AWT, Swing, JavaFX & SWT 4
L DragDropped für jede Node AWT, Swing, JavaFX & SWT 0
temi JavaFX Lösungsansatz für Umsetzung gesucht AWT, Swing, JavaFX & SWT 4
J Swing JavaProgramm für Verschlüssen für eine Datei AWT, Swing, JavaFX & SWT 19
D DatePicker für Java Swing AWT, Swing, JavaFX & SWT 2
MiMa Programmeinstellungen für Anwendung?? AWT, Swing, JavaFX & SWT 54
heinz ketchup While-Schleife in einem Service für GUI AWT, Swing, JavaFX & SWT 22
L JavaFX Renderer für JavaFX AWT, Swing, JavaFX & SWT 2
MiMa GUI Controller für Border Pane als MVC Modell AWT, Swing, JavaFX & SWT 1
L Font für Dashboard AWT, Swing, JavaFX & SWT 3
F Swing JColorChooser für die JToggleButtons AWT, Swing, JavaFX & SWT 5
S JavaFX Optimierung für verschiedene Auflösungen AWT, Swing, JavaFX & SWT 12
L JavaFX Animation für Panel wechsel AWT, Swing, JavaFX & SWT 3
T Swing Drag and Drop für JComponents AWT, Swing, JavaFX & SWT 1
Kloso Swing Pseudocode für Strafurzeichnung AWT, Swing, JavaFX & SWT 4
F Konstruktor für "Vier Gewinnt" AWT, Swing, JavaFX & SWT 10
L JavaFX PdfViewer für JavaFX Anwendung AWT, Swing, JavaFX & SWT 6
R Swing Welche LayoutManager sind die richtigen für mich? AWT, Swing, JavaFX & SWT 11
L Event Handling Gui für Taschenrechner AWT, Swing, JavaFX & SWT 27
C Slider für Zeitauswahl AWT, Swing, JavaFX & SWT 3
M Limit für JFrame-Vergrößerung AWT, Swing, JavaFX & SWT 8
GreenTeaYT Button funktioniert nicht für Ein-und Auszahlungen? AWT, Swing, JavaFX & SWT 8
K Liniendicke für Line Chart dynamisch ändern AWT, Swing, JavaFX & SWT 0
K JButton nicht sichtbar machen für User 2 AWT, Swing, JavaFX & SWT 4
OnDemand Gui Themes für FX AWT, Swing, JavaFX & SWT 4
G DefaultListModel für JList AWT, Swing, JavaFX & SWT 2
P JavaFX Kalender mit Kacheln für Ereignisse AWT, Swing, JavaFX & SWT 4
S ActionListener für alle Buttons AWT, Swing, JavaFX & SWT 26
J Swing Neuen Command für "show"? AWT, Swing, JavaFX & SWT 2
sandaime Swing Thread für CMD auslesen AWT, Swing, JavaFX & SWT 16
H Swing JFileChooser für nicht existierendes Unterverzeichnis AWT, Swing, JavaFX & SWT 3
R Java FX - Fxml - relative Größenangaben für Breite und Höhe einer TextArea AWT, Swing, JavaFX & SWT 8
D GUI-Bau für ein Auswertungs-Tool AWT, Swing, JavaFX & SWT 11
L Swing CellRenderer für einzelne Zellen? AWT, Swing, JavaFX & SWT 5
RalleYTN Swing Menü für Texteditor (Rechtsklick) AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen


Oben