triangle-sphere collision

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
grapy
Beiträge: 108
Registriert: 09.09.2004 09:05

Beitrag von grapy »

ich übergebe nacheinander alle Dreiecke (36) meines Objektes.
z.B. ein Würfel, und selbst wenn ich meilenweit entfernt bin,
und nur in die Richtung des Würfels schaue bekomme ich Hit = 1.
und das bis zu 4 x. Keine Ahnung wo ich da ansetzen soll. :roll:
Benutzeravatar
Hades
Beiträge: 100
Registriert: 21.05.2005 11:54

Beitrag von Hades »

Ich test da nur ob die Kugel das Dreieck treffen würde wenn sie sich weit genug in die vorgegebene Richtung bewegt. Da der Richtungsvektor normalisiert ist weiß ich ja nicht wie schnell sich die Kugel bewegt.
Wenn die Procedure einen Hit anzeigt mußt Du die Distanz (CollDist) überprüfen. Ist die Distanz größer als die Strecke die Du die Kugel bewegen willst, dann kannst Du den Hit ignorieren.

Warscheinlich wäre es sinnvoller gewesen gleich ne brauchbare Anleitung zur Benutzung der Funktion dazuzupacken, aber eigentlich war das ja nur als ne kleine Testversion gedacht.

Also mal ne kleine Anleitung:

Wenn Du viele Dreiecke zu überprüfen hast solltest Du eine Art Vorabcheck machen, um nicht unnötig Zeit zu verschwenden.
Zum Beispiel addierst Du die Bewegungsgeschwindigkeit der Kugel zu Ihrem Radius. Logischerweise kann die Kugel mit nichts kollidieren was außerhalb von diesem Bereich ist.
(Wenn Du jetzt die einzelnen Eckpunkte Deines Mesches darauf überprüfst ob sie innerhalb dieses Bereiches sind, brauchst Du danach nur die Dreiecke an meine Funktion schicken, bei denen mindestens eine Ecke innerhalb des Bereiches ist.) *Falsch, siehe nächsten post von mir.

Auch wenn meine Funktion einen Hit meldet, und die Distanz schon kleiner ist als Deine Schrittweite musst Du dennoch alle Dreiecke überprüfen die noch in Frage kommen, da es ja sein könnte das die Kugel mit einem anderen Dreieck noch früher kollidiert.
Du speicherst die geringste Distanz die Du gefunden hast zusammen mit dem Dreieck bei dem Du diese gefunden hast (das wirst Du für Collision Response benötigen). Dann kannst Du die Kugel um diese Distanz nach vorne bewegen. Die Kugel ist dann genau an dem Punkt, an dem die Kollision passiert.

Danach mußt Du halt berechne was bei der Kollision passiert (Collision Response). In jedem Fall mußt Du den Bewegungsvektor derart verändern das die Kugel sich beim nächsten Schritt nicht durch das Dreieck hindurchbewegt mit dem Du jetzt Kontakt hast. Ob Du die Kugel daran entlangleiten oder davon abprallen lässt musst Du entscheiden. Das hängt davon ab was für einen Effekt Du erreichen möchtest.


Diese Anleitung gilt übrigens für die dll Version. Der code den ich oben gepostet habe gibt die Entfernung bis zur Kollition direkt zurück. Bitte nicht verwechseln.
Zuletzt geändert von Hades am 15.04.2006 12:33, insgesamt 1-mal geändert.
Benutzeravatar
grapy
Beiträge: 108
Registriert: 09.09.2004 09:05

Beitrag von grapy »

Danke, das hat mich auf eine Idee gebracht :mrgreen:
Benutzeravatar
Hades
Beiträge: 100
Registriert: 21.05.2005 11:54

Beitrag von Hades »

Hades hat geschrieben:
Wenn Du jetzt die einzelnen Eckpunkte Deines Mesches darauf überprüfst ob sie innerhalb dieses Bereiches sind, brauchst Du danach nur die Dreiecke an meine Funktion schicken, bei denen mindestens eine Ecke innerhalb des Bereiches ist.
Da habe ich Müll geschrieben. :oops:
Denn die Kugel kann ja auch mit der Mitte der Dreiecke kollidieren ohne einen Eckpunkt zu berühren.

Also müßte man den Sicherheitsbereich als 'RadiusKugel + GeschwindigkeitKugel + AusdehnungDreieck' berechnen. Für 'AusdehnungDreieck' müsste die Hälfte der Länge der längsten Achse ok sein.
Wenn alle Dreiecke ähnlich groß sind bietet es sich natürlich an einen festen Wert dafür zu benutzen (den größten von allen Dreiecken).
Antworten