【发布时间】:2015-05-01 13:59:11
【问题描述】:
我正在尝试使用 Three.js 和物理插件 physijs 制作一个小项目;只是一个小骰子。我的方法是使用 setGravity 来移动骰子,模拟重力来移动骰子。我遇到的问题是,一旦骰子停下来,它们就不再对重力做出反应。有没有人遇到过这种情况?
【问题讨论】:
标签: physijs
我正在尝试使用 Three.js 和物理插件 physijs 制作一个小项目;只是一个小骰子。我的方法是使用 setGravity 来移动骰子,模拟重力来移动骰子。我遇到的问题是,一旦骰子停下来,它们就不再对重力做出反应。有没有人遇到过这种情况?
【问题讨论】:
标签: physijs
发生了什么: Physijs 所基于的 Ammo.js 将静止或非常缓慢移动的物体置于睡眠状态以节省性能。所以当你改变世界的重力时,沉睡的物体并不在乎,因为物理学并没有告诉他们重力已经改变了。
您可以修改sleeping thresholds、设置activation states 或在改变重力之前快速激活刚体。
请注意此代码适用于本机 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 );
}
【讨论】: