Embora eu não tenha trabalhado com o mecanismo de física de balas especificamente, fiz algo muito semelhante em outro mecanismo de física. A maneira que resolvi foi definir a velocidade linear do corpo rígido em vez de traduzi-la diretamente. Movimentos e colisões foram então tratados automaticamente pela fase de atualização do mecanismo de física.
A partir da documentação , parece haver um btRigidBody::setLinearVelocity
método que você pode usar. Então, por exemplo, se você não deseja que nenhuma aceleração aconteça, apenas defina a velocidade linear para um valor apropriado sempre que o personagem estiver se movendo e defina-o novamente como (0,0,0) quando o personagem for interrompido (por exemplo, quando o jogador soltar a tecla).
Quanto a quais valores usar, a abordagem usual seria começar com a velocidade desejada do seu personagem (como um flutuador / escalar) e depois multiplicá-lo por um vetor normalizado que está apontando na direção que você deseja mover. Pelo que vejo, a btVector3
classe já possui métodos para tudo isso.
Como alternativa, você pode considerar tratar o personagem como um objeto físico completo e lidar com o movimento usando os métodos applyForce
ou applyImpulse
. Isso resultaria em uma aceleração do corpo, para que seus personagens tenham impulso e os resultados provavelmente serão mais agradáveis dessa maneira. Mas você precisa tomar algumas medidas extras, por exemplo, garantindo que a velocidade linear nunca exceda um determinado limite, apertando-a ou brincando com amortecimento / fricção. Portanto, será um pouco mais difícil de implementar e ajustar.
Experimente as duas abordagens e escolha a que se comporta mais próxima das suas necessidades.
Para constar, minha experiência com a física está usando o Chimpunk em um mecanismo de jogo 2D, mas tenho certeza de que esse conceito se traduz em 3D muito bem.
Estou assumindo que seu personagem é um corpo de física com peso e tal. A melhor maneira de fazer isso é fazer uma simulação muito simplificada da caminhada. Pense assim: se você estiver em pé, seus pés terão muito atrito, para não deslizar. Quando você se move, é aproximadamente equivalente a remover esse atrito (já que você não está resistindo ao movimento com os pés) e aplicar uma força de direção. Eu estou não dizer que você deve simular individualmente cada pé empurrando no chão - um corpo rígido é o que você quer.
Aqui é onde get fica um pouco complicado:
Se você ajustar sua força e amortecer corretamente, aplicar uma força sempre fornecerá o resultado mais realista, principalmente se o personagem for empurrar objetos. Traduzir será a pior maneira de fazê-lo, uma vez que o mecanismo de física realmente não considera isso movimento. Definir a velocidade diretamente é um pouco melhor, mas, na minha experiência, os melhores resultados podem ser obtidos usando força e amortecimento.
Espero ter explicado isso bem o suficiente. Sinta-se livre para perguntar se você precisa de esclarecimentos. :)
fonte
Para o item 2.87, parece que o método adequado é ter um retorno de chamada de tick atualizado com a taxa de atualização da simulação interna (possivelmente muitos 100s de Hz), e setWorldTransform () em corpos cinemáticos atualizará suavemente a posição:
Esta parte está no manual:
Essa parte foi mais complicada de descobrir:
Esta foi uma documentação útil em btRigidBody.h https://github.com/bulletphysics/bullet3/blob/master/src/BulletDynamics/Dynamics/btRigidBody.h :
setLinearVelocity () não funciona para objetos cinemáticos (talvez em versões anteriores?). Mas o mundo da dinâmica entenderá setWorldTransform () e as chamadas para getLinearVelocity () no objeto cinemático retornarão a velocidade definida no retorno de chamada do tick (provavelmente retornará uma média se essas velocidades mudarem de tick interno para tick).
https://github.com/bulletphysics/bullet3/issues/1204 - o pôster da questão tem a ideia certa, mas a resposta não é útil.
fonte