Descent Freespaceを覚えている人にとっては、非ホーミングミサイルやレーザーを撃つときに敵を狙うのに役立つ優れた機能がありました。追跡している船の前に十字線があり、動いているところを撃つためにどこを撃つべきかを教えてくれました。目標。
私は/programming/4107403/ai-algorithm-to-shoot-at-a-target-in-a-2d-game?lq=1からの回答を使用しようとしましたが、それは2D用なので試してみましたそれを適応させます。
最初に計算を分解してXoZ平面の交点を解決し、x座標とz座標を保存してから、XoY平面の交点を解決し、y座標を最終的なxyzに追加してから、クリップスペースに変換してテクスチャを配置しました座標。しかし、もちろん、期待どおりに機能しないか、質問を投稿しなかったでしょう。
XoZ平面でxを見つけた後とXoYで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の場合も同じ)で、2回目は実際には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ではなく方形です-混乱を避けます。