矩阵 – 理解在WebGL中围绕任意轴旋转的数学运算

最近,我一直在研究一些用于WebGL的矩阵库,以便更好地理解在矩阵上执行的各种变换的数学运算.目前,我正在努力更好地理解用于旋转变换的数学.

具体来说,我已经了解了用于围绕三个轴旋转的变换以及如何生成这些矩阵(如下所示).

但是,我没有得到用于围绕不是x轴,y轴或z轴的任意轴旋转的公式.

我目前正在阅读WebGL Programming Guide,在提供的库中,他们使用以下JS围绕任意轴旋转(其中e是包含4×4矩阵的数组):

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]的?

根据related SO post,我确实找到了以下矩阵的参考,用于围绕任意轴旋转:

这似乎与上面的JS代码正在做的事情(如果不相同)有关.

这个矩阵是如何生成的?我已经考虑了很多关于如何绕任意轴旋转,但我唯一想到的就是打破从原点延伸到其x,y和z分量的3D矢量,然后执行三种不同的旋转,这似乎效率很低.

有一个矩阵为你做所有这些似乎是最好的,但我真的想要了解矩阵及其生成方式.

最后,虽然我不确定,但似乎上面的矩阵没有说明轴偏离原点的转换.这可以通过简单地使用4×4矩阵而不是在适当的位置使用Tx,Ty和Tz值来轻松处理吗?

谢谢.

最佳答案 请在此处找到数学概述:

http://paulbourke.net/geometry/rotate/

这里有一个详细的解释:

http://web.archive.org/web/20140515121518/http://inside.mines.edu:80/~gmurray/ArbitraryAxisRotation/ArbitraryAxisRotation.html

你对那个不考虑翻译的轮换矩阵是正确的.

是的,你可以通过乘以平移x旋转来创建一个旋转然后平移矩阵:

    1 0 0 t1      r11 r12 r13 0
T = 0 1 0 t2  R = r21 r22 r23 0
    0 0 1 t3      r31 r32 r33 0
    0 0 0 1       0   0   0   1

        1 0 0 t1   r11 r12 r13 0   r11 r12 r13 t1
T x R = 0 1 0 t2 x r21 r22 r23 0 = r21 r22 r23 t2
        0 0 1 t3   r31 r32 r33 0   r31 r32 r33 t3
        0 0 0 1    0   0   0   1   0   0   0   1

如果您只想围绕远离原点的任意轴(即一条线)旋转,请在第二个URL(http://web.archive.org/web/20140515121518/http://inside.mines.edu:80/~gmurray/ArbitraryAxisRotation/ArbitraryAxisRotation.html)中查找项目“6.2关于任意线的旋转的标准化矩阵”.

点赞