【问题标题】:Normalized vector function returns unexpected result归一化向量函数返回意外结果
【发布时间】:2019-08-13 20:16:57
【问题描述】:

我在理解向量归一化函数时遇到问题。

我有这个向量归一化函数:

function vectorNormalization(vector) {
    var magnitude = Math.sqrt((vector[0] * vector[0]) + (vector[1] * vector[1]) +
                    (vector[2] * vector[2]));

    var x = vector[0] / magnitude;
    var y = vector[1] / magnitude;
    var z = vector[2] / magnitude;

    return [x, y, z];
}

这些是两个向量之间减少的结果(在 3D 软件中使用)。

[X: -0.004805074799706634, Y: 0.19191680472036263, Z: -0.002017289400100708]

向量归一化函数返回:

[-0.025028054575754678,0.99963152765883,-0.010507397138519977]

Y 值太高,它应该被归一化并代表一个单位,但它导致的数字要高得多。单位应小于归一化前的值。

如您所见,我正在处理具有小数精度的 3D 坐标系。该部门正在产生这个。我想我需要做一些考虑小数精度的事情,但我不确定。

【问题讨论】:

    标签: math vector normalization


    【解决方案1】:

    答案是正确的。归一化将向量投影到单位球面上。原始向量的幅度为 0.191987547,小于 1,因此归一化会导致幅度增加。您可以通过计算得到的归一化向量的大小来验证这种情况,并看到它的大小本质上是 1.0。

    此外,您可以看到原始的 Y 分量比 X 或 Z 分量长得多,因此它在归一化向量中非常接近 1 也就不足为奇了。

    【讨论】:

    • 有没有办法得到一个不会更高的单位。我试图在一个方向上为对象设置动画,直到对象 2。使用此函数,对象将在循环中添加这些值的第一次迭代中传递 y 轴上的第二个对象,因此它不代表较小的对象该范围内的单位,一个单位,它是两个向量之间的整个范围的子集。有没有一个函数可以给我一个单位,它的增量将代表距离的一部分。
    • 我认为你需要的不是向量归一化。在上述情况下,您应用 1/vec_mag 的比例因子,其中 vec_mag 是向量的大小。您可以对比例因子施加下限或其他一些约束。不过,最终您需要做的是定义您正在寻找的行为,然后定义一种算法来根据该需求计算比例因子。
    猜你喜欢
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 2017-08-31
    • 2019-11-22
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多