如何让一个物体沿着弧线路径移动?

3
我正在制作一个游戏,其中有一个机器人向另一个机器人投掷球形物体。
被投掷的球应该以对称弧线的形式飞行。我相信这个数学术语是“抛物线”。
两个机器人都在x轴上。
我该如何在我的游戏中实现这样的功能?我尝试了不同的方法,但都没有成功。
我的当前移动物体系统是这样的:每个对象都有x和y坐标(变量),还有dx和dy变量。
每个对象都有一个move()方法,在游戏循环的每个周期调用一次。它只是将dx添加到x上,将dy添加到y上。
我该如何在这个系统中实现我所描述的内容?
如果涉及大量的数学,请尽量简单地解释,因为我不太擅长数学。
我的情况如下图所示:
谢谢!
3个回答

6

你应该将速度添加到导弹中。

速度是一个矢量,它表示导弹在x轴和y轴上移动的速度。现在,不要使用Move(),而是使用类似Update()的东西。像这样:

void Update()
{
    position.X += velocity.X;
    position.Y += velocity.Y;
}

现在让我们想象一下,导弹被发射后会发生什么:

一开始它具有一定的起始速度。例如,有人以1 m/s的速度在x方向和-0.5 m/s的速度在y方向上发射了导弹。然后随着导弹的飞行,它将被拉向地面 - 它的Y速度将向地面增长。

void Update()
{
    velocity.Y += gravity;

    position.X += velocity.X;
    position.Y += velocity.Y;
}

这将使您的导弹按照物理规律移动(不包括空气阻力),并生成一个漂亮的抛物线。
编辑: 你可能会问如何计算初始速度。假设我们有一个给定的发射角度(发射线与地面之间的角度)和初始速度(我们可能知道发射后导弹的速度,只是不知道X和Y的值)。那么:
velocity.X = cos(angle) * speed;
velocity.Y = sin(angle) * speed;

1

在Michal的回答基础上,如果您想让导弹追踪机器人并击中它,您需要调整导弹的x轴速度。

void Update()
{
    ball.dy += gravity;    // gravity = -9.8 or whatever makes sense in your game
    ball.dx = (target.x - ball.x); // this needs to be normalized.

    double ballNorm = sqrt(ball.dx^2 + ball.dy^2);
    ball.dx /= ballNorm;


    ball.x += ball.dx;
    ball.y += ball.dy
}

这将使导弹跟踪你的目标。归一化向量的x分量可以确保它永远不会超过速度为1。这并不完全“规范化”向量,因为通常您还需要对y分量进行规范化。如果我们没有在此处进行规范化,我们最终会得到一个球,在第一次更新时就跳到了你的目标。如果要加快导弹的速度,只需将ballNorm乘以某个量即可。

0

你可以从这几个方程式中得到你需要的所有信息,包括最大高度、时间和距离。

g = gravity
v = start vorticity M/S
a = start angle deg

g = KG of object * 9.81
time = v*2 * sin(a) / g
range = v^2 * sin(a * 2) / g
height = v^2 * sin(a)^2 / 2*g

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接