java 中的跳球物理,重力
Jumping ball physics in java, gravity
我编写了一个简单的代码来获取跳球的位置,但我肯定错过了一些东西,因为我得到了这个:
这是获取 x 和 y 位置的代码:
public Vector2f[] draw() {
float x = 0, y = height; // height - float value from class constructor;
ArrayList<Vector2f> graphic = new ArrayList<Vector2f>();
for(;;){
Vector2f a = new Vector2f(x, y);
graphic.add(a);
ySpeed -= 10;
y += ySpeed*Math.cos(angle);
x += xSpeed*Math.sin(angle);
if(y <= 0){
// float coef = -10 * y / ySpeed;
// ySpeed = ((ySpeed + coef) * (-1) ) * bouncyness;
ySpeed = (ySpeed * (-1)) * bouncyness;
System.out.println(ySpeed + " " + y);
y = 0;
}
if(x > Main.width)
break;
}
Vector2f[] graphicArray = new Vector2f[graphic.size()];
for (int i = 0; i < graphic.size(); i++) {
graphicArray[i] = graphic.get(i);
}
return graphicArray;
}
在其迭代中 y
在第一个 运行 上低于 X 轴。然后归零,
因此,您将在该迭代中获得的最大值 height
低于原始 height
.
后面也是一样,
直到 y
不设置为 0(我认为它会一直收敛到它)。
如果您将 height
设置为除以 10
,它应该看起来不错。
对于弹跳情况,将 if ( y <= 0)
更改为 if ( y<= 10 )
并删除 y = 0
语句。
正确的情况(不是弹跳),设置y = Math.abs(y)
一些想法
- 我不知道你在用
angle
做什么。对我来说,这看起来完全错误。尝试摆脱它。
您应该在一个时间步内对加速度进行两次积分,以使其在物理上正确运行。
x += v + acc * ∆time * ∆time * 0.5;
v += acc * ∆time;
当 y < 0 时使 y = -y
。
我猜你的 ∆time
是 1
而你的 acc
是 -10
。
我编写了一个简单的代码来获取跳球的位置,但我肯定错过了一些东西,因为我得到了这个:
这是获取 x 和 y 位置的代码:
public Vector2f[] draw() {
float x = 0, y = height; // height - float value from class constructor;
ArrayList<Vector2f> graphic = new ArrayList<Vector2f>();
for(;;){
Vector2f a = new Vector2f(x, y);
graphic.add(a);
ySpeed -= 10;
y += ySpeed*Math.cos(angle);
x += xSpeed*Math.sin(angle);
if(y <= 0){
// float coef = -10 * y / ySpeed;
// ySpeed = ((ySpeed + coef) * (-1) ) * bouncyness;
ySpeed = (ySpeed * (-1)) * bouncyness;
System.out.println(ySpeed + " " + y);
y = 0;
}
if(x > Main.width)
break;
}
Vector2f[] graphicArray = new Vector2f[graphic.size()];
for (int i = 0; i < graphic.size(); i++) {
graphicArray[i] = graphic.get(i);
}
return graphicArray;
}
在其迭代中 y
在第一个 运行 上低于 X 轴。然后归零,
因此,您将在该迭代中获得的最大值 height
低于原始 height
.
后面也是一样,
直到 y
不设置为 0(我认为它会一直收敛到它)。
如果您将 height
设置为除以 10
,它应该看起来不错。
对于弹跳情况,将 if ( y <= 0)
更改为 if ( y<= 10 )
并删除 y = 0
语句。
正确的情况(不是弹跳),设置y = Math.abs(y)
一些想法
- 我不知道你在用
angle
做什么。对我来说,这看起来完全错误。尝试摆脱它。 您应该在一个时间步内对加速度进行两次积分,以使其在物理上正确运行。
x += v + acc * ∆time * ∆time * 0.5; v += acc * ∆time;
当 y < 0 时使
y = -y
。
我猜你的 ∆time
是 1
而你的 acc
是 -10
。