Math 由于重力问题,利用时间提高速度(无法获得完美的弹性)

Math 由于重力问题,利用时间提高速度(无法获得完美的弹性),math,time,physics,game-physics,gravity,Math,Time,Physics,Game Physics,Gravity,我只是想把球弹到原来的高度。但一旦我引入时间,而不是框架,我就会在某处失去动力 将代码降至最低限度,我有以下几点: public void onDrawFrame(GL10 gl) { float timeDelta = System.currentTimeMillis() - startTime; startTime = System.currentTimeMillis(); update(timeDelta); } float gravity = -1.0f; float PosY =

我只是想把球弹到原来的高度。但一旦我引入时间,而不是框架,我就会在某处失去动力

将代码降至最低限度,我有以下几点:

public void onDrawFrame(GL10 gl) {

float timeDelta = System.currentTimeMillis() - startTime;
startTime = System.currentTimeMillis();

update(timeDelta);
}

float gravity = -1.0f;
float PosY = 2400;
float VelocityY = 0;

public void update(float timeDelta){

PosY+=VelocityY;
if(PosY<=0){
    VelocityY=Math.abs(VelocityY);
} else{
    VelocityY+=gravity*timeDelta;
}       
Log.d(SystemSingleton.sLogDebug,String.format("Pos: y%f. y%f, timeDelta: %f",PosY, VelocityY, timeDelta));

}
public void onDrawFrame(GL10 gl){
float timeDelta=System.currentTimeMillis()-startTime;
startTime=System.currentTimeMillis();
更新(时间增量);
}
浮子重力=-1.0f;
浮动位置y=2400;
浮动速度y=0;
公共无效更新(浮动时间增量){
PosY+=VelocityY;
if(PosY)
我猜这就是原因。打电话给currentTimeMillis可能会给你两个不同的号码。我会怎么做:

float currentTime = System.currentTimeMillis();
float delta = currentTime - startTime;
startTime = currentTime;

计算新位置时,需要考虑时间步长(
timeDelta
),而不是这样做:

PosY += VelocityY;  // no!!
这样做:

PosY += VelocityY * timeDelta;
更好的做法是:

PosY += VelocityY * timeDelta + 0.5 * gravity * timeDelta * timeDelta;
此外,我会稍微更改反弹检测。以下是一些新代码供您尝试:

// Perform the integration
PosY      += VelocityY * timeDelta + 0.5 * gravity * timeDelta * timeDelta;
VelocityY += gravity * timeDelta;

// Check whether it's time to bounce
if (PosY<=0 && VelocityY<0){
    VelocityY = Math.abs(VelocityY);
}       
Log.d(...)
//执行集成
PosY+=VelocityY*timeDelta+0.5*重力*timeDelta*timeDelta;
速度y+=重力*时间增量;
//检查是否是反弹的时间

如果你的方式更好,但这不是主要问题。不是“问题”,而是“a”问题,我应该看到的问题。干杯。
// Perform the integration
PosY      += VelocityY * timeDelta + 0.5 * gravity * timeDelta * timeDelta;
VelocityY += gravity * timeDelta;

// Check whether it's time to bounce
if (PosY<=0 && VelocityY<0){
    VelocityY = Math.abs(VelocityY);
}       
Log.d(...)