AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Genaue Kollisionen

Ein Thema von kddc.l3usch · begonnen am 14. Feb 2010 · letzter Beitrag vom 17. Jul 2013
Antwort Antwort
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#1

AW: Genaue Kollisionen

  Alt 17. Jul 2013, 14:40
Steinigt mich bitte nicht, weil ich hier uralte Threads ausgrabe..

Ich hab mir vor kurzem auch genauer Gedanken darüber gemacht, wie man den Kollisionszeitpunkt (relativ) genau berechnet.

Problembeschreibung (Beispiel)
Wenn sich zwei Objekte mit einer bestimmten Geschwindigkeit v1 und v2 zueinander bewegen, dann kann es passieren, dass
zwischen Zustand A und B, wobei A der Zustand vor dem Positionupdate (Position += Velocity) ist und B der Zustand danach, eine Kollision stattgefunden hat,
aber der einfache Kollisionscheck das nicht erkennt!

Code:
Objekte:
[X]--------->v1
v2<--[Y]

Zustand A:
[X]     [Y]

Zustand B:
   {Y]      [X]
Ich habe die Objekte als umschließende Kugeln betrachtet (Bounding Spheres), die aus Position, Velocity und Radius bestehen.
Anschließend habe ich als erstes den Zeitpunkt berechnet (approximiert), wo sie den kürzesten Abstand voneinander auf ihren Bahnen haben.
Wenn sie hier kollidieren (Abstand kleiner als Summe beider Radien), so habe ich den Zeitpunkt berechnet (approximiert), wann es gerade eben zu keiner Kollision kommt.
Ähnlicher Ansatz, wie ihn NamenLozer beschreibt.

Im Anhang befindet sich eine kleine Demo, die das ganze in 2d realisiert! Funktioniert aber genauso auch in 3d.
Kritsiert die Struktur nicht, darauf habe ich keinen Wert gelegt - habe es auf die schnelle entwickelt!

Bin für (algorithmische) Verbesserungsvorschläge offen, da das hier mein erster Lösungsansatz ist.
Gibt es bessere Methoden?

Als Optimierung benutzt man doch Quadtrees (2d) und Octrees (3d) und prüft nur Objekte im selben Node auf Kollision (um unnötigen Kollisionscheck zu vermeiden).
Diese Methode wirkt doch dem entgegen; es kann ja durchaus passieren, dass Objekt X in Node 1 mit Objekt Y in Node 2 kollidiert, da die Velocity sehr groß ist~.
Wie integriert man das?
Angehängte Dateien
Dateityp: rar Collision Prediction Demo.rar (361,3 KB, 4x aufgerufen)
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.688 Beiträge
 
Delphi 2007 Enterprise
 
#2

AW: Genaue Kollisionen

  Alt 17. Jul 2013, 15:24
Um das zu berücksichtigen, müsste man alle Quads betrachten, die beide Objekte zwischen den zwei Zeitpunkten durchqueeren. (Es könnten ja durchaus auch mehrere Quads sein.) Man macht also im Grunde erst eine Ermitttlung der Quads der potenziellen Kollidierer auf ihrem Weg innerhalb des Timeframes, dann eine Kollisionsprüfung der beteiligten Quads (aka: welche Quads werden von beiden Partnern durchquert?), und wenn dabei dann Quads übrig bleiben, die beide Bahnen enthalten, wird wirklich die genaue Prüfung gemacht.

Da ich das Teil jetzt nicht angegucken kann, aber dennoch interessiert bin: Du müsstest ja zwei Kollisionspunkte bei Bounding-Circles bekommen. Einen eintretenden, einen Austretenden. Wie unterscheidest du zwischen den beiden, um nicht fälschlicherweise mit dem hinteren zu hantieren?
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: Genaue Kollisionen

  Alt 17. Jul 2013, 15:32
Hierbei handelt es sich nur um eine Zeitpunktsbestimmung, wo gerade eben keine Kollision stattfindet (preCollisionCircles). Eine Kollisionsverarbeitung ist gar nicht drinnen, darum gings ja gar nicht.
Außerdem kriege ich höchstens einen Kollisionspunkt ~ Berührungspunkt!

Aber die Idee mit allen Quads in Bewegungsrichtung ist eig. naheliegend. Danke!
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Genaue Kollisionen

  Alt 17. Jul 2013, 16:03
Achja, wo Aphton das gepostet hat, könnte ich ja eigentlich auch mal meine Lösung von damals posten...

Aber ich warne euch: Der Code ist noch viel hässlicher. Dafür ist er wohl mathematisch exakt (von eventuellen Float-Ungenauigkeiten mal abgesehen). Ich hatte mich „damals“, wohl auch mangels mathematischer Kenntnisse (die ich heute wahrscheinlich/vielleicht hätte), sehr lange daran (und an der Fehlersuche) aufgehalten. Irgendwann war mir deshalb alles egal und ich wollte nur noch, dass es funktioniert, und nachdem es das tat, hab ich es nicht mehr angerührt .

Letztlich habe ich aber das umgesetzt, was in der von mir verlinkten Präsentation beschrieben wurde: Aus „bewegtem Kreis + bewegtem Kreis“ wird „fester Kreis + bewegter Kreis“ und daraus wird „fester, größerer Kreis + Strahl“.

Man kann in dem Test-Formular mit der linken bzw. rechten Maustaste die beiden Kreise platzieren und mit linker/rechter Maustaste bei gedrückter Shift-Taste ihre Bewegungsrichtung und Geschwindigkeit einstellen. Die Semantik ist hier also auch etwas anders als bei Aphtons Testprojekt.
Angehängte Dateien
Dateityp: zip Collision.zip (218,0 KB, 8x aufgerufen)

Geändert von Namenloser (17. Jul 2013 um 16:13 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz