物理模拟,将像素调整为米?

Physics simulation, adjusting pixels to meters?

所以我一直在尝试编写物理模拟代码。我从模拟自由落体开始。我正在使用 Java Jframe 和 java 中 awt 库的一些方法。不过,我一直面临的问题是调整参数以使我的模拟更逼真。我的游戏 while 循环以恒定的 60 FPS 运行,这意味着每个循环需要 16 毫秒。每次我更新时,我都会执行这些法律:

this.velX = this.velX +  (accX)*delta;
this.velY = this.velY +  (accY) * delta ;

this.velY = this.velY * 0.9;


this.x = this.x + (int) ((this.velX) * delta); 
this.y = this.y + (int) ((this.velY)* delta);

但是,由于我正在转换为 int,因此值总是返回到 0,因为它们太小了。形状的绘制方法只接受 int(我认为这是可以理解的,对吧?)我想知道是否有解决方案?球会被卡住并且它的移动不会被注意到(如果它在移动的话)。

我尝试将 delta 传递为 1,效果很好,但它太快了,我认为这不现实。因此,如果有人能给我关于此类问题的一般想法,那将非常有帮助。

问题出在这几行

this.x = this.x + (int) ((this.velX) * delta); 
this.y = this.y + (int) ((this.velY)* delta);

让等式 ((this.velX) * delta) and ((this.velY) * delta) 的后半部分称为 deltaX and deltaY

所以等式应该变成

this.x = this.x + (int) deltaX; 
this.y = this.y + (int) deltaY;

现在,这里的问题是您将 deltaX and deltaY 转换为整数,从而将它们对 x and y 位置的贡献减少到零。

即使在很长一段时间内(在多个帧上)变化很小,其贡献也会变得很大。

假设 deltaX 的变化是 .1 它应该能够在 10 帧中添加 1 像素偏移。

如果您的 draw 函数只接受整数,那么您应该在该行而不是在那之前转换位置值,对于所有其他目的,它们应该是 float or double

所以方程应该是

this.x = this.x + this.velX * delta; //this.x is float
this.y = this.y + this.velY* delta;  //this.x is float

draw( (int)x, (int)y )

现在应该可以了。

注意: 另外我不知道你是如何保持恒定帧率的,因为 Java 做不到。您将不得不考虑可变帧速率。您已经使用 delta 完成了这些操作。 Delta值不应该是常量,应该在每一帧结束时计算。