# Kollisonserkennung



## Campino (19. Mai 2005)

hi, 
ich arbeite derzeit mit JOGL an 3D-Grafik. Ich würde gerne wissen, ob meine Objekte, Quader, von denen ich die Koordinate einer Ecke sowie Länge, Breite und Höhe hab, sich überschneiden (also ineinander stecken). Wie geht dass?

Ich hab selbst schon ein wenig experimentiert, bin aber zu keinem (brauchbaren) Ergebnis gekommen. falls jemand grade nicht weiß wie das bei Quadern geht, aber dafür weiß, wie dass bei Polygonobjekten läuft, nehm ich dass auch...  :wink:

[edit]
hier ein Versuch nach EagleEyes Tipp:
Das ganze ist im Quader-Objekt und Vertex ist ein Punkt im 3D-Raum, d.h.ein Eckpunkt des anderen Quaders. so geht dass nicht:

```
public boolean contains(Vertex v){
		//X-Achse:
		boolean x1=this.x<v.getX();
		boolean x2=this.x+this.getWidth()>v.getX();
		//Y-Achse
		boolean y1=this.getY()<v.getY();
		boolean y2=this.getY()+this.getHeight()>v.getY();
		
//		Z-Achse
		boolean z1=this.getZ()<v.getZ();
		boolean z2=this.getZ()+this.getDepth()>v.getZ();
		
		return x1&&x2&&y1&&y2&&z1&&z2;
	}
```
Wo ist der Fehler?


----------



## EgonOlsen (19. Mai 2005)

Wenn du was universelles haben willst, empfehle ich einen Ellipsoid-Polygon-Ansatz, d.h. das sich bewegende Objekt wird durch ein Ellipsoid angenährt und dieser wird gegen die Polygone anderer Objekte/der Welt geprüft. Ist allerdings kein besonders leichter Stoff...hier ist aber ein gutes Tutorial: www.peroxide.dk/papers/collision/collision.pdf


----------



## Campino (20. Mai 2005)

EgonOlsen hat gesagt.:
			
		

> Wenn du was universelles haben willst, empfehle ich einen Ellipsoid-Polygon-Ansatz, d.h. das sich bewegende Objekt wird durch ein Ellipsoid angenährt und dieser wird gegen die Polygone anderer Objekte/der Welt geprüft. Ist allerdings kein besonders leichter Stoff...hier ist aber ein gutes Tutorial: www.peroxide.dk/papers/collision/collision.pdf


erstmal reichen Quader


----------



## Beni (20. Mai 2005)

Also wenn ein Quader einen anderen schneidet, muss wenigstens irgendeine Kante eine Fläche des anderen Quaders durchstossen.

Wenn diese Kante z.B. parallel zur x-Achse ist, und die Fläche des anderen parallel zur yz-Ebene, dann ist doch:

```
x1Gerade <= xEbene <= x2Gerade
y1Ebene <= yGerade <= y2Ebene
z1Ebene <= zGerade <= z2Ebene
```
? Dann könntest du das für alle Kanten machen... Ich weiss, nicht gerade die Hammer-Lösung, aber ein Anfang...

(z1, z2 und andere: jeweils das eine und das andere Ende der Ebene oder der Geraden).


----------



## Campino (21. Mai 2005)

also:

```
public boolean contains(Vertex v){
	      //X-Achse:
		double xb=v.getX();
	      boolean x1=xb>=this.x;
	      boolean x2=xb<=this.x+this.getWidth();
	      boolean bx=x1&&x2;
	      //Y-Achse
	      double yb=v.getY();
	      boolean y1=yb>=this.y;
	      boolean y2=yb<=this.y+this.width;
	      boolean by=y1&&y2;
	      
	      return bx&&amp;
}
```
so geht's erstmal, allerdings nur zweidimensional, für mein derzeitiges Projekt reicht dass, später erweiter ich dass dann um die dritte Dimension...


----------



## toshi122 (14. Okt 2005)

siehe auch folgender Beitrag:

http://www.java-forum.org/de/viewtopic.php?t=23308&sid=96f3572bafa3d829c195d9480a291cd3


----------

