Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';android.opengl.matrix中setRotateM函数背后的数学是什么?_Android_Matrix_Opengl Es_Rotational Matrices_Euler Angles - Fatal编程技术网

什么';android.opengl.matrix中setRotateM函数背后的数学是什么?

什么';android.opengl.matrix中setRotateM函数背后的数学是什么?,android,matrix,opengl-es,rotational-matrices,euler-angles,Android,Matrix,Opengl Es,Rotational Matrices,Euler Angles,在android.opengl.matrix包中有一个函数,它 将Euler角度转换为旋转矩阵 实施的主要部分是: 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 + c

在android.opengl.matrix包中有一个函数,它

将Euler角度转换为旋转矩阵

实施的主要部分是:

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是一个左手系统。

问题1:右手系统使用特定旋转顺序的行或列向量,只有一个结果。所以其中一个公式是错误的。也许你包括了投影矩阵中的一些术语

问题2:它是x,y,z顺序的,因为旋转是按那个顺序进行的(或者相反)


android版本的差异可能是因为gui是一个左撇子系统。

您能详细说明一下您在哪里看到这种情况吗?我在ops代码中找不到您描述的更改。就我所见,
sx
cx
切换。从
cos(x)
sin(x)
的变化(在我看来)与交换无关?如果你指的是问题2,这些矩阵是不可交换的。[cycz,cxsz+cxczsy,sxsz-czsxsy,0]和cycz,cxsz+czsxsy,sxsz-cxczsy,0]我仍然没有看到任何只改变乘法顺序的项。它们要么相同,要么至少有一个sin已更改为cos。第一个公式来自
android.opengl.matrix
,第二个公式使用matlab符号工具箱计算。我看不出哪一个是错的,所以问题就来了。可能是因为gui中的左手系统?你能详细说明一下你在哪里看到这种情况吗?我在ops代码中找不到您描述的更改。就我所见,
sx
cx
切换。从
cos(x)
sin(x)
的变化(在我看来)与交换无关?如果你指的是问题2,这些矩阵是不可交换的。[cycz,cxsz+cxczsy,sxsz-czsxsy,0]和cycz,cxsz+czsxsy,sxsz-cxczsy,0]我仍然没有看到任何只改变乘法顺序的项。它们要么相同,要么至少有一个sin已更改为cos。第一个公式来自
android.opengl.matrix
,第二个公式使用matlab符号工具箱计算。我看不出哪一个是错的,因此产生了这个问题。可能是因为gui中的左手系统?