【问题标题】:What glm::normalize does?glm::normalize 做什么?
【发布时间】:2013-06-26 18:37:29
【问题描述】:

我试图从 C++ 源代码用 Java 编写一个 MD5 加载器,但我不知道这条线在做什么:

animatedJoint.m_Orient = glm::normalize(animatedJoint.m_Orient);

animatedJoint.m_Orientvec4。它有什么作用?

【问题讨论】:

    标签: math 3d linear-algebra glm-math


    【解决方案1】:

    glm::normalize 是做什么的?

    简答:它将向量归一化,即将length 设置为 1。

    详情

    归一化向量通常仅用于表示纯方向而不关心大小(设置为 1;因此它们的另一个更常见的名称 单位向量),即向量推多远没关系,但它指向/推动的方向是什么。这也简化了计算——无论是在纸上还是在机器上(例如,点积变成纯余弦的结果,省略了除法等)

    如果 v = <v.x, v.y, v.z> 某个非单位向量,即长度/大小不等于 1 的向量,那么为了得到归一化 (v),我们必须将其每个分量除以其长度。

    vec3 normalize(const vec3 &v)
    {
       float length_of_v = sqrt((v.x * v.x) + (v.y * v.y) + (v.z * v.z));
       return vec3(v.x / length_of_v, v.y / length_of_v, v.z / length_of_v);
    }
    

    单位向量的旧术语是direction cosines。假设向量 v 与 X 轴形成角度 α,与 Y 轴形成角度 β,与 Z 轴形成 γ轴然后它的方向余弦或沿 v 的单位向量由<cos α, cos β, cos γ> 给出。当我们不知道 v 的组成部分,只知道它与基轴的角度时,这很有帮助。

    cosine 函数和单位向量相关的原因将通过一个可以扩展到更高维度的 2D 简单示例来说明。说一个向量

    v = <3, 4> = 3i + 4j (3 units along X-axis and 4 units along Y-axis)
    

    我们要沿着 v 找到单位向量 u。

    length of v = √(3² + 4²) = 5
    u = <3/5, 4/5>
    

    现在 X 分量(沿基 i)3/5 只不过是沿 X 轴(相邻)的长度除以向量的长度(斜边),因为 cos α = adj/hyp = 3/5,如果我们知道 α,我们会得到相同的结果。 Y 分量(沿基础 j)也是如此,它只不过是 cos β,其中 β 是相对于 Y 轴,或者如果您想相对于 X 测量它-axis,那么它将是 90-β,它只不过是 α,这就是我们有 v = &lt;cos α, sin α&gt; 的原因,单位圆上一个点的横坐标和纵坐标,从原点到一个点的向量长度(半径)为 1 的圆。

    【讨论】:

    • 严格来说,法向量确实有大小。然而,关键是幅度正好等于 1(你知道,给定或取浮点舍入误差),因此在很多地方都不需要考虑长度。例如,投影到一个普通的向量上,你需要把长度分开;投影到法线上,你不需要,因为长度是 1,任何除以 1 的东西都是它自己。
    • @NicHartley 你是对的,应该更明确。我想我试图区分单位法线和一般法线。后者对于它的方向比它的长度有用,它可能是也可能不是 1,但对于更简单的公式和计算,通常是 1。现在澄清:)
    • 不错!没想到回复,哈哈。它最终也不是超级重要 - 差异相当小。但是,在它确实很重要的少数情况下,它真的会咬你不知道归一化向量只是幅度为 1 的法向量,所以我想我至少会在评论中澄清。
    【解决方案2】:

    规范化向量,即缩放其元素,使返回的向量长度为​​ 1。 许多与图形相关的函数都需要对传递的向量进行归一化。

    【讨论】:

      【解决方案3】:

      它通过获取向量的法线并将其复制回向量本身来规范化animatedJoint.m_Orient 向量。 glm::normalize() 方法不会修改您传递给它的对象。

      【讨论】:

        【解决方案4】:

        您可以在此处阅读有关此库的更多信息(并找到答案):

        它将帮助您了解这个库是什么以及它是如何工作的。

        【讨论】:

          猜你喜欢
          • 2020-05-29
          • 1970-01-01
          • 2019-03-05
          • 2011-01-28
          • 2013-09-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-11
          相关资源
          最近更新 更多