# Probleme mit Kollisionserkennung !



## Expl (4. Mai 2007)

Hallo,
ich hoffe mir kann jemand helfen. Ich versuche eine Kollisionsvermeidung zu programmieren,dazu benutze ich ein 
ShapeCylinderSegment. Mein Problem ist, dass mein Objekt , dass ich bewege mit seinem eigenen Radius(ShapeCylinderSegment) kollidiert. 


```
public class KeyBehavior extends Behavior
{
		
	private TransformGroup transformGroup;
	
	private Transform3D positionTransform3D = new Transform3D();
	
	private WakeupCriterion criterion;

	
	private PickTool picktool;
	private PickInfo pr;
	private Point3d startP = new Point3d(0.3, 0, 0.3);
	private Point3d endP = new Point3d(-0.3, 0,  -0.3);

	private Vector3f forward = new Vector3f(0f, 0f, -0.3f);
	private Vector3f backward = new Vector3f(0f, 0f, 0.3f);
	
	private Box box;
	private Vector3f position_Player = new Vector3f(0f, 0f, 0f);
	private Transform3D positionT3D = new Transform3D();
	float x, y, z;
	
	/* im Konstruktor wird ein Objekt vom Typ TransformGroup ï¿½bergeben							*/
	public KeyBehavior(TransformGroup tg, BranchGroup rootBG,Box box)
	{
		picktool = new PickTool(rootBG);
		transformGroup = tg;
		this.box = box;
	}

	/* 
	 * Dient dazu den Behavior zu initialisieren. Es wird eine Variable criterion 
	 * fï¿½r ein neu erzeugtes WakeupCriterion, also ein Aufwachkriterium verwendet. 
	 * Dabei handelt es sich um ein WakeUpOnAWTEventObjekt. Es sorgt dafï¿½r , dass 
	 * jeder Tastendruck registriert wird.
	 * Die Methode wakeupOn() aktiviert diese Aufwachbedingung fï¿½r das BehaviorObjekt
	 */
	public void initialize()
	{
		/*
		 * Konstruktor WakeupOnAWTEvent legt mit Hilfe des Parameters KeyEvent.KEY_PRESSED fest, dass jede
		 * gedrï¿½ckte Taste als gï¿½ltige Aufwachbedingung anzusehen ist.
		 */
		
		criterion = new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED);
		//nach dem aktivieren mittels wakeupOn() ist das Behavior "scharf"
		wakeupOn(criterion);
	}

	/*
	 * Wird eine Taste gedrï¿½ckt, so wird automatisch die Methode processStimulus()
	 * aufgerufen. Es wird festegestellt um welche Art vonWakeupCriterion es sich
	 * handelt um dann dementsprechend zu reagieren. Ein Behavior kann mehrere Aufwachbedingungen haben. Damit
     * ausgewertet werden kann, welches Ereignis eben eingetreten ist, wird der Methode
     * processStimulus() das jeweilige WakeupCriterionObjekt mitgegeben.
	 */
	public void processStimulus(Enumeration criteria)
	{
		AWTEvent AWTEv[];

		WakeupCriterion wakeup;

		while( criteria.hasMoreElements() ) 
		{
			 wakeup = (WakeupCriterion) criteria.nextElement();
		
			 AWTEv = ((WakeupOnAWTEvent)wakeup).getAWTEvent();
		   
			 
			 // in der Schleife wird die gedrückte Taste an processKeyEvent übergeben
			 for( int i = 0; i < AWTEv.length; i++ ) 
			 {
				 if( AWTEv[i].getID() == KeyEvent.KEY_PRESSED )
					 processKeyEvent((KeyEvent)AWTEv[i]);
			 }
		}
		
		wakeupOn(criterion);
	}	
	
	
	 // gedrückte Taste wird an moveAllowed() übergeben und geprüft ob man sich bewegen darf
	 void processKeyEvent(KeyEvent eventKey)
	 {
	 int key = eventKey.getKeyCode();
	 System.out.println(key);    
	 move(key);
	 
	 } 
	
	
	 boolean movePossible(int key)
	 {
		 
		 picktool.setShapeCylinderSegment(startP, endP, 0.1);			// Radius festlegen
		 
		 pr = picktool.pickClosest();		// das am naheliegendste Element		
		
		 // wenn pr != null ist, ist eine Kollision eingetreten und die Bewegung wird nicht ausgeführt
		 if (pr != null)
		 {
			 		box.getLocalToVworld(positionT3D);
			 		positionT3D.get(position_Player);
			 		System.out.println("Kollision eingetreten an position: "+position_Player.x+" "+position_Player.y+" "+position_Player.z);
				
			     	System.out.println("Koordinaten Cylinder");
			     	System.out.println("Startpunkt :"+startP.getX()+ " " + startP.getY()+ " " +startP.getZ());
					System.out.println("Endpunkt: "+endP.getX()+ " " + endP.getY()+ " " +endP.getZ());

				return false;
		 
		 }
			
		 return true;
	 }
	 
	 
	 void move(int key)
	 {
		
		 if (movePossible(key) && key == KeyEvent.VK_UP)
		 {
			 Transform3D temp = new Transform3D();
				temp.set(forward);
         	positionTransform3D.mul(temp);
         	transformGroup.setTransform( positionTransform3D );
		 }

		 else if (movePossible(key) && key == KeyEvent.VK_DOWN)
		 {
			 Transform3D temp = new Transform3D();
				temp.setTranslation(backward);
         	positionTransform3D.mul(temp);
         	transformGroup.setTransform( positionTransform3D );
		 }
		
		 else if (movePossible(key) && key == KeyEvent.VK_LEFT) 
		 {
			 	Transform3D temp = new Transform3D();
				temp.rotY(Math.toRadians(90));
				positionTransform3D.mul(temp);
				transformGroup.setTransform( positionTransform3D );
		 }
//		 Pfeiltaste links : 2 Grad nach links
		 else if (movePossible(key) && key == KeyEvent.VK_RIGHT) 
		 {
			 	Transform3D temp = new Transform3D();
				temp.rotY(Math.toRadians(-90));
				positionTransform3D.mul(temp);
				transformGroup.setTransform( positionTransform3D );
		 }
		
	 }
}
```


----------



## AlArenal (4. Mai 2007)

Komm, mach uns noch nen 4. ......


----------



## Guest (2. Dez 2007)

Ich habs jetzt selbst nich durchgesehn aber wenns mit seinem Radius kollidiert kannst du eig einfach die "Person" auf setCollidable(false) setzten.


----------

