我试图从C++源代码用Java编写一个MD5加载程序,但我找不到这一行在做什么:
animatedJoint.m_Orient = glm::normalize(animatedJoint.m_Orient);
其中CCD_ 1是CCD_。它做什么?
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/hip=3/5,如果我们知道α,我们就会得到同样的结果。Y分量(沿着基j)也是如此,它只是cosβ,其中β相对于Y轴,或者如果你想相对于X轴测量它,那么它将是90-β,它只是α,这就是为什么我们有v=<cos α, sin α>
,单位圆上一点的横坐标和纵坐标,从原点到长度(半径)为1的圆上的点的矢量。
规范化向量,即缩放其元素,使返回的向量长度为1。许多与图形相关的函数都需要对传递的向量进行规范化。
它通过获取向量的法线并将其复制回向量本身来规范animatedJoint.m_Orient
向量。glm::normalize()
方法不会修改传递给它的对象。
你可以在这里阅读更多关于这个库的信息(并找到答案):
- 主页:http://glm.g-truc.net/
- 手册:https://glm.g-truc.net/0.9.3/glm-0.9.3.pdf
- 方法API说明:https://glm.g-truc.net/0.9.2/api/index.html
它将帮助你了解这个库是什么以及它是如何工作的。