Unity3d动态FOV脚本导致错误:“std::abs(det)>FLT_MIN”

yv5phkfx  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(286)

关于这个错误,我唯一知道的是用户CrimsonFreak在一个类似的问题中告诉我的:“错误的字面意思是,无论det是什么,其绝对值都不上级统一系统代码中的FLT_MIN。”(tysm btw,非常赞赏〈3)。当玩家的速度变化太快时,例如当以足够高的速度撞到另一个物体时,错误似乎会出现。我通过将物理材质的弹性更改为0暂时解决了这个问题,但现在错误又回来了,我设法挑出错误是由我的动态FOV引起的,下面是代码:

void Update()
{
    if (playerPosition == null)
    {
        return;
    }

    else
    {
        gameObject.GetComponent<Camera>().fieldOfView = newFieldOfView();
    }
}

private float newFieldOfView()
{
    float speed = player.GetComponent<Rigidbody>().velocity.z + 6;
    float targetFOV = (float)Math.Log(speed, 1.1) + 34;

    return (Mathf.Lerp(GetComponent<Camera>().fieldOfView, targetFOV, (float)0.1));
}

所以我的问题是为什么这会让引擎感到困惑呢我尝试将其更改为FixedUpdate()函数,但这并没有改变任何东西。此外,当然将非常感谢用于制作简单动态FOV的其他方式的任何解决方案/建议。感谢所有人的帮助和帮助:)

bxjv4tth

bxjv4tth1#

我不能完全复制您的问题,但我怀疑问题可能与对数函数有关,因为Log(0)=NaN,这可能会导致问题。负速度也应该是个问题。..我建议将新FOV值箝位到可行范围。

private float newFieldOfView()
{
    float speed = player.GetComponent<Rigidbody>().velocity.z + 6;
    speed = Mathf.Abs(speed);
    float targetFOV = (float)Math.Log(speed, 1.1) + 34;
    targetFOV = Mathf.Clamp(targetFOV, 1, 180);

    return (Mathf.Lerp(GetComponent<Camera>().fieldOfView, targetFOV, (float)0.1));
}

相关问题