Kollisionen mit Ausweichmanövern/Drehungen
Übersicht

jeykeyBetreff: Kollisionen mit Ausweichmanövern/Drehungen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich arbeite jetzt schon einige Zeit an einen Spiel, indem man u.a. ein Fahrzeug (aus der Vogelperspektive) steuern kann. Auf der Spielmap gibt es auch viele Hindernisse die alle möglichen Formen haben, z.B Kisten mit denen das Fahrzeug kollidieren kann. Die Kollisionsberechnungen funktionieren schnell und werden pixelexakt erkannt, allerdings kommt es so oft vor, dass das Fahrzeug irgentwo hängen bleibt, nur wegen ein paar Pixel die sich überchneiden. Für diesen Fall möchte ich, dass sich das Fahrzeug automatisch in die richtige Richtung wegdreht. Ich find das ganze kann man mit folgenden Bild besser erklären:
![]() Dargestellt sind zwei Situationen: Das Rechteck soll das Fahrzeug sein, dass gegen ein Hinderniss fährt, der blaue Pfeil ist der Vektor der Bewegungsrichtung, der rote Pfeil ist der Kollisionsvektor, beide gehen vom Mittelpunkt des Fahrzeugs aus und sind bekannt. Der grüne Pfeil deutet an in welche Richtung sich das Fahrzeug wegdrehen soll. Hier sind nur 2 mögliche Fälle abgebildet, im Spiel muss die Kollisionswand nicht unbedingt gerade sein. Nun zu meinen Problem: Wenn der blaue Pfeil rechts von dem roten ist, dann soll nach rechts abgelenkt werden, ansonsten nach links. Ich kann zwar den Winkel zwischen zwei Vektoren berechnen, aber das ist immer nur ein absoluter Winkel der mir hier nicht weiterhilft. Ich bräuchte so etwas wie einen relativen Winkel des roten Vektors zum blauen. Oder hat jemand einen anderen Denkansatz wie man so etwas lösen könnte? |
||
![]() |
ZaP |
![]() Antworten mit Zitat ![]() |
---|---|---|
Rechne doch einfach den Schnittwinkel von der Normalen der Wand und dem Richtungsvektor des Fahrzeugs aus (wie kommst Du darauf, dass der nicht relativ ist?) | ||
Starfare: Worklog, Website (download) |
jeykey |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich kann keinen Normalenvektor der Wand bestimmen, weil das bei der Kollision immer nur ein einziger Pixel ist, und die Wand nicht immer schön glatt und gerade. Ich berechne meine Winkel mit folgender Formel:
cos(alpha) = (a ° b) / (|a| * |b|) Damit kommt logischerweise immer nur ein absoluter Winkel heraus, was mit nicht weiterhilft... |
||
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hast du keine möglichkeit, bei deiner Kollision die umliegenden Pixel wiederzugeben?
Damit könntest du aus 3 Pixeln einen mittelwert für den Normal erstellen. Ansonsten wäre der einzige vorschlag den ich habe, die Bewegung im vergleich zum letzten frame zu speichern. Einen schritt zurückgehen (im falle einer kollision also die bewegung rückgängig machen) und das auto trotzdem drehen, als wäre es diesen frame gefahren. Danach muss allerdings eine erneute kollisionsprüfung stattfinden. Sollte die ebenfalls wieder stattfinden, muss auch die drehung zurückgenommen werden. Es sollte eigentlich auch einfacher gehen.. Einfach in die richtung bestimmen, in die das Auto zeigt in relation zur Kollision. Mir brummt grade der Schädel, aber in etwas wie das hier geht meine idee: BlitzMax: [AUSKLAPPEN] Local WA:Float = Abs(180-winkel_auto_zu_wand) WA steht für Winkel Auto->Wand AM stat für Winkel Auto->Bewgungsrichtung bissl rumgerechnet grade, könnte aufgehen ![]() Sgn gibt 1,0 oder -1 aus, je nachdem ob das ergebnis positiv, negativ oder null ist. *10 ist die winkelveränderung -> Sollte der Wand-winkel eher an der 0 sein, bewegt sich das auto im uhrzeigersinn, sonst andersrum. ---- Anmerkung: Ich habe das ganze auf die schnelle anhand deiner bilder durchdacht. Keine ahnung, wie es sich in anderen Situationen verhält ![]() Ps: Mein codingstil ist äusserst unsauber ![]() |
||
jeykey |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ok, das ganze ist anscheinend doch nicht so einfach ![]() Hier mal ein Bild von einer typischen Situation ingame: ![]() Alle Objekte im Spiel haben eine eigene Kollisionsmatrix, wenn sich zwei Objekt sehr nahe kommen werden die Matrizen beider genauer untersucht, bei einer Kollision gibt es dann ein oder mehrere Pixelpositionen die sich überschneiden. Bisher habe ich immer den Mittelwert all dieser Positionen berechnet und aus diesen wiederum den Kollisionsvektor. Ich hatte gehofft auf diese Weise herauszufinden ob ich nach links oder nach rechts drehen muss. Ich kann leider keinen Winkel zwischen dem Auto und der Wand berechnen weil ich auch noch Kisten hab die nicht so schön gerade sind und auch noch andere Objekte, ich denke die beiden Vektoren in der oberen Skizee müssten doch ausreichen um das ganze richtig zu berechnen, oder? |
||
jeykey |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Vielleicht kennt auch jemand ein gutes Tutorial für eine Physik Engine, ich hab zwar auch schon welche gefunden, aber dort wurden nur einfache Sachen wie Kräfte Masse und Geschwindigkeit behandelt, was mich aber interessiert sind Kollisionen, Impuls und elastischer/inelastischer Stoß. | ||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
wenn du herausfinden könntest, welche Ecke deines Autos betroffen ist, wären alle weiteren Vektorenberechnungen unnötig: stößt die linke vordere Ecke an, dann muss das Fahrzeug nach rechts drehen, u.s.w
ich bringe für solche Fälle zwei "Sensoren" am Fahrzeug, die dann ebenfalls eine Kollision melden. |
||
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also ich würde dir dazu raten (hab damit ganz gute Erfahrungen gemacht), die map nicht über Pixel auf Kollision zu Prüfen sondern nur die Kanten der Map separat als Types speichern und diese dann auf Kollision prüfen. Das ist 1. schneller als Pixel genaue Prüfung, 2. Genauer und 3. hast du hinterher viel mehr Möglichkeiten (wie in deinem Beispiel), die Kollisionsbedingungen zu bestimmen, also in welchem Winkel das Fahrzeug auftritt und bspw. ob die wand elastisch ist, welche Reibung sie hat (kann ja sein das es Geschmierte Wände gibt wo man nur so langgleitet)
mfg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group