Ответ 1
Документация немного отсутствует, но можно предположить, что метод, приведенный ниже, можно использовать для отключения силы тяжести в определенном теле:
void btRigidBody::setGravity(const btVector3 &acceleration)
Использование Bullet 2.76 Я пытаюсь заморозить объект (твердое тело), чтобы он мгновенно прекратил движение, но все же реагирует на столкновения.
Я попытался настроить его состояние активации на DISABLE_SIMULATION, но тогда он практически не существовал для других объектов. Кроме того, если объекты "сталкиваются" с ним при его отключении, начинают возникать странные вещи (объект падает через статические тела и т.д.).
Я предполагаю, что временное преобразование его в статическое твердое тело могло бы работать, но существует ли существующий "родной" способ достичь этого на стороне Bullet?
Изменить: Есть ли способ отключить гравитацию для определенного объекта?
Документация немного отсутствует, но можно предположить, что метод, приведенный ниже, можно использовать для отключения силы тяжести в определенном теле:
void btRigidBody::setGravity(const btVector3 &acceleration)
Просто установите массу твердого тела на 0, затем он станет статическим...
http://bullet.googlecode.com/svn/trunk/Demos/HelloWorld/HelloWorld.cpp
Существуют функции для btRigidBody
, называемые setLinearFactor(x,y,z)
и setAngularFactor(x,y,z)
, которые позволяют вам ограничить движение вдоль определенной оси и вращение вокруг определенной оси соответственно. Вызов обеих функций со всеми 0
в качестве аргументов должен остановить все движения. Вызов их снова со всеми 1
позволит снова продолжить движение.
Установите состояние активации на ноль. Это то, что происходит, когда объект спит естественно. Гравитация и т.д. Не вступят в силу до тех пор, пока она не проснется снова.
rigidBody->setActivationState(0);
Затем, как и любой спящий объект, он будет разбужен при столкновении или если вы примените к нему силу.
Для этого метода, чтобы остановить ваш актер, вы должны вызывать это каждый кадр обновления.
void StopActor()
{
m_pRigidBody->setLinearVelocity(btVector3(0,0,0));
}
установите скорость и импульс в нуль и установите массу на действительно большое количество.