1

Android(openGLを使用)で単純な発射体の動きを実装しようとしています。そして、ボールの落下をリアルにシミュレートするために、自分の世界に重力を追加したいと考えています。

次の式で計算されるデルタ時間でレンダラーを更新するだけです。

    float deltaTime = (System.nanoTime()-startTime) / 1000000000.0f;
    startTime = System.nanoTime();

    screen.update(deltaTime);

私のscreen.update(deltaTime)方法では:

    if (isballMoving) {
        golfBall.updateLocationAndVelocity(deltaTime);
    }

そしてgolfBall.updateLocationAndVelocity(deltaTime)方法で:

public final static double G = -9.81;

double vz0 = getVZ0(); // Gets initial velocity(z)
double z0 = getZ0();  // Gets initial height
double time = getS();  // gets total time from act begin
double vz = vz0 + G * deltaTime;  // calculate new velocity(z)
double z = z0 - vz0 * deltaTime- 0.5 * G * deltaTime* deltaTime; // calculate new position

time = time + deltaTime; //  Update time
setS(time); //set new total time

ここに問題があります。

  • 静的に設定deltaTimeすると、アニメーションは正常に実行されます。0.07ただし、update()メソッドは可能な限り高速に実行されるため、ボールの長さ、つまりボールの速度はデバイスごとに異なります。

  • プログラムに触れて実行しない場合deltaTime(私のテスト デバイスでは deltaTime は 0.01 から 0.02 の間です)、アニメーションの長さとボールの速度は異なるデバイスで同じです。しかし、アニメーションはとても遅いです!

私は何を間違っていますか?

4

1 に答える 1

1

フレームごとに変更する量を増やしますか? これにより、アニメーションが 5 倍高速になります。

double vz = vz0 + G * deltaTime * 5;  // calculate new velocity(z)
double z = z0 - vz0 * deltaTime- 0.5 * G * deltaTime* deltaTime * 5; // calculate new position
于 2012-11-05T23:37:20.673 に答える