【问题标题】:draw dynamic projectile curve in box2d在box2d中绘制动态弹丸曲线
【发布时间】:2013-11-26 04:40:46
【问题描述】:

我想在投掷物体之前画出弹丸曲线。

我尝试通过以下链接创建弹丸运动

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

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

我想要以下内容

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

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

任何想法遵循逻辑?

提前致谢。

【问题讨论】:

  • 您可以使用包含四个点的 BEZIER CORVE 方程来绘制曲线。签入 cocos2d-x 或 wiengine 演示示例
  • 但是贝塞尔曲线需要控制点。目标主体应位于任何位置。我想要动态曲线。我们不知道控制点。
  • 你有一个固定点和一个接触点,那么你也可以用这些点找出两个点。

标签: box2d projectile


【解决方案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 = 模拟的固定步长。请注意,如果您的速度真的很高,您可能会“子弹”穿过某些东西。

这有帮助吗?

【讨论】:

  • 感谢您的回复。我会试试这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多