Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 00:05

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Sphere/Poly CollisionResponse
BeitragVerfasst: Mi Nov 26, 2003 19:10 
Offline
DGL Member

Registriert: Mo Nov 03, 2003 20:23
Beiträge: 66
Kann mir nochmal jemand ne Frage beantworten? Ich habe meine Sphere-Poly Responseroutine so geschrieben, dass sie eine 'kugel' soweit von der Plane 'wegstösst' wie sie in ihr drin ist. Hier ist aber ein empfindliches Problem versteckt! Verlässt man das Poly, gilt trotzdem noch dessen Plane als Bezugspunkt für den Response:

Das folgende Beispiel zeige eine Sphere, die auf einem Polygone sitzt
Bild

Im nächsten Frame verursacht die Gravitation, dass die Sphere in den Boden eintaucht.
Bild

Hier nehme ich jetzt den rotmarkierten [SphereRadius - PlaneDistance] Wert und Addiere ihn einfach zu der Spheremitte. Verlasse ich aber jetzt den Aktuellen untergrund und bewege mich auf das danebengelegene Polygon zu, gilt diese Regel trotzdem... Halt aber eben nur, wenn die Kugel die hier waagerechte Ebene nochmals schneidet...
Bild

Jetzt das Problem: Tritt dieser Fall tatsächlich ein, wird die Kugel wieder um den [SphereRadius - PlaneDistance] Wert zurückgepfiffen :oops: . Ich sitze dann auch nicht auf der grünen Linie, sondern Fall immer wieder ins Unglück, was mich zurücksetzt...

Wie kann ich mich von der 'Ecke' entfernen?

Bzw. Wie müsste die Formel dafür aussehen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 26, 2003 19:27 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Die bessere Idee ist die Kugel gar nicht kollidieren zu lassen. Die Kollisionsfunktion testet nur ob eine Kollision statgefunden hat oder nicht. Dann bekommt man auch weniger Ärger mit der Gleitkommaungenauigkeit. Wenn die Kugel kollidiert hat, dann paßt man den Geschwindigkeitsvektor so an, daß er parallell zur Ebene verläuft und probiert es nochmal. Wenn eine Kollision mit mehr als 3 Ebenen stattgefunden hat, dann kann man die Bewegung auch abbrechen, denn dann wird es unter Umständen schwer sein einen Vektor zu finden, der zu allen drei Ebenen parallel ist.
Die Kugel befindet sich also niemals an einer ungültigen Position. Der ungünstigste Fall ist, daß die Bewegung blockiert wird.
Für menschliche Spieler würde ich auch statt der Kugel eine AABB nehmen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 26, 2003 20:30 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Wenn du mit deinem bestehenden Code "billig" weiterarbeiten möchtest, lässt du einfach einen Zähler mitlaufen, der immer wieder zurückgesetzt wird, wenn die Kugel mal nicht kollidiert.

Überschreitet der Zähler einen bestimmten Wert (drei, fünf, zehn, was auch immer) hängst du offensichtlich irgendwo fest, und du setzt die Kugel auf einen bekannten Ausgangszustand zurück.
Das Problem ist durchaus nicht selten - man kann es z.B. so lösen, dass "unsichtbare" Wände gezogen werden, um zu verhindern, dass ein Objekt in irgendwelche beengte Umstände gerät, aus denen es schwer wieder hinausmanövrieren kann.

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 26, 2003 21:28 
Offline
DGL Member

Registriert: Mo Nov 03, 2003 20:23
Beiträge: 66
Das Problem hat folgenen Ursprung:

Ein Auto hat 4 Reifen... ein Reifen ist ein Zylinder. Der einfachhait halber, kann man das problem ja erstmal mit einer Kugel angehen, weil ein Zylinder eine platte Kugel (ein Kreis o. unendlich dünner Ellipsoid) mit einer Line (NearstPointOnLine) in der Mitte ist. Eine AABB für Player ist ok...

Ein Terrain ohne Vehicles ist ÖDE! ;)

Jetzt weiss ich nur nicht, wie ich die Kugel am dauerhaften Fall hindern kann :(

Folgendes 'Ergebniss' würde mir echt helfen:
Bild

Wie kann ich sowas Mathematisch lösen? :oops:

Ich habe erstmal zum Testen den Player in soeine Sphere gesteckt... "Treppensteigen" ist unmöglich, weil er selbst eine klitzekleine Stufe als "Wand" behandelt


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 27, 2003 08:38 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
Schau doch mal bei der Open-Dynamics-Engine vorbei (gibt's auch für Delphi. Einfach Google nach DelphiODE befragen). Dort ist ein Delphi-Example, welches eine Kugel recht genau über ein Terrain rollen lässt (und sonstige samples, wie z.B. Auto etc.). Das ganze arbeitet zwar mit GLScene, aber es geht ja nur um die Mathematischen Berechnungen. Und da die ODE frei ist, spricht eigentlich nichts gegen ihre Verwendung!

_________________
Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 27, 2003 10:20 
Offline
DGL Member

Registriert: Mo Nov 03, 2003 20:23
Beiträge: 66
Ich habe es schon hinbekommen :D

War eine Zeile mehr Code :oops:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 27, 2003 17:35 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Jan 04, 2003 21:23
Beiträge: 674
Wohnort: Köln
kannste uns denn die Lösung hier preisgeben, damit andere, die in Zukunft das gleiche Problem haben auch davon profitieren können??

_________________
. . .


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 27, 2003 18:27 
Offline
DGL Member

Registriert: Mo Nov 03, 2003 20:23
Beiträge: 66
Ich bring morgen den Sourcecode mal mit.

Generell ist es sehr einfach. Man testet ja erst, ob die Spheremitte+Radius der Plane nahekommt bzw. diese schneidet. Wenn ja, dann projeziert man die Spheremitte auf die Plane und schaut, ob der projezierte Punkte innerhalb des Dreiecks liegt. Wenn nicht, testet man ja die Ränder. Und hier muss man einfach nicht den Normalwert der Plane zurückgeben, sondern den Normalwert der Ecke(bzw. dem Punkt auf der Kante, der der Spheremitte am nächsten ist) minus Spheremitte nehmen... Fertig!


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 16 Queries | GZIP : On ]