0

我想在投掷物体之前绘制弹丸曲线。

我试图从以下链接创建弹丸运动

http://www.iforce2d.net/src/iforce2d_Trajectories.h

但它给出了一个例子,抛出的对象转移到目标体。

我想要以下

  1. 在两个位置(1-固定 box2d 对象和 2-触摸位置)之间绘制弹丸曲线。

  2. 如果我改变了触摸的位置,弹丸曲线也会移动到相应的位置。

任何想法遵循逻辑?

提前致谢。

4

1 回答 1

1

如果您在已经知道发射速度(角度和幅度,或 Vx(0),Vy(0) 分量)的情况下要求绘制曲线,这有点模棱两可。如果您知道发射角度和速度,则可以使用以下公式:

Px(t) = Vx(0)*t Py(t) = Vy(0)*t + 0.5*a*t*t

其中 Px(t), Py(t) 分别是 x,y 平面中的位置。

您可以通过计算 Xdelta(从您的发射和目标位置)来计算总飞行时间。然后

Xdelta = Tf*Vx(0)(总飞行时间 Tf)或 Tf = Xdelta/Vx(0),然后您可以在循环中对其进行迭代并绘制计算点。

注意:Box2d 的实际路径与封闭公式路径的实际路径会略有不同,因为 Box2D 正在逼近积分。如果您的(固定)时间步长大约为 1.0/60.0,则差异应该很小。您的里程可能会有所不同。

无论如何,这将允许您在路径上绘制任何点。

但是,我怀疑您的问题确实是这样的:

如何计算发射速度以击中特定目标。这不是一个简单的答案。

从发射角度和发射速度 Vo 和 Theta 开始,您可以将 Xdelta、Ydelta 的两个方程(根据上面的方程)写成:

Xdelta = Tf * Vo*cos(theta)

Ydelta = Tf * V0*sin(theta) + 0.5*a*Tf*Tf

如果你为 Tf 解决第一个问题,你会得到

Tf = Xdelta/(Vo*cos(theta))

代入第二个(你应该检查我的代数)

Ydelta = (xDelta*Vo*sin(theta))/(Vo*cos(theta)) + 0.5 * a * Xdelta^2/(Vo^2*cos(theta)^2))

做一些重新排列(再次检查代数):

2*Vo^2*cos(theta)^2*Ydelta - Vo^2*Xdelta*sin(2*theta) - a*Xdelta^2 = 0

这是 Vo 和 theta 中的非线性方程。
如果您的角度是固定的,您可以插入 theta,求解 Vo 的二次方,并且应该能够从中得到解决方案。

在那种情况下,我得到(再次检查代数):

Vo = +/- sqrt((a * Xdelta^2)/(2*cos(theta)^2*Ydelta - sin(2*theta)*Xdelta)

如果 sqrt(.) 中的值为负数,则根本无法进行拍摄。

如果您的 Vo 是固定的,您可能能够找到 theta 的封闭形式解决方案,或者以数字方式解决它。

一旦知道了 Vo 和 theta,仍然存在“发射这个弹丸时是否发生碰撞”的问题。

如果您知道它遵循的路径,您可以使用 Box2D 中的 AABB 在循环中测试路径上的点,以查看是否有任何可能与它发生碰撞的对象。这一切都可以在一个从 0 迭代到 Tf 的函数中完成,其中 dt = 模拟的固定步长。请注意,如果您的速度真的很高,您可能会“子弹”穿过某些东西。

这个有帮助吗?

于 2013-11-26T12:59:56.030 回答