I trying to write an MD5 loader in Java from C++ source but I cannot find out what is this line doing:
animatedJoint.m_Orient = glm::normalize(animatedJoint.m_Orient);
where the animatedJoint.m_Orient
is vec4
. What does it do?
I trying to write an MD5 loader in Java from C++ source but I cannot find out what is this line doing:
animatedJoint.m_Orient = glm::normalize(animatedJoint.m_Orient);
where the animatedJoint.m_Orient
is vec4
. What does it do?
glm::normalize 做什么?
简短回答:它将向量归一化,即将长度设置为 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);
}
单位向量的旧术语是方向余弦。假设向量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 轴测量它,那么它会是 90-β,它只是 α,这就是为什么我们有 v = <cos α, sin α>
,单位圆上一点的横坐标和纵坐标,从原点到长度(半径)为 1 的圆上一点的向量。
归一化向量,即缩放其元素以使返回的向量长度为 1。许多与图形相关的函数需要对传递的向量进行归一化。
animatedJoint.m_Orient
它通过获取向量的法线并将其复制回向量本身来规范化向量。该glm::normalize()
方法不会修改您传递给它的对象。
您可以在此处阅读有关此库的更多信息(并找到答案):
它将帮助您了解这个库是什么以及它是如何工作的。