0

Three.js と物理プラグインの physicaljs を使用して小さなプロジェクトを作成しようとしています。ほんの少しのサイコロローラー。私のアプローチは、 setGravity を使用してサイコロを動かし、重力をモデル化してサイコロを動かすことです。私が直面している問題は、サイコロが静止すると重力に反応しなくなることです。誰もこれに遭遇したことがありますか?

4

1 に答える 1

2

何が起こっているのか: Physijs のベースとなっている Ammo.js は、パフォーマンスを節約するために、静止しているオブジェクトや非常にゆっくりと動いているオブジェクトをスリープ状態にします。したがって、世界の重力を変更しても、眠っているオブジェクトは気にしません。なぜなら、Physijs は重力が変化したことを通知しないからです。

スリープしきい値を変更したり、アクティブ化状態を設定したり、重力を変更する前に剛体をすばやくアクティブ化したりすることができます。

このコードはネイティブの Ammo.js に適用されることに注意してください。physicaljs を使用する場合にこれを行う方法はわかりませんが、アイデアは得られます。

解決策 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 に答える