math – 余弦加速度曲线的潜在浮点问题

我正在使用余弦曲线在范围[0,pi]之间的对象上施加力.通过我的计算,这应该给我一个速度的正弦曲线,在t = pi / 2时速度应该是1.0f

但是,对于最简单的例子,我的最高速度为0.753.

现在,如果这是一个浮点问题,那很好,但这是一个非常重要的错误,所以我很难接受它(如果是,为什么会有这么大的错误计算这些值).

一些代码:

// the function that gives the force to apply (totalTime = pi, maxForce = 1.0 in this example)
return ((Mathf.Cos(time * (Mathf.PI / totalTime)) * maxForce));


// the engine stores this value and in the next fixed update applies it to the rigidbody
// the mass is 1 so isn't affecting the result
engine.ApplyAccelerateForce(applyingForce * ship.rigidbody2D.mass);

更新

没有重力应用于对象,世界上没有其他对象可以与之交互并且没有拖动.我也使用RigidBody2D,因此物体只能在飞机上移动.

更新2

好的尝试了一个超级简单的例子,我得到了我期待的结果,所以我的代码中必定有一些东西.一旦我发现了不同的东西,我会更新.

为了记录,超级简单的代码:

float forceThisFrame;
float startTime;

// Use this for initialization
void Start () {
    forceThisFrame = 0.0f;
    startTime = Time.fixedTime;
}

// Update is called once per frame
void Update () {
    float time = Time.fixedTime - startTime;

    if(time <= Mathf.PI)
    {

        forceThisFrame = Mathf.Cos (time);

        if(time >= (Mathf.PI /2.0f)- 0.01f && time <= (Mathf.PI /2.0f) + 0.01f)
        {
            print ("Speed: " + rigidbody2D.velocity);
        }
    }
    else
    {
        forceThisFrame = 0.0f;
    }
}

void FixedUpdate()
{
    rigidbody2D.AddForce(forceThisFrame * Vector2.up);
}

更新3

我已经更改了原始代码以匹配上面的示例尽可能接近(下面列出的其余差异),我仍然得到了差异.

在这里are my results of velocity against time.对于我来说,它们都没有意义,用1N的恒定力,这应该导致线性速度函数v(t)= t,但这不是任何一个例子产生的.

剩余的差异:

>“计算”力(现在只返回1)的代码正在通过非统一DLL运行,尽管代码本身位于Unity DLL中(可以解释更多,但不能相信这是相关的!)
>将力施加到刚体上的行为是一种单独的行为.
>一个是在一个空的环境中移动一个立方体,另一个是移动Model3D并且附近有一个平面 – 在破碎的项目中尝试了一个具有相同代码的立方体,同样的问题

除此之外,我看不出任何差异,我当然不明白为什么这些事情会影响它.它们都在每次固定更新时对对象施加1的力.

最佳答案 对于余弦情况,这不是一个浮点问题,本身就是一个集成问题.

[在你的’固定’加速情况下,显然也存在轻微的浮点问题].

显然,加速度与力成比例(F = ma),但你不能简单地加上加速度来获得速度,特别是如果帧之间的时间间隔不恒定.

通过假设帧间加速度是常数来简化事物,因此跟随v = u at(或者∂v=a.∂t),你需要按照与最后一帧相比经过的时间比例来加速加速度的影响.因此,∂t越小,整合就越准确.

点赞