Хотя я не работал специально с физическим движком пули, я сделал нечто очень похожее в другом физическом движке. Я решил, что нужно установить линейную скорость твердого тела, а не переводить ее напрямую. Движение и столкновения затем автоматически обрабатывались на этапе обновления физического движка.
Из документации, кажется, есть btRigidBody::setLinearVelocity
метод, который вы можете использовать. Так, например, если вы не хотите, чтобы происходило какое-либо ускорение, просто установите линейную скорость на соответствующее значение всякий раз, когда персонаж движется, и установите ее обратно в (0,0,0), когда персонаж должен остановиться (т.е. когда игрок отпускает ключ).
Что касается значений, которые следует использовать, обычный подход будет состоять в том, чтобы начать с желаемой скорости вашего персонажа (в виде числа с плавающей запятой), а затем умножить ее на нормализованный вектор, указывающий в направлении, которое вы хотите переместить. Из того, что я вижу, у btVector3
класса уже есть методы для всего этого.
В качестве альтернативы, вы можете рассматривать персонажа как целостный физический объект и обрабатывать движения, используя методы applyForce
или applyImpulse
. Это приведет к ускорению тела, поэтому у ваших персонажей будет импульс, и результаты, вероятно, будут выглядеть лучше. Но вам нужно предпринять некоторые дополнительные меры, например, убедившись, что линейная скорость никогда не превышает определенного предела, либо путем ее ограничения или игры с демпфированием / трением. Так что это будет немного сложнее в реализации и настройке.
Поэкспериментируйте с обоими подходами, а затем выберите тот, который наиболее соответствует вашим потребностям.
Напомним, что мой опыт работы с физикой - это использование Chimpunk в движке 2D-игр, но я уверен, что эта концепция очень хорошо переводится в 3D.
Я предполагаю, что ваш персонаж - это физическое тело с весом и тому подобное. Лучший способ сделать это - сделать очень упрощенную симуляцию ходьбы. Подумайте об этом так: если вы стоите, у ваших ног много трения, поэтому вы не просто скользите. Когда вы двигаетесь, это примерно эквивалентно устранению этого трения (поскольку вы не сопротивляетесь движению ногами) и применению силы направления. Я не говорю, что вы должны индивидуально имитировать каждую ногу, толкающую землю - твердое тело - это то, что вы хотите.
Вот где получить немного сложнее:
Если вы правильно настроите свою силу и демпфирование, применение силы всегда даст вам наиболее реалистичный результат, особенно если персонаж будет толкать объекты вокруг. Перевод будет худшим способом сделать это, так как физический движок на самом деле не считает это движением. Прямая установка скорости несколько лучше, но по моему опыту лучшие результаты можно получить, используя силу и демпфирование.
Надеюсь, я объяснил это достаточно хорошо. Не стесняйтесь спрашивать, если вам нужны разъяснения. :)
источник
Для маркера 2.87 кажется, что правильный метод должен иметь обратный вызов галочки, который обновляется с частотой обновления внутренней симуляции (возможно, много сотен Гц), и setWorldTransform () для кинематических тел будет плавно обновлять позицию:
Эта часть находится в руководстве:
Эту часть было сложнее понять:
Это была полезная документация в btRigidBody.h https://github.com/bulletphysics/bullet3/blob/master/src/BulletDynamics/Dynamics/btRigidBody.h :
setLinearVelocity () не работает для кинематических объектов (возможно, раньше в более ранних версиях?). Но динамический мир поймет setWorldTransform () и вызовы getLinearVelocity () для кинематического объекта вернут скорость, установленную в обратном вызове тика (он, вероятно, возвращает среднее значение, если эти скорости изменятся от внутреннего тика к тику).
https://github.com/bulletphysics/bullet3/issues/1204 - у автора проблемы есть правильная идея, но ответ не поможет.
источник