物理模拟,将像素调整为米?
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值不应该是常量,应该在每一帧结束时计算。
所以我一直在尝试编写物理模拟代码。我从模拟自由落体开始。我正在使用 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值不应该是常量,应该在每一帧结束时计算。