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
Im nächsten Frame verursacht die Gravitation, dass die Sphere in den Boden eintaucht.
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...
Jetzt das Problem: Tritt dieser Fall tatsächlich ein, wird die Kugel wieder um den [SphereRadius - PlaneDistance] Wert zurückgepfiffen . Ich sitze dann auch nicht auf der grünen Linie, sondern Fall immer wieder ins Unglück, was mich zurücksetzt...
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.
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.
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:
Wie kann ich sowas Mathematisch lösen?
Ich habe erstmal zum Testen den Player in soeine Sphere gesteckt... "Treppensteigen" ist unmöglich, weil er selbst eine klitzekleine Stufe als "Wand" behandelt
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?
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!
Mitglieder in diesem Forum: 0 Mitglieder und 5 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.