1

我目前正在 Godot 引擎中编写一个战术 RPG,它使用一种名为 godotscript 的类似 Python 的语言。我已经到了需要绘制弹丸穿过空间的路径并弄清楚它的路径是否被阻挡的地步。游戏空间的构造就像一个 3 维坐标网格,所以我认为某种画线算法可能会起作用。

对于直线行进的弹丸,我使用 3D 版本的 Bresenham 画线算法来收集弹丸通过的点列表,然后检查它们中是否有任何被阻挡。效果很好!

对于实际上遵循真实弹丸运动的弹丸,我不太确定要使用什么算法。我有一个原点、一个目标点和对象的起始速度,它们应该足以为抛物线生成一个函数,我只是不确定绘制它的线的算法。

任何帮助将不胜感激!

4

1 回答 1

0

您还没有完全生成生成抛物线的信息,但是您有足够的信息来推导它。问题是发射角度,ϴ。通常,您可以从游戏参数中获得此信息。

由于您指定了抛物线,我推断您忽略了空气摩擦。假设你有足够的动力达到目标,就会有两个 ϴ 值击中目标;这些值之间的任何值都会过冲;高于或低于该间隔的任何东西都将达不到要求。

我将从游戏参数中假设 ϴ 并研究抛物线。为方便起见,我假设武器位于 (0, 0, 0),目标位于 (x, y, 0)。从这里开始,数学相对容易。

地面角度(即罗盘方向)由 给出φ = arctan(y/x)。我们将把射弹的速度分解为 x、y 和 h(垂直或高度)分量。

原始水平分量是s = v*sin(ϴ)(s = 地速)。距原点的距离是时间的线性函数:地速是恒定的。

垂直位置是弹丸高度的规范公式:

h = 1/2 * g * t^2 + v0 * t + h0
v0 = initial upward velocity = cos(ϴ) * starting velocity.
h0 = initial height (0 in our case?)
t = time
g = gravitational force, -9.8 m / sec^2

分解地速,我们得到每一个作为时间的函数:

x = s * sin(ϴ) * sin(φ) * t
y = s * sin(ϴ) * cos(φ) * t
h = -4.9 * t^2 + cos(ϴ)*v * t

有你的 3D 坐标。

于 2019-09-10T23:17:35.293 回答