0

我有一个函数可以返回 NavMesh 路径的总长度,使用Vector3.SqrMagnitude来避免Vector3.Distance中 Sqrt 计算的开销:

float DistanceAlongPath(NavMeshPath path)
{
    float sum = 0;

    for (int x = 0; x < path.corners.Length - 1; x++)
    {
        sum += Vector3.SqrMagnitude(path.corners[x + 1] - path.corners[x]);
    }

    return sum;
}

当路径只有两个点时,计算似乎很好,但是在 3 点或更多点时,长线返回的值总是小于只有 2 点的短线返回的值。

第一张图片显示的距离是 3848,第二张图片显示的距离是 3419,尽管路径要长得多。

在此处输入图像描述 在此处输入图像描述

Vector3.Distance 适用于任意数量的点。

我错过了什么吗?

4

1 回答 1

3

SqrMagnitude 仅给出长度的近似值。虽然 SqrMagnitude 的值可以相互比较以进行相对长度比较,但它们并没有给出真实的长度,因此您不能将它们组合起来。

您的问题的根源在于数学,特别是处理加法和乘法的顺序:

(5+5+5)^2 != (5^2 + 5^2 + 5^2)

例如,如果您有 3 个线段,每个长度为 5,则每个线段的 SqrMagnitude 为 25。将它们相加得到 115。

现在考虑长度为 15 的单个线段。SqrMagnitude 为 225。

在任何一种情况下,如果您应用平方根运算来获得真正的长度,您都会得到相同的结果。3*Sqrt(25) == 1*Sqrt(225)

于 2017-12-17T16:50:02.390 回答