物体的弹丸运动

时间:2013-06-10 21:03:11

标签: java motion projectile

我的对象目前只使用以下代码以设定角度直线:

    this.time = this.time + deltaTime;

    // Vertical : Speed * Sine * Angle
    double vy = (this.speed * Math.sin(this.angle)) + this.ax*this.time ;
    // Horizontal : Speed * Cosine * Angle
    double vx = (this.speed * Math.cos(this.angle)) + this.ay*this.time;

    this.x = this.x + vx*this.time;
    this.y = this.y + vy*this.time + this.ay*(this.time*this.time); 

    vx += this.ax * this.time;
    vy += this.ay * this.time;

我假设我在计算方面犯了一些数学错误,因为看起来x值是正确的,尽管y值没有回落。

以下是我的初始值,以防您想知道:

    this.time = 0.0;
    this.deltaTime = .0001;
    this.x = 1.0;
    this.y = 10;
    this.speed = 60.0;
    this.ay = -9.8;
    this.angle = 45;
    this.ax = 0.0;

这是我犯这个愚蠢的错误,还是我错过了一些关键概念?

GamePanel.java:https://gist.github.com/Fogest/7080df577d07bfe895b6

GameLogic:https://gist.github.com/Fogest/36aba3e1a7fc30984e4e

3 个答案:

答案 0 :(得分:3)

在使用三角法中的角度之前,必须将角度从度数转换为弧度。来自Math.sin Javadocs:

  

参数:

     

a - 角度,以弧度表示。

乘以Math.PI然后除以180,将度数转换为弧度。

答案 1 :(得分:2)

你在这里误用了基本的运动方程。在上面的示例中,您可以通过将其重新添加来抵消重力的影响。

通过更新速度已经考虑了整个重力效应。另外,在增量计算中使用绝对时间是没有意义的,并且几乎每个this.time实例都应该被deltaTime替换。

同样在概念层面上,您正在评估微分方程,因此这应该都在循环中。此外,你的方式过于复杂。 修复示例:

this.speed = 60.0;
this.deltaTime = 0.0001;
this.endTime = 10.0;
this.x = 1.0;
this.y = 10;
this.ay = -9.8;
this.ax = 0;
this.angle = 45;
this.vx = this.speed*Math.cos(this.angle*(Math.PI/180.0))
this.vy = this.speed*Math.sin(this.angle*(Math.PI/180.0))

double time = 0.0;
while (time < this.endTime){
    time += this.deltaTime;
    this.x += this.vx*this.deltaTime;
    this.y += this.vy*this.deltaTime;

    this.vx += this.ax*this.deltaTime;
    this.vy += this.ay*this.deltaTime;
}

随着时间的推移,这将是一个运动中的抛射物。如果您有任何问题,请告诉我。

哦,看起来你大部分都是正确实现了代码,现在错误就是你正在制作你的2D点并从你的方法返回。我不确定你正在使用什么IDE,但它确实会给你一个编译错误。

Point2D p = new Point2D.Double(x,y);
return p;

应替换为:

return new Point2d.Double(this.x, this.y)

答案 2 :(得分:1)

在这些内容中,我认为您不小心交换了axay

// Vertical : Speed * Sine * Angle
double vy = (this.speed * Math.sin(this.angle)) + this.ax*this.time ;
// Horizontal : Speed * Cosine * Angle
double vx = (this.speed * Math.cos(this.angle)) + this.ay*this.time;

由于ax为零(由于物体在射弹运动中未获得水平速度),因此输入错误使vy保持不变。