【发布时间】:2014-03-30 15:35:56
【问题描述】:
最近,我一直在研究一些用于 WebGL 的矩阵库,以更好地理解在矩阵上执行的各种变换的数学运算。目前,我正在尝试更好地理解用于旋转变换的数学。
具体来说,我已经了解了用于围绕三个轴旋转的变换以及如何生成这些矩阵(如下所示)。
但是,我没有得到用于围绕不是 x、y 或 z 轴的任意轴旋转的方程。
我目前正在阅读WebGL Programming Guide,在提供的库中,他们使用以下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]的?
根据related SO post,我确实找到了对以下矩阵的引用,用于绕任意轴旋转:
这似乎与上面的 JS 代码正在做的事情有关(如果不一样的话)。
这个矩阵是如何生成的?关于如何围绕任意轴旋转,我想了很多,但我唯一能想到的是将从原点延伸的 3D 矢量分解为其 x、y 和 z 分量,然后执行三个不同的旋转,这似乎效率很低。
让一个矩阵为您完成所有这些似乎是最好的,但我真的很想了解该矩阵以及它是如何生成的。
最后,虽然我不确定,但上面的矩阵似乎没有考虑轴从原点的平移。这是否可以通过简单地使用 4x4 矩阵而不是在适当位置使用 Tx、Ty 和 Tz 值来轻松处理?
谢谢。
【问题讨论】:
标签: matrix rotation webgl javascript