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

时间:2017-04-11 12:18:43

标签: java swing simulation

所以我一直在尝试编写物理模拟代码。我通过模拟自由落体来开始小规模。我使用Java Jframe和java中的awt库中的一些方法。但是,我遇到的问题是调整参数以使我的模拟更像生活。我的游戏while循环以恒定的60 FPS运行,这意味着每个循环花费16 ms。每次我更新,我都会执行这些法律:

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,并且效果很好,但它过快但我认为它不太现实。因此,如果有人可以给我一些关于这个问题的一般想法,那将是非常有帮助的。

1 个答案:

答案 0 :(得分:1)

问题在于以下几行

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

将等式[{1}}的后半部分称为((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 ydeltaX,它应该能够在.1帧中添加1像素转换。

如果你的10函数只采用整数,那么你应该在那之前转换该行的位置值,它们应该是draw用于所有其他目的。

所以方程应该是

float or double

现在应该可以了。

注意:我也不知道你是如何维持恒定帧速率的,因为Java无法做到这一点。您必须考虑可变帧速率。您已使用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 ) 完成了该操作。 Delta值不应该是常数,应该在每帧结束时计算。

相关问题