如果您在已经知道发射速度(角度和幅度,或 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 = 模拟的固定步长。请注意,如果您的速度真的很高,您可能会“子弹”穿过某些东西。
这有帮助吗?