Descent Freespace を覚えている人にとっては、非ホーミング ミサイルやレーザーを撃つときに敵を狙うのに役立つ便利な機能がありました: 追跡した船の前に十字線が表示され、動いている船に命中させるためにどこを撃つか教えてくれました。目標。
AIアルゴリズムからの答えを2Dゲームでターゲットに「撃つ」ために使用してみましたが、2D用なので適応させてみました。
最初に計算を分解して XoZ 平面の交点を解決し、x 座標と z 座標を保存してから、XoY 平面の交点を解決し、最終的な xyz に y 座標を追加して、クリップスペースに変換し、それらにテクスチャを配置しました。座標。しかし、もちろん、それは正常に機能しません。さもなければ、質問を投稿しなかったでしょう。
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 も同じ) であり、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 ではなく正方形です - 混乱を避けます。