2012-09-10 119 views
2

到“拍”在目标对于那些你记住下降FREESPACE它有一个很好的功能,以帮助拍摄非制导导弹或激光,当你瞄准敌人:它的面前表现出十字线你追逐的那艘船告诉你在哪里射击才能击中移动目标。算法在3D游戏

我尝试使用回答AI algorithm to "shoot" at a target in a 2d game但它是2D所以我试图适应它。

我首先分解计算以求解XoZ平面的交点并保存x和z坐标,然后求解XoY平面的交点并将y坐标添加到最终的xyz,然后将其转换为剪贴区并放入在这些坐标处的纹理。但它当然不能如其所愿,否则我不会发布这个问题。

从我注意到在XOY发现在XOZ平面X和之后的X是不相同的,所以一定出事了。

float a = ENG_Math.sqr(targetVelocity.x) + ENG_Math.sqr(targetVelocity.y) - 
      ENG_Math.sqr(projectileSpeed); 
    float b = 2.0f * (targetVelocity.x * targetPos.x + 
      targetVelocity.y * targetPos.y); 
    float c = ENG_Math.sqr(targetPos.x) + ENG_Math.sqr(targetPos.y); 
    ENG_Math.solveQuadraticEquation(a, b, c, collisionTime); 

第一次targetVelocity.y实际上是targetVelocity.z(同为targetPos),它实际上是targetVelocity.y第二次。

XOZ后的最终位置是

crossPosition.set(minTime * finalEntityVelocity.x + finalTargetPos4D.x, 0.0f, 
       minTime * finalEntityVelocity.z + finalTargetPos4D.z); 

后XOY

crossPosition.y = minTime * finalEntityVelocity.y + finalTargetPos4D.y; 

是我分成2架飞机和计算什么好方法吗?或者对3D来说有一个完全不同的方法?

  • sqr()是方形而不是sqrt - 避免混淆。
+0

我希望在这里没有重力... – Eric

回答

1

如果你在(0,0,0)在时间t_0 = 0并拍摄弹丸速度pv,打有初始位置tp=(tpx,tpy,tpz)与时刻等速tv=(tvx,tvy,tvz)的目标,这意味着

Abs(tp+t*tv) == t*pv 

解决这个公式为t(tp * tv是tp和tv等的标量乘积):

t = - (tp*tv ± sqrt((tp*tv)^2+(tp * tp)*(pv^2-tv*tv)))/(tv*tv-pv*pv) 

所以你需要拍摄位置tp+t*tv。只需将其投影到视口中并在那里绘制十字准线即可。

希望这会有所帮助。

+0

为什么'Abs'?不是'tp + t * tv == t * pv'通常是真的吗? – Eric

+0

我们使用绝对值是因为我们计算目标和射手在时间*距离*之间的*距离*(必须等于子弹为了在当时击中子弹而行进的距离) 。 –

+0

@Gareth Rees:哦,我看到了这个问题 - 我读了'pv'作为一个向量。 – Eric

0

3D案例的公式与I gave in the 2D case相同。唯一的区别是射击解决方案不是以角度的形式:您需要3D旋转。但对于这个应用程序,你不需要射出方案,你只需要知道在哪里画的标线。

例如,以最简单的情况(静止射手能够瞬间旋转):

让目标是在位置A,并用速度VA移动和射手是在位置B固定的,并且可以火枪弹速度ş。让射手在时间0点射击。子弹击中时间t,使得| A - B + t VA | = t s。这是一个二次方程t,您应该能够解决(或确定没有解决方案)。确定了t后,您现在可以在与子弹击中的世界位置相对应的屏幕位置绘制您的网格(这是A + t VA)。

其他情况与2D相似。