2D-Kollisionsabfrage brauche hilfe

Einstiegsfragen, Mathematik, Physik, künstliche Intelligenz, Engine Design
Antworten
dba
Beiträge: 4
Registriert: 02.04.2009, 10:52

2D-Kollisionsabfrage brauche hilfe

Beitrag von dba »

Hallo!

ich ich probiere gerade ein "spiel" zu programmieren, bei dem erst einmal nur Kugeln von einer Linie abprallen sollen.
Seit einigen tagen mache ich mir schon darüber gedanken und drehe mich mehr oder weniger im kreis.
Das Problem genauer erläutert:
Um Geschwindigkeit darzustellen muss ich Pro render mehrere Pixel überspringen. also Pixel / Render ist die geschwindigkeit.
Man erkennt dann auch recht früh, dass eine Kollision dadurch erfasst werden kann, indem man an die Kugel einen kleinen schwanz hinten ransetzt, der die strecke "zwischen" den bildern darstellt. Man sozusagen einen Pfeil hat.
Meine Kollisionsabfrageklasse überprüft nun, ob ein Hinternis von der Linie geschnitten wird. klingt erstmal ganz easy. Performant ist es allerdings nicht.
Man hat mir gesagt, dass ich mit vektoren arbeiten muss, da ein hindernis in form einer senkrechten Line (steigung = unendlich) lässt sich somit nicht erfassen (für mich nicht...). daher würde ich gerne mit euch besprechen, wie ihr das lösen würdet. und zwar designtechnisch und mathematisch. Also wie handhabt ihr die weite phase der Kollisionserkennung usw...
ich hab bisher die vorstellung gehabt, ein raster über das feld zu legen und nur die Felder zu checken, in denen vermutlich eine Kollision stattfindet.

ich freue mich auf eure antworten und hoffe auf erleuchtung :mrgreen:
schöne grüße und happy coding
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 577
Registriert: 05.07.2003, 11:17

Re: 2D-Kollisionsabfrage brauche hilfe

Beitrag von Lord Delvin »

Also erstmal Designtechnisch:

Du musst deine "Welt" vom Renderingprocezz trennen, sonst wirst du nicht weit kommen. D.h. du musst dir eine Repräsentation für deinen Kreis/Strich überlegen die für die Handhabe dieser am sinnvollsten ist und nicht fürs Rendern an sich.
Den Renderer kann man auch später noch schreiben.

Für dein mathematisches Problem könnte ich box2d empfehlen. Hab zwar nie was damit gemacht, sah aber gut aus und alle schienen recht zufrieden zu sein.
Wenn nicht, dann musst du dich halt erstmal in Vectoren/Matrizen einlesen und dann in verschiedene Repräsentationon geometrischer Objekte Kreise/Striche/Geraden.


Als kleiner Tipp am Rande: Wenn du deine Linie als Hyperebene über float² auffasst, dann ist der schnitt mit der Kugel ziemlich einfach, weil du dann einfach nur die distanz zwischen Mittelpunkt und Hyperebene mit dem Radius vergleichen musst.

Gruß
LordD
XML/JSON/EMF in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
Xethoras
Beiträge: 36
Registriert: 05.03.2008, 21:56

Re: 2D-Kollisionsabfrage brauche hilfe

Beitrag von Xethoras »

Weiß net, ob du das Problem mit dem Beitrag über mir bereits gelöst hast bzw. überhaupt noch an einer Lösung interessiert bist, aber ich sag trotzdem mal etwas dazu:

Sofern die Linie tatsächlich senkrecht ist, kannst du einfach nur die X-Entfernung von Kugelmittelpunkt und Linie errechnen (Betrag von(X-PositionKugel - X-PositionEbene))(um den Betrag zu errechnen entfernst du einfach, sofern vorhanden das Minus(-)) und davon ziehst du den Radius der Kugel ab.
Sieht dann in Pseudocode so aus:

Code: Alles auswählen

EntfernungX=KugelPositionX - LiniePositionX
Wenn(EntfernungX < 0)
{ EntfernungX = EntfernungX * -1 }

Wenn(EntfernungX < Radius)
{ KOLLISION!!! }
:D
Sofern die Linie nicht unendlich lang ist, ist es etwas komplizierter: Du überprüfst zusätzlich ob die Y Position der Kugel größer oder kleiner als die größte bzw. kleinste Y Position der Linie und wendest dann den Pythagoras an um die Entfernung zu ermittlen:

Code: Alles auswählen

Wenn(MaxPositionLinieY < KugelPositionY)
{ Wenn(Wurzel((KugelPositionX - LinePositionX)²+(KugelPositionY - MaxPositionLinieX)²)<KugelRadius)
  { KOLLISION!!!  }}
Sonst Wenn(MinPositionLinieY < KugelPositionY)
{ Wenn(Wurzel((KugelPositionX - LinePositionX)²+(KugelPositionY - MinPositionLinieX)²)<KugelRadius)
  { KOLLISION!!!  }}
Sonst
{ EntfernungX=KugelPositionX - LiniePositionX
Wenn(EntfernungX < 0)
{ EntfernungX = EntfernungX * -1 }

  Wenn(EntfernungX < Radius)
  { KOLLISION!!! } }
Antworten