寻找可变速度的目标时间

本文关键字:目标 时间 速度 寻找 | 更新日期: 2023-09-27 18:22:41

所以我的游戏中有鱼雷,它们以每秒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;
    }
}

现在这是可行的,但它有两个问题。

燃烧时间必须是int,否则分数越小,运行次数就越大,以保持准确性。

例如,如果我想要4.2的燃烧时间,为了保持准确性,我必须运行它42次,并每十分之一秒计算一次。

此外,平均值可能会偏离相当大的一部分,这取决于它超过目标的程度,也取决于计时器的精度

如果我的炮弹以每秒30米的速度前进,它需要前进121米,那么在它正常前进之前,它将再增加整整一秒的行程——你已经到达/超过了目标,这意味着它实际上将瞄准比实际应该更远29米的点。

用这种算法解决这一问题的唯一方法是更频繁地每10秒或100秒进行一次检查。

我觉得可能有一个我不知道的数学方程可以让我精确地求解这个问题。

有什么帮助吗?

寻找可变速度的目标时间

在加速运动过程中,您可以使用d = a*t^2/2或等效的t = sqrt(2*d/a),此时速度为v = a*t。然后,您可以使用v来推断目标。

正如您所描述的,您的运动分为两部分。第一部分是加速运动(具有恒定加速度),第二部分是恒定速度下的运动。

您可以单独计算每一个的旅行距离(或时间),然后将它们组合起来以获得所需的结果。

请记住,在特殊情况下,您需要检查目标是否比烧伤距离更近。下面的代码通过检查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;

如果

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

这是一种方法:

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
)