有一个setRotateM
android.opengl.matrix
包中的函数及其
Converts Euler angles to a rotation matrix.
实现的主要部分是:
rm[rmOffset + 0] = cy * cz;
rm[rmOffset + 1] = -cy * sz;
rm[rmOffset + 2] = sy;
rm[rmOffset + 3] = 0.0f;
rm[rmOffset + 4] = cxsy * cz + cx * sz;
rm[rmOffset + 5] = -cxsy * sz + cx * cz;
rm[rmOffset + 6] = -sx * cy;
rm[rmOffset + 7] = 0.0f;
rm[rmOffset + 8] = -sxsy * cz + sx * sz;
rm[rmOffset + 9] = sxsy * sz + sx * cz;
rm[rmOffset + 10] = cx * cy;
rm[rmOffset + 11] = 0.0f;
rm[rmOffset + 12] = 0.0f;
rm[rmOffset + 13] = 0.0f;
rm[rmOffset + 14] = 0.0f;
rm[rmOffset + 15] = 1.0f;
其中 cx = cos(angleOnX), sz = sin(angleOnZ) 等
这组代码将给出一个 4x4 矩阵:
[ cy*cz, cx*sz + cx*cz*sy, sx*sz - cz*sx*sy, 0]
[ -cy*sz, cx*cz - cx*sy*sz, cz*sx + sx*sy*sz, 0]
[ sy, -cy*sx, cx*cy, 0]
[ 0, 0, 0, 1]
同时,分别给定绕x、y、z轴的旋转矩阵
Rx = [ 1, 0, 0, 0]
[ 0, cx, -sx, 0]
[ 0, sx, cx, 0]
[ 0, 0, 0, 1]
Ry = [ cy, 0, sy, 0]
[ 0, 1, 0, 0]
[ -sy, 0, cy, 0]
[ 0, 0, 0, 1]
Rz = [ cz, -sz, 0, 0]
[ sz, cz, 0, 0]
[ 0, 0, 1, 0]
[ 0, 0, 0, 1]
我能找到的最相似的构图是
(Rx * Ry * Rz)^T = Rz^T * Ry^T * Rx^T =
[ cy*cz, cx*sz + cz*sx*sy, sx*sz - cx*cz*sy, 0]
[ -cy*sz, cx*cz - sx*sy*sz, cz*sx + cx*sy*sz, 0]
[ sy, -cy*sx, cx*cy, 0]
[ 0, 0, 0, 1]
在 android 的实现 R
和原始乘法 Rxyz^T
之间,
R(1,2) R(1,3) R(2,2) R(2,3)分量略有不同,其中cx
和sx
是切换。
考虑到 android.opengl.matrix
是一个应用广泛、耗时考验的包,我一定是做错了什么。
我有两个问题:
1. 这种差异是如何产生的?
2、为什么是(Rx * Ry * Rz)^T
?我想是 Rz * Ry * Rx
最佳答案
问题 1:对于特定的旋转顺序,在使用行或列向量的右手系统中只有一个结果。所以其中一个公式是错误的。也许您包含了投影矩阵中的一些项。
问题 2:它是按 x、y、z 顺序排列的,因为旋转是按该顺序(或相反)完成的。
android 版本的差异可能是由于 gui 是左手系统。
关于android - android.opengl.matrix 中 setRotateM 函数背后的数学原理是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41690397/