我正在尝试制造一种射弹,射击后的行为就好像它是从弹射器射出的。问题是计算轨迹。我有起始位置。目标也是最接近的敌人。
我尝试实现这个公式,我在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)
,则射弹根本不会移动。我正在改变v尝试不同的数字,它没有任何区别。 theta1和theta2也给出了NaN值。
最终编辑
我尝试了所有我能想到的方法,实施这些公式并且它对我不起作用。我决定改变一些不同的东西。谢谢大家的答案。我会保留这个帖子,以便有人可以使用这里发布的公式。
答案 0 :(得分: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
解决这个问题应该给你2个解决方案,一个在上面,一个在45度以下。
我暂时不知道如何做到这一点。
找到此http://en.wikipedia.org/wiki/Trajectory_of_a_projectile#Angle_required_to_hit_coordinate_.28x.2Cy.29
完整的公式是
如您所见,有两个可能的值(+ - )。我将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.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