使用 Bullet 2.76 我试图冻结一个对象(刚体),使其立即停止移动,但仍对碰撞作出反应。
我尝试将它的激活状态设置为 DISABLE_SIMULATION,但它对其他对象几乎不存在。此外,如果对象在禁用时与它“碰撞”,就会开始发生奇怪的事情(对象从静态物体下落等)
我想,暂时将其转换为静态刚体可能会起作用,但是在 Bullet 方面是否有现有的“本机”方法来实现这一点?
编辑:有没有办法关闭特定物体的重力?
使用 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)
它们允许您分别限制沿特定轴的运动和绕特定轴的旋转。使用 all 作为参数调用这两个函数0
应该会停止所有运动。用 all 再次调用它们1
将允许再次运动。
将激活状态设置为零。这就是对象自然睡眠时发生的情况。重力等在再次唤醒之前不会生效。
rigidBody->setActivationState(0);
然后就像任何沉睡的物体一样,它会在碰撞或你对其施加力时被唤醒。
要让这个方法停止你的actor,你必须在每个更新帧都调用它。
void StopActor()
{
m_pRigidBody->setLinearVelocity(btVector3(0,0,0));
}
将速度和动量设置为零,并将质量设置为非常非常大的数字。