.
|
|
| Autor | Beitrag |
|---|---|
|
000 02.12.2003, 20:04 the_viking |
Hallo! Weis jemand von euch, wie man zwei konkave Polygone in 2D auf eine Kollision hin testen kann? Ich hab schon google bemüht usw. aber nicht wirklich was gefunden... *helpless* Danke, ihr seid meine Rettung! --thx, cu, MfG the_viking (( My =]=H=O=M=E=> Page! )) |
|
Profil || Suche |
|
001 30.04.2004, 17:28 Dein-Zahnarzt |
Schau in dein Tafelwerk. Da sollte drinn stehen wie man berechnet ob ein Vektor eine Fläche schneidet. Wenn das passiert ist es schon zu spät, also sind die zwei Polygone ein Frame (oder so) vorher kollidiert. Das wäre mein Ansatz, in deine Programmier, welche auch immer, musst du es selbst kriegen. Die Lösung aller Eurer Probleme: |
|
Profil || Suche |
|
002 30.04.2004, 18:38 Mazze |
Wieso ist es dann schon zu spät? Ich würde sagen, wenn ein Vektor eine Fläche schneidet wird der Punkt im nächsten Frame innerhalb der Fläche liegen. Matze --BattleTech-MOD: |
|
Profil || Suche |
|
003 30.04.2004, 18:47 Dein-Zahnarzt |
Wenn man die Kanten der Fläche als Vektoren betrachtet und diese dann die andere Fläche schneiden, passierte die wirkliche Kollsion etwa ein Frame vorher. Ist doch logisch. Denn in dem Moment in dem sie die Fläche schneiden, passiert das was man verhindern will, nämlich dass sie nicht kollidieren. --Die Lösung aller Eurer Probleme: |
|
Profil || Suche |
|
004 30.04.2004, 20:06 Mazze |
Du betrachtest die Kanten als Vektoren? Ich betrachte den Richtungsvektor jedes einzelnen Punktes als Vektor, der dann auf Kollision getestet wird. Das geht natürlich nur bei sich bewegenden Objekten. --BattleTech-MOD: |
|
Profil || Suche |
|
005 30.04.2004, 20:18 Dein-Zahnarzt |
Ah, daher rührt das Missverständnis. Deine Methode funzt anders als meine. Ich überprüfe ob die poly ineinander stecken, du hingegen schaust nach ob das passieren würde. Der Nachteil bei deiner Methode ist, dass nur dann eine kollision festgestellt wird wenn auch einer der Punkte das Tri erwischt. Wenn alle daran vorbei gehen können die Kante aber immer das Tri schneiden. --Die Lösung aller Eurer Probleme: Dieser Beitrag wurde am 30.04.2004 um 20:28 von Dein-Zahnarzt bearbeitet. |
|
Profil || Suche |
|
006 30.04.2004, 20:39 Nicemice Moderator |
Wenn du den Schnitt von zwei konkaven Polygonen berechnen willst, funktioniert das folgendermaßen: Du nimmst je Kante beider Polygone und testet ob sie sich schneiden. Das machst du mit allen Kantenpaaren. Falls es kein Paar von Kanten gibt welche sich schneiden, so kollidieren die Polygone nicht. --www.d3opencoop.com - A Doom3 Cooperative Mod |
|
Profil || Suche |
|
007 30.04.2004, 20:58 Dein-Zahnarzt |
Nee. Es müssen sich doch nicht unbedingt die Kanten untereinander schneiden. Es kann auch sein, dass die Kanten einfach durch die Mitte des anderen Poly durchgehen. --Die Lösung aller Eurer Probleme: |
|
Profil || Suche |
|
008 30.04.2004, 21:06 theDon |
wenns durch die mitte geht, gehts auch durch ein kantenpaar. --\o tanz den naziprau! o/ And more than ever, I hope to never fall, |
|
Profil || Suche |
|
009 30.04.2004, 21:14 Dein-Zahnarzt |
Nein! Wie kommts du denn auf die Idee? Ich versuch's mal anschaulich. Mist, ich hab versuch das mit ASCII darzustellen aber ThW löscht die Leerzeichen. --Die Lösung aller Eurer Probleme: Dieser Beitrag wurde am 30.04.2004 um 21:16 von Dein-Zahnarzt bearbeitet. |
|
Profil || Suche |
|
010 30.04.2004, 23:59 WareWolf |
Mensch, macht mal einer ne Zeichnung, ich kann mir immer noch nicht so recht 2 konkave polygone in 2D vostellen, meinste so Halbmonde oder ähnliches? --Sig as a brick ┴┬┴┬┴┬┴┬┴┬┴┬┴ |
|
Profil || Suche |
|
011 01.05.2004, 00:09 Dein-Zahnarzt |
Ich schätze mal, dass der Autor uns sein Problem nicht mehr erläutern wird, da er letztes Jahr diesen Thread erstellte. Belassen wir es dabei. --Die Lösung aller Eurer Probleme: |
|
Profil || Suche |
|
012 01.05.2004, 00:10 KhanRKerensky |
http://marvin.sn.schule.de/~inftreff/modul8/bild1.gif Google, Warewolf :P Was die Zahnarzt meint ist eine 3D kollision von 2 2D Polies, aber das wird glaubich nicht der Fall sein. --"[...] you're going to burn in a very special level of Hell. A level they reserve for child molesters and people who talk at the theater." - Book |
|
Profil || Suche |
|
013 01.05.2004, 00:17 Nicemice Moderator |
Ok, ich hatte einen Fall übersehen. Ein Polygon kann die Teilmenge eines Anderen sein. Dann halt anders. Du testet für jeden Eckpunkt eines der Polygone ob er in dem Anderen liegt oder draußen. Das kannst du folgendermaßen machen: Mt dem Punkt konstruierst du parallel zu Koordinatenachse eine Halbeachse. Dann zählst du die Schnitte dieser Halbachse mit dem anderen Polygon. Ist die Anzahl der Schnitte ungerade, so liegt der Punkt drinnen. Ist sie gerade, so liegt der Punkt draußen. Das machst du für jeden Punkt und entscheidest somit, ob sich die Polygone schneiden. --www.d3opencoop.com - A Doom3 Cooperative Mod |
|
Profil || Suche |
|
014 04.05.2004, 13:31 Dein-Zahnarzt |
@khan: Stimmt ich meinte 3d Kollision. Die Lösung aller Eurer Probleme: |
|
Profil || Suche |
|
015 05.05.2004, 10:14 Dein-Zahnarzt |
Ich hab nochmal drüber nachgedacht. Am besten ist es wenn man, wie mazze meinte, die Geschwindigkeitsvektoren jedes einzelnen Punktes betrachtet. Wenn mindestens einer dieser Vektoren einen der anderen Fläche (Kante oder Geschwindigkeit) schneidet, so werden sie kollidieren. Mit dieser Methode schließt man auch Fehler bei niedrigen Framerates aus. Bei 3d Kollision müsste man für jede Kante eine "Geschwindigkeitsfläche" betrachtet. Zwischen der aktuellen Position der Kante und der des nächsten Frames entsteht eine, eventuell aus zwei Dreiecken bestehende Fläche. Wenn ein Vektor eines Polys irgendeine Fläche des anderen schneidet, findet eine Kollision statt. Die Lösung aller Eurer Probleme: |
|
Profil || Suche |
|
016 05.05.2004, 13:00 Mazze |
Soso...jetzt hab ich doch recht :p Da gibts doch sicher massenweise tutorials auf diversen gamedev seiten. Matze --BattleTech-MOD: |
|
Profil || Suche |
|
017 05.05.2004, 13:14 Dein-Zahnarzt |
Hattest du vorher auch, wenn man davon ausgeht dass 2d kollidiert wird. Ich dachte nur, dass meine Methode ein ebenso zuverlässiges Ergebnis bringt wie deine. Die Lösung aller Eurer Probleme: Dieser Beitrag wurde am 05.05.2004 um 13:17 von Dein-Zahnarzt bearbeitet. |
|
Profil || Suche |
|
018 05.05.2004, 16:02 Nicemice Moderator |
Ach ja, und was machst du wenn ein Polygon das Andere komplett umschließt, so das sich gar keine Kanten überschneiden ? --www.d3opencoop.com - A Doom3 Cooperative Mod |
|
Profil || Suche |
|
019 05.05.2004, 20:46 WareWolf |
..dann hat die Kollision sicherlich vorher schon stattgefunden...und wurde erkannt. --Sig as a brick ┴┬┴┬┴┬┴┬┴┬┴┬┴ |
|
Profil || Suche |
|
020 05.05.2004, 21:53 Nicemice Moderator |
Es war nie von sich bewegenden Polygonen die Rede... --www.d3opencoop.com - A Doom3 Cooperative Mod |
|
Profil || Suche |
|
021 06.05.2004, 11:44 Mazze |
Ich hab schon vor 16 Posts gesagt, dass das nur bei sich bewegenden Objekten funktioniert... Wir wissen nicht, ob sich die Objekte bewegen, da die Frage uralt ist. cu --BattleTech-MOD: |
|
Profil || Suche |
|
022 06.05.2004, 14:01 Onkel Dittmeyer |
Nichts zwangsweise, wenn sich ein Objekt schnell genug bewegt und die Kollision nicht in einem Kollisionsframe erfasst wurde... oder wenn das Polygon einfach direkt auf die Position "teleportiert" wurde. -- |
|
Profil || Suche |
|
023 07.05.2004, 14:55 Mazze |
Das musst du mir jetzt aber aufzeichnen... cu --BattleTech-MOD: |
|
Profil || Suche |
|
024 07.05.2004, 15:10 Prefect |
Ich habe mir über solche Probleme leider noch nie wirklich ernsthaft den Kopf zerbrochen. Aber so spontan würde ich einen Lösungsansatz vorschlagen, der dem Rasterizing beim Rendern von Polygonen entlehnt ist. Dazu werden zunächst die Punkte beider Polygone, und die mit ihnen verbundenen Kanten, in eine gemeinsame Liste geschrieben und entlang einer Koordinatenachse (sagen wir z.B. entlang der Y-Achse) sortiert. Dann gehen wir diese Liste Punkt für Punkt durch, wobei wir jederzeit eine Liste der "aktiven Kanten" im Speicher behalten. Die Liste der aktiven Kanten ist einfach die Liste aller Kanten, die man erhält, wenn man eine Gerade y = n (d.h. eine Horizontale) legt und alle Kanten aufzählt, die sie schneidet. Es ist sinnvoll, auch die Liste der aktiven Kanten sortiert zu lassen - natürlich entlang der anderen Achse (X-Achse). Jedes Mal, wenn wir einen Punkt abarbeiten, ergeben sich drei "Aktionsmöglichkeiten": [2] Der eigentliche Kollisionscheck erfolgt nur in den Fällen 1 und 3. In diesen Fällen werden neue Kanten eingefügt, und muss die Sortierung der Liste der aktiven Kanten aufrecht erhalten werden. Nun sollte beim Sortieren sowohl der Anfangs- als auch der Endpunkt der beteiligten Kanten berücksichtigt werden. Wenn beide Punkte jeder Kante berücksichtigt werden, so ist es nicht immer eindeutig möglich, eine Kante vor eine andere Kante zu sortieren. Genau in diesem Fall der Unentscheidbarkeit schneiden sich die Kanten, und eine Kollision zwischen den Polygonen liegt vor. Ein beliebter Problemfall von Kollisionsalgorithmen ist der, dass eins der Polygone vollständig im anderen enthalten ist. Auch mein bisher gezeigter Algorithmus kommt mit diesem Fall noch nicht zurecht. Es gibt nun zwei Möglichkeiten: 2. Polygone mit Löchern werden unterstützt. Ein Kantenpaar in der Liste der aktiven Kanten muss dann immer aus einer nach links, und einer nach rechts gerichteten Kante bestehen. Sobald diese Regel verletzt wird, liegt eine Kollision vor. Damit müssten alle Fälle abgedeckt sein. Allerdings habe ich diesen Algorithmus noch nie gesehen und noch nie ausprobiert. Deshalb ist eine Prise Salz hiermit Bestandteil des Lieferumfangs. cu, [1] Diese Eigenschaft einer sortierten Kantenliste ist auch dann gültig, wenn Polygone Löcher enthalten. Allerdings können Kantenpaare in diesem Fall durch Punkte aufgeteilt und neu zusammengefügt werden. [2] Ein etwas unangenehmer Sonderfall sind in meinem Algorithmus leider horizontale Kanten. [3] Die Positionen der Paare sind fest. Das heißt, die aktive Kante an Position 0 in der Liste bildet ein Paar mit aktiver Kante 1; aktive Kante 2 bildet ein Paar mit aktiver Kante 3. Im Gegensatz dazu bilden die Kanten 1 und 2 *kein* Kantenpaar. --Widelands - Gemütliche Aufbaustrategie, Free Software |
|
Profil || Suche |
|

