Obwohl ich nicht speziell mit der Bullet-Physik-Engine gearbeitet habe, habe ich in einer anderen Physik-Engine etwas sehr Ähnliches gemacht. Die Art und Weise, wie ich es gelöst habe, bestand darin, die Lineargeschwindigkeit des starren Körpers einzustellen, anstatt sie direkt zu übersetzen. Bewegungen und Kollisionen wurden dann automatisch von der Aktualisierungsphase der Physik-Engine behandelt.
Aus der Dokumentation geht hervorbtRigidBody::setLinearVelocity
, dass Sie eine Methode verwenden können. Wenn Sie beispielsweise keine Beschleunigungen wünschen, setzen Sie die Lineargeschwindigkeit einfach auf einen geeigneten Wert, wenn sich das Zeichen bewegt, und setzen Sie sie auf (0,0,0) zurück, wenn das Zeichen anhalten soll (dh wenn der Spieler den Schlüssel loslässt).
Was die zu verwendenden Werte betrifft, besteht der übliche Ansatz darin, mit der gewünschten Geschwindigkeit Ihres Charakters (als Float / Skalar) zu beginnen und diese dann mit einem normalisierten Vektor zu multiplizieren, der in die Richtung zeigt, in die Sie sich bewegen möchten. Soweit ich sehen kann, verfügt die btVector3
Klasse bereits über Methoden für all dies.
Alternativ können Sie den Charakter als vollständiges Physikobjekt behandeln und die Bewegung entweder mit der Methode applyForce
oder mit der applyImpulse
Methode behandeln. Dies würde zu einer Körperbeschleunigung führen, sodass Ihre Charaktere Schwung haben und die Ergebnisse auf diese Weise wahrscheinlich besser aussehen. Sie müssen jedoch einige zusätzliche Maßnahmen ergreifen, indem Sie beispielsweise sicherstellen, dass die Lineargeschwindigkeit niemals einen bestimmten Grenzwert überschreitet, indem Sie sie entweder festklemmen oder mit Dämpfung / Reibung herumspielen. Es wird also etwas schwieriger zu implementieren und zu optimieren sein.
Experimentieren Sie mit beiden Ansätzen und wählen Sie dann den aus, der Ihren Anforderungen am nächsten kommt.
Meine Erfahrung mit Physik besteht darin, Chimpunk in einer 2D-Spiel-Engine zu verwenden, aber ich bin mir ziemlich sicher, dass dieses Konzept in 3D umgesetzt werden kann.
Ich gehe davon aus, dass dein Charakter ein physischer Körper mit Gewicht und so ist. Der beste Weg, dies zu tun, ist eine sehr vereinfachte Simulation des Gehens. Stellen Sie sich das so vor: Wenn Sie stehen, haben Ihre Füße viel Reibung, sodass Sie nicht einfach herumrutschen. Wenn Sie sich bewegen, entspricht dies in etwa dem Entfernen dieser Reibung (da Sie der Bewegung nicht mit Ihren Füßen widerstehen) und dem Aufbringen einer Richtungskraft. Ich sage nicht , dass Sie jeden Fuß, der auf den Boden drückt, einzeln simulieren sollten - ein starrer Körper ist das, was Sie wollen.
Hier wird es etwas komplizierter:
Wenn Sie Ihre Kraft und Dämpfung richtig einstellen, erhalten Sie durch Anwenden einer Kraft immer das realistischste Ergebnis, insbesondere wenn der Charakter Objekte herumschiebt. Übersetzen wird der schlechteste Weg sein, da die Physik-Engine dies nicht wirklich als Bewegung betrachtet. Das direkte Einstellen der Geschwindigkeit ist etwas besser, aber meiner Erfahrung nach können die besten Ergebnisse durch Anwendung von Kraft und Dämpfung erzielt werden.
Hoffentlich habe ich das gut genug erklärt. Fragen Sie einfach, ob Sie eine Klärung benötigen. :) :)
quelle
Für Bullet 2.87 scheint es die richtige Methode zu sein, einen Tick-Rückruf zu haben, der mit der internen Simulationsaktualisierungsrate (möglicherweise viele 100 Hz) aktualisiert wird, und setWorldTransform () auf kinematischen Körpern aktualisiert die Position reibungslos:
Dieser Teil befindet sich im Handbuch:
Dieser Teil war schwieriger herauszufinden:
Dies war eine hilfreiche Dokumentation in btRigidBody.h https://github.com/bulletphysics/bullet3/blob/master/src/BulletDynamics/Dynamics/btRigidBody.h :
setLinearVelocity () funktioniert nicht für kinematische Objekte (möglicherweise früher?). Die Dynamikwelt wird jedoch setWorldTransform () verstehen und Aufrufe von getLinearVelocity () für das kinematische Objekt geben die im Tick-Rückruf festgelegte Geschwindigkeit zurück (es wird wahrscheinlich ein Durchschnitt zurückgegeben, wenn sich diese Geschwindigkeiten von internem Tick zu Tick ändern würden).
https://github.com/bulletphysics/bullet3/issues/1204 - Das Themenposter hat die richtige Idee, aber die Antwort ist nicht hilfreich.
quelle