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

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

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

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

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

6 ответов


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

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 ' s позволит движение снова.


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

rigidBody->setActivationState(0);

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


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

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

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