Пулевой физический движок, как заморозить объект? - PullRequest
14 голосов
/ 10 июня 2010

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

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

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

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

Ответы [ 6 ]

7 голосов
/ 18 февраля 2013

Просто установите массу твердого тела на 0, тогда оно станет статичным ...

http://bullet.googlecode.com/svn/trunk/Demos/HelloWorld/HelloWorld.cpp

6 голосов
/ 07 июля 2010

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

void btRigidBody::setGravity(const btVector3 &acceleration)
5 голосов
/ 14 октября 2010

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

3 голосов
/ 25 мая 2013

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

rigidBody->setActivationState(0);

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

2 голосов
/ 13 сентября 2011

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

void StopActor()
{
    m_pRigidBody->setLinearVelocity(btVector3(0,0,0));
}
1 голос
/ 15 июня 2010

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

...