# [Java3D] Probleme bei Kollision



## Maxim6394 (7. Jan 2012)

ich hab jetzt ein gut funktionierendes bewegungssystem wo man sich auch umsehen kann, aber das mit der kollsion krieg ich nicht wirklich hin. ich hab da um den spieler eine boundingbox, die sich auch mit dem spieler die ganze zeit mit bewegt. da ist dann noch eine colorcube, wo eine kollision auch korrekt erkannt wird. alle 25ms wird ein timer durchlaufen der die rotation und die position des spielers festlegt. ich dachte ich speichere die spielerposition ganz am anfang der schleife in einer temporären variable, und immer wenn eine kollision erkannt wird setze ich den spieler auf diese temporäre position. das klappt aber nicht wirklich, er bleibt einfach auf der stelle sobald er mit dem objekt kollidiert.


```
java.util.TimerTask task=new java.util.TimerTask()
	{		
		Point3d tmpPlayerPos;
		
		public void run()
		{
		
			 tmpPlayerPos=new Point3d(player.position.getX(),player.position.getY(),player.position.getZ());			//hier wird die aktuelle spielerposition gespeichert.

			Transform3D rotY=new Transform3D();
			Transform3D rotX=new Transform3D();
			Transform3D rotZ=new Transform3D();
			Transform3D trans=new Transform3D();
			if(mouseEntered==true)
			{
		
			int x=(int)MouseInfo.getPointerInfo().getLocation().getX();
			int y=(int)MouseInfo.getPointerInfo().getLocation().getY();

			Transform3D tmp=new Transform3D();	view.getTransform(tmp);
			
			double diffX=-((x-mousePos.getX())/mouseSens);
			double diffY=-((y-mousePos.getY())/mouseSens);
					
			player.yRotation+=diffX;
			player.xRotation+=diffY;		
			
			rotY.rotY(Math.toRadians(player.yRotation));
			rotX.rotX(Math.toRadians(player.xRotation));
		
			rotY.mul(trans);
			rotY.mul(rotX);
			trans.mul(rotY);
			trans.setTranslation(new Vector3d(player.position.getX(),player.position.getY(),player.position.getZ()));
			
		
			view.setTransform(trans);
			
			mousePos.setX(x); mousePos.setY(y);

			if(mouseEntered==true)
			{
				robot.mouseMove(250, 250);
				mousePos.setX(250);mousePos.setY(250);
			}
		
		if(player.dz==1)
		{
			player.move(player.yRotation);
		}
		else if(player.dz==-1)
		{
			player.move(player.yRotation+180);
		}
		if(player.dx==1)
		{
			player.move(player.yRotation+90);
		}
		else if(player.dx==-1)
		{
			player.move(player.yRotation-90);
		}
			

		if(player.bounds.intersect(cube.getBounds()))
		{
			System.out.println(tmpPlayerPos+"|"+player.position);
			player.position=tmpPlayerPos; //hier sollte der spieler auf die position zurückgeworfen werden, er bleibt aber nur in der collisionszone stecken. bei einem bewegungsversuch werden für die spielerposition geringfügig andere werte ausgegeben als tmpPlayerPos
		}
		
		player.checkRotation();
		player.updateBounds();	
		
			
			}
	
	}
	};
```


```
cubeTGTrans.setTranslation(new Vector3f(0,0,10));
		cube.setBoundsAutoCompute(false);
		cube.setBounds(new BoundingBox(new Point3d(-1,-1,9),new Point3d(1,1,11)));
```

also wie mach ich das? früher als ich das bei nem 2d spiel gemacht hab ging diese technik, dass die position einfach zurückgesetzt wird wenn es kollision gibt.

ich habs mit nem behavior versucht aber da wird die kollision gar nicht erst erkannt, egal ob ich die bounds vom spieler oder die von der colorcube benutze.

```
class collisionBehavior extends Behavior
	{

		Bounds boundingBox;
		WakeupCriterion criterion;
		
		public collisionBehavior(Bounds targetBounds)
		{
			
			
			setSchedulingBounds(bounds);
			this.boundingBox=targetBounds;
			criterion=new WakeupOnCollisionEntry(targetBounds);
			
		}
		
		public void initialize()
		{
			
			
			this.wakeupOn(criterion);
			System.out.println("initialized");
		}
		
		public void processStimulus(Enumeration e)
		{
			System.out.println("collision");
			
			this.wakeupOn(criterion);
		}
	}
```


----------



## Marco13 (8. Jan 2012)

Was hast du denn die ganze Zeit mit diesen MouseInfos und TimerTasks? So macht man das nicht... eigentlich mit Behaviors (die finde ich aber teilweise auch etwas schwerfällig, deswegen) notfalls mit normalen MouseEvents....


----------



## Marco13 (9. Jan 2012)

Bedeutet der Satz


Maxim6394 hat gesagt.:


> ich hab jetzt ein gut funktionierendes bewegungssystem wo man sich auch umsehen kann


eigentlich, dass der Thread http://www.java-forum.org/spiele-mu...24-java3d-lookat-mausposition.html#post847242 erledigt ist? Der lag noch als "unerledigt" bei mir rum...


----------



## Maxim6394 (13. Jan 2012)

also das mit der kollisionserkennung funktioniert bei ganz einfachen körpern, aber ich muss irgendwie die geometrie des shapes nutzen und nicht die boundingbox. wie kann ich das machen? bei einem pickray wird auch der exakte punkt erkannt wo der strahl das objekt trifft, nicht nur die boundingbox.
ich hab eine boundingbox für den spieler, wo ich immer die intersect methode aufrufe um zu prüfen ob es mit einem objekt in der branchgroup kollidiert. dabei werden wohl leider immer nur die bounds genommen, nicht die geometrie. kann man das ändern?


----------



## Marco13 (13. Jan 2012)

Du solltest dir wohl mal sowas wie JMonkeyEngine oder Aviatrix3D ansehen.


----------



## HimBromBeere (13. Jan 2012)

Empfehle dir auchm bereits vorhandene Bibliotheken zu nutzen. So eine 3D-Kollision mit 3D-Meshes schreibt man nicht mal so nebenbei... das sind sehr aufwendige Und v.a. rechenintesnive) Operationen, die Zeit beanspruchen, wenn man da nicht extrem viel Optimierungsenergie reinsteckt...


----------



## Maxim6394 (14. Jan 2012)

jMonkeyEngine sieht ziemlich beeindruckend aus, aber ein neues projekt zu erstellen klappt nichtmal. es wird zwar erstellt, aber es kann nicht geöffnet werden. bei projekt name steht nur <unrecognized project; missing plug-in?> .
ich hab auch die org-netbeans-modules-java-j2seproject.jar runtergeladen und in den classpath gemacht, weil in der project.xml <type>org.netbeans.modules.java.j2seproject</type> steht. geht trotzdem nicht.


----------



## Marco13 (14. Jan 2012)

Und für die Fage, wie man JME in Netbeans zum laufen bringt, wäre ein eigener Thread vielleicht angebracht...


----------

