2

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 ではなく正方形です - 混乱を避けます。
4

2 に答える 2

1

(0,0,0)時間にいt_0 = 0て、速度のある発射体を発射し、時間 t で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。それをビューポートに投影して、そこに十字線を描くだけです。

お役に立てれば。

于 2012-10-07T21:15:51.467 に答える
0

3Dの場合の方程式は、2Dの場合で示したものと同じです。唯一の違いは、発射ソリューションが角度の形ではないことです。3D回転が必要です。ただし、このアプリケーションでは、発射ソリューションは必要ありません。レチクルを描画する場所を知っている必要があります。

たとえば、最も単純なケース(瞬時に回転できる静止したシューティングゲーム)を取り上げます。

ターゲットが位置Aにあり、速度VAで移動しているとします。シューターは位置Bで静止しており、速度sで弾丸を発射できます。時間0で射手を発射させます。弾丸は時間tで、| A − B + tVA|となるように命中します。= ts。これはtの二次方程式であり、解くことができる(または解がないと判断できる)はずです。tを決定したら、弾丸が当たるワールド位置(A + t VA)に対応する画面位置にレチクルを描画できます。

他のケースも同様で、2Dの場合と同じです。

于 2012-10-07T21:24:37.210 に答える