子弹物理引擎,如何冻结物体?
Posted
技术标签:
【中文标题】子弹物理引擎,如何冻结物体?【英文标题】:Bullet physics engine, how to freeze an object? 【发布时间】:2011-03-02 04:43:15 【问题描述】:使用 Bullet 2.76 我试图冻结一个对象(刚体),以便它立即停止移动,但仍会对碰撞做出响应。
我尝试将它的激活状态设置为 DISABLE_SIMULATION,但它对其他对象几乎不存在。此外,如果对象在禁用时与它“碰撞”,就会开始发生奇怪的事情(对象从静态物体中坠落等)
我想,暂时将其转换为静态刚体是可行的,但在 Bullet 方面是否有现有的“本机”方法来实现这一点?
编辑:有没有办法关闭特定对象的重力?
【问题讨论】:
【参考方案1】:文档有点欠缺,但可以假设以下方法可用于禁用特定身体的重力:
void btRigidBody::setGravity(const btVector3 &acceleration)
【讨论】:
就是这样!在碰撞等之后必须注意停用,但它有效!完美的!非常感谢!【参考方案2】:只需将刚体的质量设置为 0,然后它就变成静态的...
http://bullet.googlecode.com/svn/trunk/Demos/HelloWorld/HelloWorld.cpp
【讨论】:
链接已失效。 这里有一个新链接:github.com/bulletphysics/bullet3/blob/master/examples/… 将质量设置为 0 但对我不起作用。【参考方案3】:btRigidBody
的函数称为 setLinearFactor(x,y,z)
和 setAngularFactor(x,y,z)
,分别允许您限制沿特定轴的运动和绕特定轴的旋转。使用所有0
作为参数调用这两个函数应该会停止所有运动。使用所有 1
再次调用它们将允许再次移动。
【讨论】:
【参考方案4】:将激活状态设置为零。这就是对象自然睡眠时发生的情况。重力等在再次唤醒之前不会生效。
rigidBody->setActivationState(0);
然后就像任何沉睡的物体一样,它会在碰撞或你对其施加力时被唤醒。
【讨论】:
那么,如何唤醒它? @MiniGod 直接或通过碰撞施加力。 这意味着我们也可以让它在空中休眠?另外,不幸的是,这似乎没有在 JMonkeyEngine 子弹包装器中公开【参考方案5】:要让这个方法停止你的actor,你必须在每个更新帧都调用它。
void StopActor()
m_pRigidBody->setLinearVelocity(btVector3(0,0,0));
【讨论】:
【参考方案6】:将速度和动量设置为零,并将质量设置为一个非常非常大的数字。
【讨论】:
还不能测试它,但这真的会冻结它在半空中的物体吗? (而且,好吧,把它留在那里?) 如果您使用真实的重力方程,它确实如此:F = G * (m1 * m2) / r^2 但是大多数发动机不会使用这个方程,只会假设重力恒定( F = m * g ),因此您还必须关闭该对象的重力和任何其他恒定力。但是,这应该适用于任何弹力和碰撞引擎(可能使用弹力)。 那么问题来了:如何关闭特定对象的重力(在 Bullet 中)? 很抱歉,我的大部分经验是构建物理引擎,但我没有 Bullet 的具体经验。你能指定哪些力适用于哪些物体/身体吗?有没有配置文件什么的? 我很好奇,所以我阅读了一些关于 Bullet 的文档。看起来它们并不容易修改力。将对象的类型更改为静态可能更容易。以上是关于子弹物理引擎,如何冻结物体?的主要内容,如果未能解决你的问题,请参考以下文章