最近,我一直在研究用于WebGL的一些矩阵库,以更好地理解应用于矩阵上的各种变换所需的数学知识。目前,我正在尝试更好地理解旋转变换中使用的数学知识。
具体而言,我已经了解了围绕三个轴旋转所使用的变换以及如何生成这些矩阵(如下所示)。
然而,我不明白围绕不是x、y或z轴的任意轴旋转所使用的方程式。
我当前正在阅读WebGL编程指南,在提供的库中,他们使用以下JS代码来围绕任意轴旋转(其中e
是包含4x4矩阵的数组):
len = Math.sqrt(x*x + y*y + z*z);
if (len !== 1) {
rlen = 1 / len;
x *= rlen;
y *= rlen;
z *= rlen;
}
nc = 1 - c;
xy = x * y;
yz = y * z;
zx = z * x;
xs = x * s;
ys = y * s;
zs = z * s;
e[ 0] = x*x*nc + c;
e[ 1] = xy *nc + zs;
e[ 2] = zx *nc - ys;
e[ 3] = 0;
e[ 4] = xy *nc - zs;
e[ 5] = y*y*nc + c;
e[ 6] = yz *nc + xs;
e[ 7] = 0;
e[ 8] = zx *nc + ys;
e[ 9] = yz *nc - xs;
e[10] = z*z*nc + c;
e[11] = 0;
e[12] = 0;
e[13] = 0;
e[14] = 0;
e[15] = 1;
据我所知,代码的第一部分用于规范化3D向量,但除此之外,我实在看不出它有什么意义。
例如,
nc
、xy
、yz
、zx
、xs
、ys
和zs
代表什么?另外,以x*x*nc + c
来计算e[0]
的公式是怎么得出来的?根据相关的SO帖子,我找到了一个绕任意轴旋转的矩阵如下图所示:
![enter image description here](https://istack.dev59.com/8YpGA.webp)
这个矩阵是如何生成的?我思考过如何绕任意轴旋转,但我能想到的唯一方法是将从原点延伸的3D向量分解为x、y和z三个部分,然后执行三个不同的旋转,这似乎相当低效。
使用一个矩阵来完成所有操作似乎更好,但我真的想了解那个矩阵是如何生成的。
最后,虽然我不确定,但看起来上面的矩阵似乎没有考虑轴与原点的平移。是否可以通过使用一个4x4矩阵,并在适当的位置使用Tx、Ty和Tz值来轻松处理?
谢谢。