什么glm :: normalize呢?

Cso*_*oki 1 math 3d linear-algebra glm-math

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

animatedJoint.m_Orient = glm::normalize(animatedJoint.m_Orient);
Run Code Online (Sandbox Code Playgroud)

其中animatedJoint.m_Orientvec4.它有什么作用?

leg*_*s2k 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);
}
Run Code Online (Sandbox Code Playgroud)

单位向量的较旧术语是方向余弦.假设矢量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)
Run Code Online (Sandbox Code Playgroud)

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

length of v = ?(3² + 4²) = 5
u = <3/5, 4/5>
Run Code Online (Sandbox Code Playgroud)

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


Rob*_*b I 6

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


小智 6

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