0

問題が発生しました。考えられるすべての組み合わせを試しました。私は自分のボールを基本的にできるだけ速く画面から飛び出させようとしています。唯一の問題は、設定した値に関係なく、同じ速度で移動することです。ballBody.SetLinearVelocity(new Vector2(1000000f, 0)); をやってみました。

ballBody.SetLinearVelocity(新しい Vector2(10f, 0));

そしてその間のすべての数字、そしてボールはまだ同じ速度で動きます. 私は正確に何を間違っていますか。また、本文のコードは以下のとおりです。私が望むのは、ピンボール マシンのように、ボールが非常に速く進むことだけです。

        var bodyDef = new BodyDef();
        bodyDef.position = new Vector2(400, 200);

        bodyDef.type = BodyType.Dynamic;
        bodyDef.fixedRotation = true;


        ballBody = world.CreateBody(bodyDef);

        var circleShape = new CircleShape();
        circleShape._radius = 12.5f;

        var fixtureDef = new FixtureDef();
        fixtureDef.restitution = 1.4f;
        fixtureDef.shape = circleShape;
        fixtureDef.friction = 0;


        ballBody.CreateFixture(fixtureDef);
4

1 に答える 1

3

Box2D には数値安定性のため、最大線速度があります。ただし、通常の使用では決してヒットしないように十分に高く設定されています。

Box2D は 0.1 から 10.0 の間の長さで最適に機能することに注意してください。著者によると、これはメートル単位で想定されており、野球から樽、さらにはバスまでのオブジェクトをシミュレートするのに適しています。それを超えると、数値の不正確さに対してより敏感になります。

平均的なシミュレーション オブジェクト (おそらくボール) のサイズが 1.0 単位になるように、座標系を縮小してみてください。これは、Box2D がシステムを最適にシミュレートするのに役立ちます。

この動作範囲を考えると、10 または 100 単位/秒を超える速度は、特に大量の運動量を受ける動的なボディに適用する場合に問題を引き起こす可能性があります。これらの高運動量の物体が他の物体と衝突すると、運動量が広がり、システム全体が飛び去ったり不安定になったりする可能性があります.

このため、ボールが飛び去ることになったら、ボールをキネマティック ボディに変換するのがおそらく最善です。キネマティック ボディは速度に従って移動しますが、衝突せず、力の作用も受けません。確かではありませんが、キネマティック ボディは運動量データを保持していないため、より高い速度が許可される可能性があります。

編集: また、通常は 1.0f を超える反発係数を使用しないでください。そうすることで、衝突中にボディが運動エネルギーを獲得します。これは現実世界では不可能ではありませんが、何らかのエネルギー源が必要になります。体に付着した化合物が衝撃で爆発し、より多くのエネルギーがシステムに送り込まれると想像してみてください。

于 2010-06-29T09:06:35.707 に答える