在box2d中绘制动态抛射体曲线

时间:2013-11-26 04:40:47

标签: box2d projectile

我想在投掷物体之前绘制抛射物曲线。

我试图通过以下链接创建射弹动作

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

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

我想要以下内容

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

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

  3. 有任何想法遵循逻辑吗?

    提前致谢。

1 个答案:

答案 0 :(得分: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(θ)^ 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(θ)^ 2 * Ydelta - sin(2 * theta)* Xdelta)

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

如果您的Vo已修复,您可以找到为theta找到封闭形式的解决方案,或者以数字方式解决它。

一旦你知道了Vo和theta,仍然存在这样一个问题:“当这个射弹发射时会发生碰撞”。

如果您知道它所遵循的路径,您可以使用Box2D中的AABB在循环中沿路径测试点,以查看是否存在可能与之碰撞的任何对象。这可以在单个函数中完成,该函数从0迭代到Tf,其中dt =用于模拟的固定步长。请注意,如果您的速度非常高,您可能会“通过”某些东西。

这有用吗?

相关问题