我正在尝试在两点之间绘制轨迹路径。我只知道有问题的两点以及它们之间的距离。我希望能够计算的是到达终点所需的速度和角度。
我还希望能够考虑一些重力和风,以便路径/轨迹不那么“完美”。它用于电脑游戏。
谢谢 F。
这整个物理情况可以使用SUVAT 运动方程来描述,因为加速度始终是恒定的。
以下解释假定了解基本代数和矢量数学。如果您不熟悉它,我强烈建议您在尝试编写您提议的那种游戏之前先阅读它。它还假设您正在处理 2D,但如果您正在处理 3D,则大多数情况都适用,因为它都是矢量形式 - 您最终只是求解三次而不是二次,这可能是最好的使用数值求解器。
(注:向量以粗体表示。)
基本上,您首先要制定位移方程(以矢量形式):
r = u t + ( a t^2)/2
r 是相对于起始位置的位移,u 是初始速度,a 是加速度(始终不变)。t 当然是时间。
a 取决于系统中存在的力。在重力和风的一般情况下:
a = F_w /m - g j
其中i
是 x 方向j
的单位向量和 y 方向的单位向量。g
是重力加速度(地球上为 9.81 ms^-2)。F_w
是风引起的力矢量(这个术语在没有风的情况下消失)——为了简单起见,我们假设它是常数。m
是弹丸的质量。
然后你可以简单地将等式代a
入 for 的等式中r
,剩下的就是一个由三个变量 ( r
, u
, t
) 组成的等式。接下来,将您的单向量方程扩展r
为两个标量方程(用于 x 和 y 位移),并使用替换来消除t
(这里的数学可能有点棘手)。r
你应该留下一个只有和u
作为自由变量的二次方程。
现在,您要求解 的方程r = [target position] - [start position]
。如果您为初始速度(即速度)选择某个大小u
,则可以将 u 的 x 和 y 分量分别写为U cos(a)
和U sin(a)
,其中U
是初始速度,a 是初始角度。这可以重新排列,并通过一些三角函数,您最终可以求解角度 a,从而为您提供发射速度!
上面的大部分描述应该首先在纸上完成。然后,只需编写一个函数来求解二次公式并应用一些反三角函数即可得到结果。
PS 对不起,这篇文章中的所有数学/物理,但这是不可避免的!无论如何,OP似乎更多地询问了物理方面而不是计算方面,所以这就是我提供的。希望这对 OP 和其他人仍然有用。
本书:
现代外部弹道学:对称射弹的发射和飞行动力学ISBN-13:978-0764307201
是弹道学的现代权威。为了准确起见,您需要进行更正:
http://www.dexadine.com/mccoy.html
如果您需要一些免费且不那么权威的东西,Mann 博士 1909 年的经典著作The bullet's flight from powder to target可在 books.google.com 上找到。
-kmarsh
PS 游戏中弹道不佳是我的一个特别讨厌的问题,尤其是“射击平坦到无限远”的弹道模型。
正如人们所提到的,虽然确定点之间的角度相对容易,但确定风和重力对击球的影响方式却更加困难。
风和重力都是加速力,尽管它们的作用有所不同。
重力更容易,因为无论物体如何,它都有恒定的方向(向下)和大小。(假设你没有以高得离谱的速度拍摄东西)。要计算重力将如何影响物体的速度,只需花费自上次更新物体速度以来的时间,将其乘以重力因子,然后将其添加到当前速度向量中。
举个简单的例子,假设一个物体在 x、y、z 方向上以 (3, 4, 7) 的速度运动,z 与重力平行。你决定你的重力值为 -.3 你准备好计算新的速度。当您检查时,您会发现自上次计算以来已经过去了 10 个时间单位(无论您的时间单位是什么......也许是滴答声或其他什么)。你用你的时间单位(10)乘以你的重力(-.3),得到-3。你把它加到你的 Z 上,你的新速度是 (3, 4, 4)。就是这样。(这已经非常简化了,但这应该可以帮助您入门。)
风有点不同,如果你想做对的话。如果你想做一个简单易行的方法,你可以让它像重力一样......在特定方向上的恒定力。但更现实的方法是让力取决于您当前的速度矢量。简而言之:如果你完全随风移动,它不应该给你任何力量。在这种情况下,您只需将力的大小计算为它的方向与您自己的方向之间的差异。
一个简单的例子可能是,如果你在 (3, 0, 0) 处移动,而风在 (5, 0, 0) 处移动,我们可以给风的强度为 0.5。(您还必须乘以经过的时间......为了这个示例,为了简单起见,我们将经过时间的因子保留为 1)您计算向量中的差异并乘以您的时间差异(1),发现差是 (2, 0, 0)。然后将该向量乘以风力强度 0.5,您会发现速度变化为 (1, 0, 0)。把它加到你之前的速度上,你得到 (4, 0, 0)...所以风稍微加快了物体的速度。如果您等待另一个时间单位,您将得到 (1, 0, 0) 的差异,乘以您的强度 0.5,因此您的最终速度将是 (4.5, 0, 0)。如你看到的,
角度很简单,atan2(pB.x-pA.x,pB.y-pA.y)。速度矢量应该是 (pB-pA)*速度。并添加重力/风(重力只是带有负 y 分量的风)在每个模拟滴答声中将(缩放的)风矢量添加到您的速度(您基本上将其添加为加速度)。
只是一个链接,对不起:http ://www.gamedev.net/reference/articles/article694.asp 。
在 gamedev 上有很多关于游戏物理的论文。看一看。
(顺便说一句:风只会给物体增加一些速度。困难的部分是重力。)