Aunque no he trabajado específicamente con el motor de física de bala, he hecho algo muy similar en otro motor de física. La forma en que lo resolví fue establecer la velocidad lineal del cuerpo rígido en lugar de traducirlo directamente. El movimiento y las colisiones fueron manejados automáticamente por la fase de actualización del motor de física.
De la documentación parece haber un btRigidBody::setLinearVelocity
método que puede usar. Entonces, por ejemplo, si no desea que ocurran aceleraciones, simplemente configure la velocidad lineal en un valor apropiado cada vez que el personaje se mueva, y vuelva a establecerlo en (0,0,0) cuando se supone que el personaje se detiene (es decir, cuando el jugador suelta la llave).
En cuanto a qué valores usar, el enfoque habitual sería comenzar con la velocidad deseada de su personaje (como flotante / escalar) y luego multiplicarlo por un vector normalizado que apunte en la dirección que desea mover. Por lo que puedo ver, la btVector3
clase ya tiene métodos para todo esto.
Alternativamente, podría considerar tratar al personaje como un objeto físico completo y manejar el movimiento utilizando los métodos applyForce
o applyImpulse
. Esto daría como resultado una aceleración del cuerpo, por lo que tus personajes tendrán impulso y los resultados probablemente se verán mejor de esta manera. Pero debe tomar algunas medidas adicionales, por ejemplo, asegurándose de que la velocidad lineal nunca exceda un cierto límite, ya sea sujetándola o jugando con amortiguación / fricción. Por lo tanto, será un poco más difícil de implementar y afinar.
Experimente con ambos enfoques y luego elija el que mejor se adapte a sus necesidades.
Para el registro, mi experiencia con la física es usar Chimpunk en un motor de juego 2D, pero estoy bastante seguro de que este concepto se traduce en 3D muy bien.
Supongo que tu personaje es un cuerpo de física con peso y tal. La mejor manera de hacer esto es hacer una simulación muy simplificada de caminar. Piénselo de esta manera: si está de pie, sus pies tienen mucha fricción, por lo que no solo se desliza. Cuando te mueves, es más o menos equivalente a eliminar esa fricción (ya que no estás resistiendo el movimiento con los pies) y aplicar una fuerza de dirección. Estoy no decir que usted debe simular de forma individual cada pie empujando en el suelo - un cuerpo rígido es lo que desea.
Aquí es donde get se vuelve un poco complicado:
Si ajusta su fuerza y la amortiguación correctamente, la aplicación de una fuerza siempre le dará el resultado más realista, especialmente si el personaje va a empujar objetos. Traducir será la peor forma de hacerlo, ya que el motor de física realmente no considera que eso sea movimiento. Establecer la velocidad directamente es algo mejor, pero en mi experiencia los mejores resultados se pueden obtener utilizando la fuerza y la amortiguación.
Espero haber explicado esto lo suficientemente bien. No dude en preguntar si necesita aclaraciones. :)
fuente
Para la viñeta 2.87, parece que el método adecuado es tener una devolución de llamada que se actualice a la velocidad de actualización de la simulación interna (posiblemente muchos 100s de Hz), y setWorldTransform () en cuerpos cinemáticos actualizará sin problemas la posición:
Esta parte está en el manual:
Esta parte fue más difícil de entender:
Esta fue una documentación útil en btRigidBody.h https://github.com/bulletphysics/bullet3/blob/master/src/BulletDynamics/Dynamics/btRigidBody.h :
setLinearVelocity () no funciona para objetos cinemáticos (¿tal vez solía hacerlo en versiones anteriores?). Pero el mundo dinámico comprenderá setWorldTransform () y las llamadas a getLinearVelocity () en el objeto cinemático devolverán la velocidad establecida en la devolución de llamada de tick (probablemente devuelva un promedio si esas velocidades cambian de tick interno a tick).
https://github.com/bulletphysics/bullet3/issues/1204 : el póster del problema tiene la idea correcta pero la respuesta no es útil.
fuente