对于那些记得 Descent Freespace 的人来说,它有一个很好的功能可以帮助你在射击非归航导弹或激光时瞄准敌人:它在你追逐的船前面显示一个十字准线,告诉你在哪里射击以便击中移动目标。
我尝试使用AI 算法的答案在 2D 游戏中“射击”目标,但它是针对 2D 的,所以我尝试对其进行调整。
我首先分解计算以求解 XoZ 平面的交点并保存 x 和 z 坐标,然后求解 XoY 平面的交点并将 y 坐标添加到最终的 xyz,然后我将其转换为剪辑空间并在那些位置放置纹理坐标。但当然它不能正常工作,否则我不会发布这个问题。
从我注意到在 XoZ 平面和 XoY 中找到 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 - 避免混淆。