ユーザーがソケットを介してオブジェクトを制御するサーバー側の物理実験に取り組んでいます。ユーザーがオブジェクトを世界の境界の外に移動すると、私が直面している問題が発生します。
経由でインストールされた Box2Djs を使用していnpm
ます。
ワールド 500x500 を作成し、次のリスナーをアタッチします。
var boundaryListener = new b2d.b2BoundaryListener();
boundaryListener.Violation = function (body) {
//we will move this body to the opposite side
var position = body.GetWorldCenter();
//snap to opposite side
if (position.x < 0) {
position.x = worldAABB.upperBound.x + position.x;
}
if (position.y < 0) {
position.y = worldAABB.upperBound.y + position.y;
}
if (position.x > worldAABB.upperBound.x) {
position.x -= worldAABB.upperBound.x;
}
if (position.y > worldAABB.upperBound.y) {
position.y -= worldAABB.upperBound.y;
}
body.m_flags = body.m_flags & (~b2d.b2Body.e_frozenFlag); //does nothing :(
}
this.world.SetBoundaryListener(boundaryListener);
worldAABB
世界が境界として使用するb2AABBです。
問題は、境界リスナーが起動されると、フラグが allowSleep、frozen、および island フラグである 22 に設定されることに気付いたことです。b2Body がワールド境界の外を通過すると、凍結されているように見えます。最後の行は、内部フラグをいじって体の凍結を解除しようとする試みですが、私はそれを行う方法が間違っているとはっきりと感じています。
どうすれば体を解凍できますか?私が見ることができる凍結フラグをクリアする関数はありません (javascript は 10,000 行を超えているため、正直なところすべてを読んでいません)。いくつかのボディを壁として配置しても効果がないようです (ユーザーのオブジェクトがすぐに通過します)。彼ら)。
私の壁は次のように作成されます:
//create walls
var wallShape = new b2d.b2PolygonDef();
wallShape.SetAsBox(500, 10);
wallShape.density = 0.0;
wallShape.friction = 0.3;
var bodyDef = new b2d.b2BodyDef();
bodyDef.position.Set(250, 20);
var north = this.world.CreateBody(bodyDef);
north.CreateShape(wallShape);
bodyDef = new b2d.b2BodyDef();
bodyDef.position.Set(250, 499);
var south = this.world.CreateBody(bodyDef);
south.CreateShape(wallShape);
bodyDef = new b2d.b2BodyDef();
bodyDef.position.Set(499,250);
bodyDef.angle = Math.PI / 2;
var east = this.world.CreateBody(bodyDef);
east.CreateShape(wallShape);
bodyDef = new b2d.b2BodyDef();
bodyDef.position.Set(1, 250);
bodyDef.angle = Math.PI / 2;
var west = this.world.CreateBody(bodyDef);
west.CreateShape(wallShape);
これを修正する方法についての洞察はありますか? ウェブサイトが指しているフラッシュのドキュメント(半分の時間は一致しません)とフリーズについてさえ話していないC ++のドキュメントを除いて、javascriptでBox2Dを使用することについて私が見つけることができるドキュメントはほとんどありません。
世界には重力がなく、すべてのオブジェクトに線形および角度の減衰があることを言及することはおそらく役立つでしょう (疑似空間の感覚であるはずです)。