Bien que je n'aie pas travaillé spécifiquement avec le moteur physique des balles, j'ai fait quelque chose de très similaire dans un autre moteur physique. La façon dont je l'ai résolu était de définir la vitesse linéaire du corps rigide au lieu de la traduire directement. Les mouvements et les collisions ont ensuite été automatiquement gérés par la phase de mise à jour du moteur physique.
D'après la documentation, il semble y avoir une btRigidBody::setLinearVelocity
méthode que vous pouvez utiliser. Ainsi, par exemple, si vous ne voulez pas d'accélérations, réglez simplement la vitesse linéaire sur une valeur appropriée chaque fois que le personnage se déplace et redéfinissez-la sur (0,0,0) lorsque le personnage est censé s'arrêter (c.-à-d. lorsque le joueur relâche la clé).
En ce qui concerne les valeurs à utiliser, l'approche habituelle serait de commencer à la vitesse souhaitée de votre personnage (en tant que flottant / scalaire), puis de la multiplier par un vecteur normalisé pointant dans la direction que vous souhaitez déplacer. D'après ce que je peux voir, la btVector3
classe a déjà des méthodes pour tout cela.
Vous pouvez également envisager de traiter le personnage comme un objet physique complet et gérer les mouvements à l'aide des méthodes applyForce
ou applyImpulse
. Cela entraînerait une accélération du corps, donc vos personnages auront de l'élan et les résultats seront probablement plus beaux de cette façon. Mais vous devez prendre des mesures supplémentaires, par exemple, en vous assurant que la vitesse linéaire ne dépasse jamais une certaine limite, soit en la serrant, soit en jouant avec l'amortissement / la friction. Il sera donc un peu plus difficile à mettre en œuvre et à affiner.
Expérimentez avec les deux approches, puis choisissez celle qui se comporte le plus près de vos besoins.
Pour mémoire, mon expérience avec la physique utilise Chimpunk dans un moteur de jeu 2D, mais je suis presque sûr que ce concept se traduit très bien en 3D.
Je suppose que votre personnage est un corps physique avec du poids et autres. La meilleure façon de le faire est de faire une simulation très simplifiée de la marche. Pensez-y comme ceci: si vous êtes debout, vos pieds ont beaucoup de friction, donc vous ne glissez pas simplement. Lorsque vous bougez, cela équivaut à peu près à supprimer ce frottement (puisque vous ne résistez pas au mouvement avec vos pieds) et à appliquer une force de direction. Je ne dis pas que vous devez simuler individuellement chaque pied poussant sur le sol - un corps rigide est ce que vous voulez.
Voici où obtenir devient un peu compliqué:
Si vous ajustez correctement votre force et votre amortissement, appliquer une force vous donnera toujours le résultat le plus réaliste, en particulier si le personnage va pousser des objets. La traduction va être la pire façon de le faire, car le moteur physique ne considère pas vraiment que c'est du mouvement. Régler directement la vitesse est un peu mieux, mais d'après mon expérience, les meilleurs résultats peuvent être obtenus en utilisant la force et l'amortissement.
J'espère que j'ai bien expliqué cela. N'hésitez pas à demander si vous avez besoin d'éclaircissements. :)
la source
Pour la puce 2.87, il semble que la méthode appropriée consiste à avoir un rappel de tick qui se met à jour au taux de mise à jour de la simulation interne (peut-être plusieurs centaines de Hz), et setWorldTransform () sur les corps cinématiques mettra à jour la position en douceur:
Cette partie est dans le manuel:
Cette partie était plus délicate à comprendre:
Il s'agissait d'une documentation utile dans btRigidBody.h https://github.com/bulletphysics/bullet3/blob/master/src/BulletDynamics/Dynamics/btRigidBody.h :
setLinearVelocity () ne fonctionne pas pour les objets cinématiques (peut-être que c'était le cas dans les versions antérieures?). Mais le monde de la dynamique comprendra setWorldTransform () et les appels à getLinearVelocity () sur l'objet cinématique retourneront la vitesse définie dans le rappel de tick (il retournera probablement une moyenne si ces vitesses devaient changer de tick interne à tick).
https://github.com/bulletphysics/bullet3/issues/1204 - l'affiche du problème a la bonne idée mais la réponse n'est pas utile.
la source