Пулевой физический движок, как заморозить объект?

Использование Bullet 2.76 Я пытаюсь заморозить объект (твердое тело), ​​чтобы он мгновенно прекратил движение, но все же реагирует на столкновения.

Я попытался настроить его состояние активации на DISABLE_SIMULATION, но тогда он практически не существовал для других объектов. Кроме того, если объекты "сталкиваются" с ним при его отключении, начинают возникать странные вещи (объект падает через статические тела и т.д.).

Я предполагаю, что временное преобразование его в статическое твердое тело могло бы работать, но существует ли существующий "родной" способ достичь этого на стороне Bullet?

Изменить: Есть ли способ отключить гравитацию для определенного объекта?

Ответы

Ответ 1

Документация немного отсутствует, но можно предположить, что метод, приведенный ниже, можно использовать для отключения силы тяжести в определенном теле:

void btRigidBody::setGravity(const btVector3 &acceleration)

Ответ 3

Существуют функции для btRigidBody, называемые setLinearFactor(x,y,z) и setAngularFactor(x,y,z), которые позволяют вам ограничить движение вдоль определенной оси и вращение вокруг определенной оси соответственно. Вызов обеих функций со всеми 0 в качестве аргументов должен остановить все движения. Вызов их снова со всеми 1 позволит снова продолжить движение.

Ответ 4

Установите состояние активации на ноль. Это то, что происходит, когда объект спит естественно. Гравитация и т.д. Не вступят в силу до тех пор, пока она не проснется снова.

rigidBody->setActivationState(0);

Затем, как и любой спящий объект, он будет разбужен при столкновении или если вы примените к нему силу.

Ответ 5

Для этого метода, чтобы остановить ваш актер, вы должны вызывать это каждый кадр обновления.

void StopActor()
{
    m_pRigidBody->setLinearVelocity(btVector3(0,0,0));
}

Ответ 6

установите скорость и импульс в нуль и установите массу на действительно большое количество.