16

使用 Bullet 2.76 我试图冻结一个对象(刚体),使其立即停止移动,但仍对碰撞作出反应。

我尝试将它的激活状态设置为 DISABLE_SIMULATION,但它对其他对象几乎不存在。此外,如果对象在禁用时与它“碰撞”,就会开始发生奇怪的事情(对象从静态物体下落等)

我想,暂时将其转换为静态刚体可能会起作用,但是在 Bullet 方面是否有现有的“本机”方法来实现这一点?

编辑:有没有办法关闭特定物体的重力?

4

6 回答 6

9

该文档有点缺乏,但可以假设以下方法可用于禁用特定身体的重力:

void btRigidBody::setGravity(const btVector3 &acceleration)
于 2010-07-07T01:55:18.463 回答
8

只需将刚体的质量设置为0,然后它就变成静态的了...

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

于 2013-02-18T11:15:31.263 回答
6

有一些用于btRigidBody调用的函数setLinearFactor(x,y,z)setAngularFactor(x,y,z)它们允许您分别限制沿特定轴的运动和绕特定轴的旋转。使用 all 作为参数调用这两个函数0应该会停止所有运动。用 all 再次调用它们1将允许再次运动。

于 2010-10-14T00:50:14.170 回答
5

将激活状态设置为零。这就是对象自然睡眠时发生的情况。重力等在再次唤醒之前不会生效。

rigidBody->setActivationState(0);

然后就像任何沉睡的物体一样,它会在碰撞或你对其施加力时被唤醒。

于 2013-05-25T15:44:43.587 回答
3

要让这个方法停止你的actor,你必须在每个更新帧都调用它。

void StopActor()
{
    m_pRigidBody->setLinearVelocity(btVector3(0,0,0));
}
于 2011-09-13T01:36:01.727 回答
1

将速度和动量设置为零,并将质量设置为非常非常大的数字。

于 2010-06-15T12:55:24.893 回答