【问题标题】:Denormalize vector非规范化向量
【发布时间】:2015-01-10 19:27:31
【问题描述】:

如何对已标准化的向量进行非标准化以获得标准化之前的原始值?

例如:

vec = [-0.5, -1.0, 0.0]
vec_length = sqrt(vec.x^2 + vec.y^2 + vec.z^2)
vec_normalized = [vec.x/vec_length, vec.y/vec_length, vec.z/vec_length]

产量:

vec_length = 1.11803
vec_normalized = [-0.447214,-0.894427,0]

如何从归一化向量 [-0.447214,-0.894427,0] 中得到原始向量 [-0.5, -1.0, 0.0]?

谢谢!

【问题讨论】:

    标签: math vector maxscript


    【解决方案1】:

    恢复:除法的逆运算是乘法。因此:

    vec = [vec_normalized.x*vec_length,
           vec_normalized.y*vec_length,
           vec_normalized.z*vec_length]
    

    如果vec_length未知,则无法恢复原始向量。归一化可以看作是 direction+magnitudedirection 的有损压缩。有无数个向量映射到单个归一化向量。

    在数学上,将多个不同输入值映射到单个输出值的函数是不可逆的。

    关于归一化向量的一个很好的特性是,如果你想要一个特定的幅度 f 与那个方向,你可以乘以你的向量 f,并且知道它有长度f.

    精度: 但是,请注意,这并不一定给您 原始向量,而是在一般情况下,它的近似值。这是因为浮点数在内存中表示的精度有限。因此,计算中的归一化向量实际上可能不是精确的归一化向量数学上

    【讨论】:

    • 我想他想在不知道vec_length的情况下获得[-0.5, -1.0, 0.0],但只知道[-0.447214,-0.894427,0]...
    • @TWiStErRob:我不确定;我也想到了这一点。也许这对我来说太明显了,这应该是显而易见的。 (注意:当我说明显时,我是在否定自己,批评自己,因为“明显”是一个废话)
    • 是的,在 uni 我们遇到了同样的问题,大约有 5 个级别的琐碎(=明显)基于谁说的。正如我所见,您需要进行 2-3 次编辑才能意识到解决方案是无限的,因此远非显而易见。
    • 比方说,对我来说很明显你不能恢复未归一化的向量,甚至某些函数的(非)可逆性,如归一化函数,也是显而易见的,所以我只是假设 OP 仍然有长度。顺便说一句,你有一个fencepost error 在你计算我的编辑,这只有 1-2 ;)
    • 同意您评论的两个部分,请注意,我计算的是我实时看到的更新,而不是 SO 所做和存储在历史中的压缩编辑;)
    【解决方案2】:

    你不能。
    归一化形式为[-0.447214, -0.894427, 0]的向量有无数个。

    如果你想要一个“更好”的形式,你可以尝试放大到任意数字,随机示例:

    我希望x 成为-3

    scale = -3 / vec_normalized.x;
    vec2 = [vec_normalized.x * scale, vec_normalized.y * scale, vec_normalized.z * scale];
    

    结果:

    scale = 6.70819787
    vec2 = [-3, -6, 0]
    

    但请注意不要选择0 的组件,因为那样会产生scale = infinity

    【讨论】:

      猜你喜欢
      • 2011-06-08
      • 2020-03-01
      • 2013-08-21
      • 2016-05-13
      • 2018-06-06
      • 1970-01-01
      • 2021-06-13
      • 2020-04-06
      • 2010-11-16
      相关资源
      最近更新 更多