我试图创造一个弹丸,当发射时,它的行为就像是从弹射器发射的一样。问题是计算轨迹。我有起始位置。目标也是最接近的敌人。
我试图实现这个公式,我在2d projectile trajectory?

xn = x0 + v * t * cos(theta)
yn = y0 + v * t * sin(theta)

我就是这样实现的:
    float v = 70f;
    t += Gdx.graphics.getDeltaTime();
    angle -= 0.1f;
    float xn = originX + v* t * MathUtils.cosDeg(angle);
    float yn = originY + v* t * MathUtils.sinDeg(angle);
    position.set(x,y);

我试着让弹丸沿着轨迹线移动,就像下面的视频一样,目标是由弹射器决定的,它是最接近的敌人:
https://www.youtube.com/watch?v=mwU24AuQibw
编辑
private float g = 9.8f;
private float v = 50;

public void update()
{
    t = Gdx.graphics.getDeltaTime();

    float dx = originX - target.x;
    float dy = originY - target.y;

    double radi = Math.sqrt(Math.pow(v, 4) - g * (g * dx * dx + 2 * dy * v * v));
    double theta1 = Math.atan((v*v + radi) / (g * dx));
    double theta2 = Math.atan((v*v - radi) / (g * dx));

    float xn = originX + v * t * MathUtils.cos((float) theta1);
    float yn = originY + v * t * MathUtils.sin((float) theta2);

    position.add(xn,yn);

我做了上面的代码,但是它使投射物消失了,因为我使用了add(xn,yn),但是如果我使用set(xn, yn),投射物根本不会移动。我试着换不同的号码,没什么区别。θ1和θ2也给了我一个NaN值。
最终编辑
我想尽一切办法去实现这些公式,但都不管用。我决定做些不同的事情。谢谢大家的回答。我会保留这条线索,以便有人可以使用这里张贴的公式。

最佳答案

你的公式没有正确使用,因为你假设速度是恒定的(这不是真的)。试着垂直拍摄,在某个点的速度应该是0),角度变化0.1左右,不管经过多少时间。
v是发射速度。theta是发射角。(x0, y0)是发射位置。

VX = v * cos(theta)
VY = v * sin(theta)

提供正确的垂直和水平发射速度。
现在,速度的变化取决于两个因素:空气摩擦和重力。让我们暂时忘掉摩擦吧。
Vxn不受重力影响。因此,它不会改变。
Vyn受重力影响。它的值是时间的函数:
Vyn = VY + t * G
Vxn = VX

其中g通常~9.8m.s-2
现在,为了测量你的角度,你需要找出抛射物击中地面的位置。那是(Xtarget, Ytarget)(Xt, Yt)是经过时间t后弹丸的位置:
Xt = VX * t + x0
Yt = VY * t + 0.5 * G * t * t + y0

你想要Xt == XtargetYt == Ytarget
假设你知道v,弹射器的发射速度是已知的,这个表达式现在只取决于θ(和t,但t可以表示为θ的函数)。
v * cos(theta) * t + x0 == Xtarget
v * sin(theta) * t + G * t * t + y0 == Ytarget

为θ解这个问题应该给出两个解,一个在45度以上,一个在45度以下。
我暂时不知道怎么做。
编辑
找到这个http://en.wikipedia.org/wiki/Trajectory_of_a_projectile#Angle_required_to_hit_coordinate_.28x.2Cy.29
完整的公式是
如您所见,有两个可能的值(+-)。我把dx称为xtarget和x0之间的delta,dy也一样,它的意思是:
radi = Math.sqrt(Math.pow(v, 4) - g * (g * dx * dx + 2 * dy * v * v));
theta1 = Math.atan((v*v + radi) / (g * dx))
theta2 = Math.atan((v*v - radi) / (g * dx))

现在,通常g=9.8m.s-2,但它只在dx为m,v为m.s-1时起作用。如果没有,就必须调整常数的值。
进一步阅读,空气阻力!http://en.wikipedia.org/wiki/Trajectory_of_a_projectile#Trajectory_of_a_projectile_with_air_resistance

08-28 14:33