实现抛物线运动

8

我已经搜索了互联网上的资源,并找到了许多有用的信息,但它们都是数学网站,试图告诉我如何解决一个物体到达y位置必须处于什么角度的问题。然而,我正在尝试运行一个模拟程序,但还没有找到任何可靠的方程可以实现编码来模拟抛物线曲线。那些对物理有一定了解的人能帮助我吗?


空气摩擦(风阻)怎么办? - osgx
为了简单起见,我打算说“不”。这只会让事情变得更加复杂 :) - Dominic K
4个回答

9
虽然Benny的回答很好,尤其是在泛化方面,但你可以精确地解决问题,而不是使用有限的积分步骤。你需要的方程式是:
s = u*t + 0.5*a*t^2;

点击此处了解公式的来源。

这里,s是位移,u是初始速度,a是加速度,t是时间。这个方程只有一个维度,但可以轻松用于你的问题。你需要做的就是将你的抛体运动分成两个部分:一个平行于加速度,一个垂直于加速度。如果我们让Sx描述x方向上的位移,Sy描述y方向上的位移,我们得到:

Sx = Ux*t + 0.5*Ax*t; 
Sy = Uy*t + 0.5*Ay*t;

在您的特定示例中,Ax为0,因为唯一的加速度是由于重力引起的,即Ay = -g。负号来自于重力将会沿着物体原本的运动方向作用于相反的方向。Ux和Uy可以通过简单的三角函数计算得出:

Ux = U*cos(angle);
Uy = U*sin(angle);

将所有这些组合在一起,您会得到两个方程式,描述了发射后的时间t内,相对于起始位置弹丸将在哪里:
Sx = U*cos(angle)*t;
Sy = U*sin(angle)*t - 0.5*g*t^2;

除非我真的搞砸了,否则我的角色根本不会移动。代码在这里http://pastebin.com/zecMTnDi-然后这些值将添加到x和y值中。 - Dominic K
链接无效。我想你的角色没有移动是因为你没有更新时间变量t。因此,在每一帧中,你应该像这样做:t += 0.05; - pheelicks
我的时间变量是gameTime,在XNA中它代表了帧之间经过的时间,或者游戏启动后经过的总时间。但两种情况都不适用。 - Dominic K
1
我不明白为什么它不能工作。你的代码肯定有其他问题。在我给你的方程中,很明显如果t改变,Sx和Sy会改变,因此静止的物体意味着要么你的t没有改变,要么你没有正确更新抛射物的位置。我建议避免使用gameTime,因为这假设抛射物在游戏开始时就被发射了。相反,使用一个变量t,在发射时将其设置为0,并在每个帧上增加一个有限的量,例如t += 0.05。 - pheelicks

6

不要使用位置方程式,而是使用速度方程式。从物体的旧速度计算出每个模拟循环的新速度,并将其应用于您的物体。您需要知道每次模拟循环之间的经过时间。当然,这适用于垂直或水平速度。

v_new = v_old + acceleration * delta_time  (from wikipedia)

然后应用:

position_new = position_old + v_new * delta_time;

你可以使用简单的加速度-9.8米/秒(不要忘记屏幕上的“向下”实际上是垂直位置的增加,因此你也可以使用+9.8)。或者你可以更高级一些,添加可变加速度(例如来自风力,如果你还在模拟物体的水平运动)。
基本上,你所应用的加速度取决于施加在物体上的力的总和(重力、摩擦力、喷气推进力等)。
F_final = F1 + F2 + ... + Fn

以下内容可以帮助您解决这个问题。
如果您正在对对象进行力学建模,首先使用以下方法将力分解为水平和垂直分量:
F_horiz = F * sin( angle )
F_vert =  F * cos( angle )  where angle is the angle between the force and the horizontal.

然后根据力计算加速度,使用以下公式:

a = F / mass

(我将所有对这些知识的贡献归功于我的第一次编程经历:GORILLA.BAS =))
(注意:上述内容已包含HTML标签,以下为翻译内容)

谢谢你提供这个线索。我也会自己检查一些方程式。 - Dominic K
我刚刚玩了猩猩游戏...但是玩得很烂 :( - Dominic K
新位置 = 旧位置 + 新速度 * 时间间隔;不对。这样不行,因为速度在时间间隔内是不恒定的。事实上,加速度也不是恒定的,除非你只是让物体自由下落。重新开始吧。如果遇到困难,可以参考pheelicks的答案。 - Jive Dadson
@Jive:如果你忽略空气阻力和其他微妙的因素,加速度是恒定的……它只是由于重力引起的加速度。这一点无论是扔还是掉落都是正确的——两者之间的区别只在于初始速度。虽然速度不是恒定的,但如果你选择足够小的时间间隔,你可以用线性段(即每个段内速度恒定)来近似真实轨迹。 - Tim Goodman
你必须在时间间隔内保持速度等参数不变,这是计算机的工作原理。幸运的是,现代计算机速度足够快,可以使用足够小的时间间隔来平滑地显示运动。这就是为什么这是一个模拟,而不是真实的生活。 - Benny Jobigan
@benny 不,你不必被那个难题困住。接受的答案并不假定任何时间段内都是恒定的速度,例如。 - Yakk - Adam Nevraumont

3

一些定义:

x = x-coordinate (horizontal)
y = y-coordinate (vertical)
Vx = x-velocity
Vy = y-veloctiy
t = time
A = initial angle
V0 = intial velocity
g = acceleration due to gravity

一些公式:

Vx = V0*cos(A)
Vy = V0*sin(A) - g*t
x = V0*cos(A)*t
y = V0*sin(A)*t - (1/2)*g*t^2

这里我将初始位置称为 x=0y=0。我还忽略了空气阻力和其他各种效应,例如由于地球自转而产生的科里奥利力--如果我们谈论的是洲际导弹的弹道轨迹之类的话,这些因素会很重要。 - Tim Goodman
1
您可以选择在每一步中将 VxVy 添加到上一个位置,或者只需使用 t 的函数公式计算新位置的 xy - Tim Goodman
给它一些初始速度(在我的方程中为V0),并选择一个介于零和π弧度之间的角度A,以便在t = 0Vy > 0 - Tim Goodman
我在想你的代码问题是否超出了你所发布的部分......我能看到实际循环的样子,以及你在哪里声明了vxvyxy吗?你确定这些变量本身是浮点数或其他类型而不是整数,对吧? - Tim Goodman
除非我做错了什么,否则它总是从Y=0开始增加(所以它下降)。我需要将y发送到不同的初始位置吗? - Dominic K
显示剩余16条评论

1

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