3

これはおそらく本当に基本的な問題ですが、それに関する他の記事が見つからないようです。

とにかく、私はJavaで小さな跳ねるボールプログラムを書いて、私の基本的なスキルを広げようとしました. このプログラムは、落下してしばらくの間跳ね返る単純な弾むボールです元のプログラムは問題なく動作しましたが、プログラムに重力を追加しようとしました。重力は実際にはしばらくの間うまく機能しますが、バウンスが非常に小さくなると、アニメーションが非常に短時間不安定になり、ボールの位置が絶えず減少します. 私は問題を理解しようとしましたが、私はそれを見ることができません。どんな助けでも大歓迎です。

public final class Ball extends Rectangle {
float xspeed = 1.0f; float yspeed = 1.0f; float gravity = 0.4f;


public Ball(float x, float y, float width, float height) {
    super(x, y, width, height);
}

public void update(){
    yspeed += gravity;

    move(xspeed, yspeed);

    if(getX() < 0){
        xspeed = 1;
    }
    if(getX() + getWidth() > 320){
        xspeed = -1;
    }
    if(getY() < 0){
        yspeed = 1;
    }
    if(getY() + getHeight() > 200 && yspeed > 0){
        yspeed *= -0.98f;
    }
    if(getY() + getHeight() > 200 && yspeed < 0){
        yspeed *= 0.98f;
    }

}

public void move(float x, float y){
    this.setX(getX()+x);
    this.setY(getY()+y);
}

}

編集: 不規則な動きを整理したようです。ボールがバウンドしなくなったときに、ボールが下に移動するのをどのように止めることができるか、まだ苦労しています。現時点では、バウンスを停止し、「床」を通過して下に移動し続けます。yspeed += 重力線に関係していると思います。動きを止める方法がわかりません。

4

5 に答える 5

3

あなたがするとき

yspeed += gravity;

ボールには距離 dx = v_i * t + 1/2 (-g) t^2 の空間移動があると想定しています。床に非常に近い場合、これは当てはまらない場合があります。次の場合は失敗します。

  • あなたは床に十分に近づいており、下に移動しています
  • 床に非常に近く、速度が遅い場合 (ボールがほとんどのエネルギーを失った場合など)

このバグにより、シミュレーションがエネルギーの保存を停止し、低振幅で不安定な動作が発生します。

より小さな時間ステップを使用することで問題を軽減できます。また、テスト計算を行って余裕がないことに気づき、その反復で安全な時間ステップを選択すると、問題を完全に取り除くことができます(つまり、常にデフォルトを使用する場合を除きます)。問題がある場合は、最適な時間ステップを計算してください)。

ただし、ここで使用している基本的な近似には、他の問題もあります。微分方程式を数値的に解く方法については、数値解析のテキストを参照してください。

于 2009-03-04T02:24:06.070 に答える
1

ボールがバウンドするとき、実際には「地面」の少し下にあり、低速では、1 ティックで地面の上に戻らないためだと思われます。再び跳ね返りますが、今回は下向きなので、このサイクルは続きます。

次のように、ボールがバウンドしたときにボールを地面の高さに戻す必要があります。

    if(getY() + getHeight() > 200){
            yspeed *= -0.981;
            setY(200 - getHeight());
    }
于 2009-03-04T02:24:42.650 に答える