# Kollisionserkennung



## Pommes9485 (10. Jan 2012)

Hallo,

momentan handhabe ich es so, das wenn ich mich bewege eine Methode ausführt, welche berechnet ob die Position zu der ich will OK ist, oder nicht. Dazu gehe ich die Liste aller Elemente durch und gebe True oder false zurück. Ist Performance Technisch sicherlich verbesserungswürdig, aber gut...

Nur ich bekomme einfach die Bedingung nicht auffe Reihe.
Momentan :

```
float x1, y1,z1;
        x1=tmp.gibDaten()[0];
        y1=tmp.gibDaten()[1];
        z1=tmp.gibDaten()[2];
        if(-x<=x1+1 && -x >= x1-1 && y1>=1 || -z<=z1+1 && -z>=z1+1 && y1>=1 )
        {
        geht =false;
        System.out.println("NICHT");
        }
        
        }
```
x1,y1,z1 sind die Daten vom aktuellen Block, während x,y,z die Position ist, zu der ich hin möchte.
Die Daten sind logischerweise die Mittelpünkte und haben einen Radius von 1. 

Da man momentan (und vll auch nie) nicht springen kann, habe ich die y-Werte darauf beschränkt, das ich über den Boden laufen kann, dieser liegt bei 0, +1 für den Radius....

Momentan ist es so, das ich mich nie bewegen kann, egal wie hoch ich bin... Habe auch schon einiges durchprobiert, aber ich habe da vermutlich einen Denkfehler drinne.

P.S.: Die Werte x,y und z sind negativ, daher drehe ich sie zum vergleichen um, die Positionen passen aber alle ...


----------



## tdc (10. Jan 2012)

Ach ja, mein Lieblingsthema. *hust*



Pommes9485 hat gesagt.:


> aktuellen Block


Aha, du hast also Blöcke



Pommes9485 hat gesagt.:


> Die Daten sind logischerweise die Mittelpünkte und haben einen Radius von 1.


Logischerweise? Nein, das macht keinen Sinn. (edit: bzw. es macht wenig sinn, es so zu machen)

Entweder du hast Blöcke mit x, y, z und breite, höhe, tiefe oder du hast Kugeln mit einem Mittelpunkt und Radius.


Da ich mich zufälligerweise gerade mit Kollisionserkennung beschäftige, kann ich dir mal einen Ansatz mit AABB (Axis Aligned Boundig Boxes) geben:

Wenn du von jedem Objekt x, y, z, breite, höhe, tiefe hast, musst du überprüfen, ob sich die Bounding Boxes auf allen Achsen überschneiden. Denn wenn sich zwei BBs zwar auf der X und auf der Z-Achse von den Koordinaten her überschneiden, kann es dennoch sein, dass die eine BB sich auf der Y-Achse viel weiter oben befindet und es somit nicht zu einer Kollision kommt.

Beispiel für die X-Achse:

```
if(	(a.getX() >= b.getX() && a.getX() <= b.getX() + b.getWidth()) ||
			(a.getX() + a.getWidth() >= b.getX() && a.getX() + a.getWidth() <= b.getX() + b.getWidth()) ||
			(a.getX() <= b.getX() && a.getX() + a.getWidth() >= b.getX() + b.getWidth()))
		{
			return true;
		}
		return false;
```
(ich bin mir gerade nicht sicher, ob das der einfachste Weg ist, aber es sollte funktionieren)

Letztendlich werden in dem Code 3 Fälle unterschieden: der X-Punkt befindet sich innerhalb der anderen BB, der Punkt X+Breite befindet sich innerhalb der anderen BB oder die Punkte befinden sich einmal davor und einmal dahinter. (kann nur passieren, wenn die BB von b kleiner ist, als die von a)

Wenn du das für alle Achsen machst sollte es funktionieren. (Wenn ich mich jetzt nicht komplett vertan habe )


----------



## HimBromBeere (11. Jan 2012)

Mein Vorredner hat völlig recht, du musst in allen drei Dimmensionen die Koordinaten aufeiandner überprüfen. Einen Körper mit Radius 1 halte ich designtechnisch auch für eher doof gewählt, für eine Kugel ist die Kollision nämlich sehr viel schwieriger zu errechnen als für einen Quader.

EDIT: Willst du jedoch unbedingt eine Kugel ereichen, ist die Darstellung in karthesichen Koordinaten aufgrund der komplizierten Rechnungen eher suboptimal, dann solltest du am ehesten auf Kugelkoordinaten umspringen... deren Erläuterung würde jedoch diesen Beitrag minimal sprengen  und außerdem sind die für´s Rendern auch wider umständlich


----------



## tdc (11. Jan 2012)

HimBromBeere hat gesagt.:


> EDIT: Willst du jedoch unbedingt eine Kugel ereichen, ist die Darstellung in karthesichen Koordinaten aufgrund der komplizierten Rechnungen eher suboptimal, dann solltest du am ehesten auf Kugelkoordinaten umspringen... deren Erläuterung würde jedoch diesen Beitrag minimal sprengen  und außerdem sind die für´s Rendern auch wider umständlich



Nicht ganz... wenn es in der Szene NUR Kugeln gibt, ist die grobe Kollisionserkennung sogar noch einfacher: einfach Abstand zwischen Mittelpunkten der beiden Kugeln berechnen und schauen ob der Abstand <= Radius1 + Radius2 ist. Wenn ja, findet eine Kollision statt, ansonsten nicht.


----------



## HimBromBeere (11. Jan 2012)

> einfach Abstand zwischen Mittelpunkten der beiden Kugeln



Das sind soweit ich weiß aber nicht Kugelkoordinaten, es sei denn, wir definieren die mal schnell anders (Kugelkoordinaten ? Wikipedia).

Also ich kenn sie jedenfalls nur als: Radius r, Drehwinkel Phi und Polarwinkel Theta...


Aber die Kollision der Kugeln geht natürlich mit Mittelpunkt und Radius tatsächlich schön schnell...


----------



## Lulumann6 (11. Jan 2012)

hä wie kommst du auf kugelkoordinaten?
die kann man in die tonne kloppen sobald man mindestens eine kugel hat deren mittelpunkt nicht der nullpunkt des raums ist...


----------



## HimBromBeere (11. Jan 2012)

Kann ja sein, dass das übergeornete Koordinatensystem eine Kugel (z,B, die Erde ist... auch wenn das erstmal nicht stimmt, aber das ist ein anderes Thema)

Das mit dem Koordinatenursprung ist quatsch, wenn du zwei Körper auf Kollision testen willst, gehst du nicht erst über den Ursprung, sondern du wirst einfach eines der beiden als den Urpsrung definieren und dann den Abstand zum anderen berechnen. Das selbe machst du auch bei der Kugel... 


Aber eine Analyse von Koorinatensystem will ich jetzt hier nicht anfangen, das scheint mir bei der Frage nicht zielführend zu sein...


----------

