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.