什么glm :: normalize呢?

时间:2013-06-26 18:37:29

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

我试图用C ++源代码编写Java中的MD5加载程序,但我不知道这行是做什么的:

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

animatedJoint.m_Orientvec4。它做了什么?

4 个答案:

答案 0 :(得分:10)

  

glm :: normalize有什么作用?

简短回答:它将矢量标准化。

详细信息

归一化向量是一个常用于表示纯方向而不打扰大小的向量(设置为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);
}

单位向量的旧术语是方向余弦。假设矢量 v 与X轴形成角度αβ与Y轴和γ与Z-形成角度轴然后它的方向余弦或 v 的单位向量由<cos α, cos β, cos γ>给出。当我们不知道 v 的组件但它与基本轴的角度时,这很有用。

余弦函数和单位向量相关的原因将在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 = <cos α, sin α>的原因,即单位圆上一个点的横坐标和纵坐标,从原点到a的矢量指向长度(半径)为1的圆圈。

答案 1 :(得分:6)

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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