0

私のゲームには魚雷があり、それらは毎秒 0 メートルから始まり、現実的に加速します。数秒後に加速をやめ、一定の速度で前進します。

ターゲットまでの距離があり、基本的に自動照準のリードタイムを計算しようとしています。

与えられた

ターゲットまでの距離;

加速度 (毎秒);

燃焼時間 (加速が停止するまでの秒数);

基本的に、発射体が移動している平均メートル/秒を判断する必要があります。

私がそれを行うことができる唯一の方法は、このようなものです。

        curdistance; //stores distance traveled per second
        currentspeed; //stores speed at a given second
        acceleration;

        for(int timer = 1; curdistance < distanceToTarget;timer++)
{
        currentspeed = currentspeed + acceleration; 
        curdistance = curdistance + ( currentspeed);

    if(timer >= burnTime)
    {
    acceleration = 0;
    }

}

これで動作しますが、2 つの問題があります。

燃焼時間は int である必要があります。そうでない場合、分数が小さいほど、精度を維持するための実行回数が多くなります。

たとえば、精度を維持するために 4.2 の燃焼時間が必要な場合は、42 回実行し、10 秒ごとに計算する必要があります。

また、タイマーの精度によっては、ターゲットをどれだけオーバーシュートするかによって、平均がかなりずれることもあります。

私の発射物が毎秒 30 メートルで移動し、121 メートル移動する必要がある場合、問題なく移動する前に、さらに 1 秒の移動が追加されます。実際よりも29メートル離れた地点で。

このアルゴリズムでこれに対処する唯一の方法は、10 秒または 100 秒ごとにより頻繁にチェックすることです。

これを正確に解くことができる、私が知らない数学の方程式があるかもしれないような気がします。

ヘルプはありますか?

4

4 に答える 4

2

d = a*t^2/2加速運動中は、または同等t = sqrt(2*d/a)に、その時点での速度を使用できますv = a*t。次に、それを使用してターゲットを推定できますv

于 2013-07-16T13:26:38.193 に答える
2

あなたが説明したように、あなたの動きは 2 つの部分で発生します。最初の部分は加速運動 (一定の加速度) で、2 番目の部分は一定速度での運動です。

それぞれの移動距離 (または時間) を個別に計算し、それらを組み合わせて目的の結果を得ることができます。

ターゲットが燃焼距離よりも近い特殊なケースを確認する必要があることに注意してください。以下のコードは、チェックでそれを行いますif (distanceToTarget < burnDistance)

// these will be the results
float timeToTarget; 
float averageSpeed;

// assign values to these
float distanceToTarget;    
float acceleration;     
float burnTime;

float burnDistance = acceleration * burnTime * burnTime * 0.5;

if (distanceToTarget < burnDistance)
{
    timeToTarget = Math.Sqrt(2 * distanceToTarget / acceleration);
}
else
{
    float velocity = acceleration * burnTime;
    timeToTarget = burnTime + (distanceToTarget - burnDistance) / velocity;
}

averageSpeed = distanceToTarget / timeToTarget;
于 2013-07-16T13:38:03.743 に答える
1

もしも

d = initial distance to the target
b = burn time
a = acceleration

発射体の加速が止まると、

speed = a*b
distance (traveled) = dt = a*b^2/2

その瞬間から、それが必要になります

time for impact = ti = (d-dt)/(a*b)

合計時間は

total time for impact = ti + b
于 2013-07-16T13:31:09.730 に答える
0

これは 1 つの方法です。

Function VelocityGivenTime(burnTime, givenTime)
(
    T = givenTime
    If T > burnTime Then T = burnTime

    return acceleration * T
)

Function DistanceGivenTime(burnTime, givenTime)
(
    If burntime >= givenTime Then
        T = givenTime
        return 0.5 * acceleration * T^2
    Else
        T = burnTime
        D = 0.5 * acceleration * T^2
        D = D + VelocityGivenTime(T) * (givenTime - burnTime)
        return D
    End IF
)

ただし、ターゲットが距離を与えるまでの時間が本当に必要な場合は、次のようにすることができます。

Function TimeGivenDistance(burnTime, distance)
(
    burnDistance = DistanceGivenTime(burnTime)

    If distance > burnDistance Then
        return burnTime + (distance - burnDistance) / VelocityGivenTime(burnTime)

    Else
        return SQRT(2 * distance / acceleration)
    End If
)
于 2013-07-16T13:37:57.527 に答える