Math glm::normalize做什么? 我试图用C++源编写java中的MD5加载器,但我不能找到这个行是做什么的:< /P> animatedJoint.m_Orient = glm::normalize(animatedJoint.m_Orient);

Math glm::normalize做什么? 我试图用C++源编写java中的MD5加载器,但我不能找到这个行是做什么的:< /P> animatedJoint.m_Orient = glm::normalize(animatedJoint.m_Orient);,math,3d,linear-algebra,glm-math,Math,3d,Linear Algebra,Glm Math,其中animatedJoint.m_Orient是vec4。它是做什么的?它通过取向量的法线并将其复制回向量本身来规范化animatedJoint.m_Orient向量。glm::normalize()方法不会修改传递给它的对象。规范化向量,即缩放其元素,使返回的向量长度为1。 许多与图形相关的函数需要对传递的向量进行规范化。您可以在此处阅读有关此库的更多信息(并找到答案): 主页: 手册: 方法API说明: 它将帮助您了解这个库是什么以及它是如何工作的 glm::normalize做什么

其中
animatedJoint.m_Orient
vec4
。它是做什么的?

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

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

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

  • 主页:
  • 手册:
  • 方法API说明:
它将帮助您了解这个库是什么以及它是如何工作的

glm::normalize做什么

简短回答:它将向量标准化,即设置为1

细节 标准化向量通常仅用于表示纯方向,而不考虑大小(设置为1;因此其另一个更常见的名称为单位向量),即向量推动的距离无关紧要,但它指向/推动的方向很重要。这也简化了计算——无论是在纸上还是在机器上(例如,点积变成纯余弦的结果,省略了长度除法,等等)

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

vec3标准化(常量vec3&v)
{
浮动长度_of_v=sqrt((v.x*v.x)+(v.y*v.y)+(v.z*v.z));
返回vec3(v.x/长度/长度/长度/长度/长度/长度/长度/长度/长度);
}
单位向量的旧术语是。假设向量v与X轴成角度α,与Y轴成角度β,与Z轴成角度γ,则其方向余弦或沿v的单位向量由
给出。当我们不知道v的分量,但知道它与主轴的角度时,这很有用

余弦函数和单位向量相关的原因将通过2D中的一个简单示例得以明确,该示例可以扩展到更高的维度。比如说向量

v = <3, 4> = 3i + 4j (3 units along X-axis and 4 units along Y-axis)
v==3i+4j(沿X轴3个单位,沿Y轴4个单位)
我们要找到沿v的单位向量u

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

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

严格来说,法向量有大小。然而,关键是大小正好等于1(你知道,给定或接受浮点舍入误差),所以在很多地方不需要考虑长度。例如,要投影到普通向量上,需要划分长度;要投射到法线上,你不需要,因为长度是1,任何除以1的东西都是它本身。@NicHartley你是对的,应该更明确一些。我想我是想区分单位法线和普通法线;后者的方向比长度有用,长度可以是1,也可以不是1,但对于更简单的公式和计算,通常为1。现在澄清:)很好!我真的没想到会有回复,哈哈。最后,它也不是非常重要——区别是相当小的。然而,在少数情况下,它确实很重要,它真的可以咬你的屁股,不知道归一化向量只是一个量级为1的法向量,所以我想我至少要在评论中澄清。