2

我正在尝试创建一个射弹,当它被发射时,它的行为就像是从弹射器射击一样。问题是计算轨迹。我有起始位置。目标也是最近的敌人。

我试图实现这个公式,我在2d 弹丸轨迹中找到了这个公式?

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),弹丸根本不会移动。我正在改变 v 尝试不同的数字,它没有任何区别。theta1 和 theta2 也给了我一个 NaN 值。

最终编辑

我尝试了所有我能想到的方法来实现这些公式,但它对我不起作用。我决定做一些不同的事情。谢谢大家的回答。我将保留此线程,以便有人可以使用此处发布的公式。

4

1 回答 1

3

您的公式使用不正确,因为您假设速度是恒定的(这是不正确的。尝试垂直拍摄,在某个点速度应该为 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 == Xtarget并且Yt == Ytarget

假设你知道 v,弹射器的发射速度是已知的,这个表达式现在只取决于 theta(和 t,但 t 可以表示为 theta 的函数)。

v * cos(theta) * t + x0 == Xtarget
v * sin(theta) * t + G * t * t + y0 == Ytarget

为 theta 解决这个问题应该给你 2 个解决方案,一个在 45 度以上,一个在 45 度以下。

我暂时不知道该怎么做。

编辑

找到这个http://en.wikipedia.org/wiki/Trajectory_of_a_projectile#Angle_required_to_hit_coordinate_.28x.2Cy.29

完整的公式是

公式

如您所见,有 2 个可能的值 (+-)。我将 dx 称为 Xtarget 和 x0 之间的增量,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.8ms-2,但只有当 dx 在 m 中,v 在 ms-1 中时才有效。如果没有,您将不得不调整常量的值。

进一步阅读,空气阻力!http://en.wikipedia.org/wiki/Trajectory_of_a_projectile#Trajectory_of_a_projectile_with_air_resistance

于 2013-11-13T17:44:59.197 回答