Хотя я не работал специально с физическим движком пули, я сделал нечто очень похожее в другом физическом движке. Я решил, что нужно установить линейную скорость твердого тела, а не переводить ее напрямую. Движение и столкновения затем автоматически обрабатывались на этапе обновления физического движка.
Из документации, кажется, есть btRigidBody::setLinearVelocity
метод, который вы можете использовать. Так, например, если вы не хотите, чтобы происходило какое-либо ускорение, просто установите линейную скорость на соответствующее значение всякий раз, когда персонаж движется, и установите ее обратно в (0,0,0), когда персонаж должен остановиться (т.е. когда игрок отпускает ключ).
Что касается значений, которые следует использовать, обычный подход будет состоять в том, чтобы начать с желаемой скорости вашего персонажа (в виде числа с плавающей запятой), а затем умножить ее на нормализованный вектор, указывающий в направлении, которое вы хотите переместить. Из того, что я вижу, у btVector3
класса уже есть методы для всего этого.
В качестве альтернативы, вы можете рассматривать персонажа как целостный физический объект и обрабатывать движения, используя методы applyForce
или applyImpulse
. Это приведет к ускорению тела, поэтому у ваших персонажей будет импульс, и результаты, вероятно, будут выглядеть лучше. Но вам нужно предпринять некоторые дополнительные меры, например, убедившись, что линейная скорость никогда не превышает определенного предела, либо путем ее ограничения или игры с демпфированием / трением. Так что это будет немного сложнее в реализации и настройке.
Поэкспериментируйте с обоими подходами, а затем выберите тот, который наиболее соответствует вашим потребностям.