# Beispiel für Kollisionserkennung gesucht



## Seppel (10. Okt 2011)

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:

```
//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


----------



## Michael... (10. Okt 2011)

Seppel hat gesagt.:


> 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 
	
	
	
	





```
bounds
```
 hier auch einen solchen Quader beschreiben.


----------



## Seppel (10. Okt 2011)

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

```
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:

```
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?


----------



## Marco13 (10. Okt 2011)

Ein KSKB könnte helfen, vielleicht...


----------



## Seppel (10. Okt 2011)

war schon dran, hoffe ist kurz genug

```
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 (10. Okt 2011)

Werd' mal schauen, ob ich die Zeit finde, das genauer anzuschauen (weiß nicht ob's diese Woche noch klappt...)


----------



## Seppel (10. Okt 2011)

Danke kein Problem, hat Zeit, ich muss die Woche eh mal wieder c lernen fürs Studium


----------



## Marco13 (10. Okt 2011)

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

```
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 (10. Okt 2011)

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 (10. Okt 2011)

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 (11. Okt 2011)

hi, gut versuch ich mal

kein Problem will ja auch Info studieren, ist deine Arbeit irgend wo online?


----------



## Seppel (11. Okt 2011)

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


```
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


----------



## Seppel (14. Okt 2011)

...


----------



## Marco13 (14. Okt 2011)

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 (14. Okt 2011)

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


----------



## Marco13 (14. Okt 2011)

Seppel hat gesagt.:


> aber über jede Box ein eigenes Bound  zumachen wäre sehr umfangreich



Doch, sicher... bei Komplexeren Objekten verwendet man sogar üblicherweise eine BVH Bounding volume hierarchy - Wikipedia, the free encyclopedia


----------



## Seppel (14. Okt 2011)

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?:

```
//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 (15. Okt 2011)

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 (15. Okt 2011)

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 (19. Okt 2011)

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


----------



## Marco13 (19. Okt 2011)

Hmja, gibt's ein KSKB vom aktuellen Stand, mit einer kurzen Erklärung von Beobachtetem und Gewünschtem Verhalten?


----------



## Seppel (20. Okt 2011)

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.


```
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 (20. Okt 2011)

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

```
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.


----------



## Seppel (20. Okt 2011)

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 (21. Okt 2011)

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.


----------

