0

我正在尝试使用 Three.js 和物理插件 physijs 制作一个小项目;只是一个小骰子。我的方法是使用 setGravity 来移动骰子,模拟重力来移动骰子。我遇到的问题是,一旦骰子停下来,它们就不再对重力做出反应。有没有人遇到过这个?

4

1 回答 1

2

发生了什么: Physijs 所基于的 Ammo.js 将静止或非常缓慢移动的对象置于睡眠状态以节省性能。所以当你改变世界的重力时,沉睡的物体并不在乎,因为物理学并没有告诉他们重力已经改变了。

您可以修改睡眠阈值、设置激活状态或在改变重力之前快速激活刚体。

请注意,此代码适用于本机 Ammo.js,我不确定在使用 physijs 时如何执行此操作,但您明白了。

解决方案 1:循环你的身体并激活它们,然后改变重力:

// dice is an array with your rigid bodys
for ( var i = 0; i < dice.length; i ++ ) {
    // hey wake up
    dice[ i ].activate();
}
physicsWorld.setGravity( new Ammo.btVector3( 0, -9.81, 0 ) );

解决方案 2:你不应该睡觉,在创建骰子后执行此操作:

var DISABLE_DEACTIVATION = 4;
for ( var i = 0; i < dice.length; i ++ )
    // no sleep for you... ever
    dice[ i ].setActivationState( DISABLE_DEACTIVATION );
}
于 2015-07-12T12:33:44.033 回答