gpt4 book ai didi

android - 为什么android.Matrix.setRotateM返回一个旋转方向与预期旋转矩阵相反的矩阵?

转载 作者:行者123 更新时间:2023-11-29 23:03:26 25 4
gpt4 key购买 nike

例如,如果我给出以下参数:

float[] rotateMatrix = identityMatrix.clone();
Matrix.setRotateM(rotateMatrix, 0, 90, 0, 0, 1);

我希望矩阵逆时针旋转 90 度,应该是:

0       -1.0     
1.0 0

但实际上返回的 rotateMatrix 是:

0       1.0    
-1.0 0

奇怪的是,渲染输出是正确的,图像逆时针(而不是顺时针)旋转了 90 度。为什么?

最佳答案

这是因为 OpenGL (ES) 矩阵是由按列主要顺序的向量指定的。

参见 android.opengl.Matrix :

Matrix math utilities. These methods operate on OpenGL ES format matrices and vectors stored in float arrays.

Matrices are 4 x 4 column-vector matrices stored in column-major order:

m[offset +  0] m[offset +  4] m[offset +  8] m[offset + 12]
m[offset + 1] m[offset + 5] m[offset + 9] m[offset + 13]
m[offset + 2] m[offset + 6] m[offset + 10] m[offset + 14]
m[offset + 3] m[offset + 7] m[offset + 11] m[offset + 15]

参见 OpenGL ES Shading Language 3.20 Specification, 5.4.2 Vector and Matrix Constructors ,第 110 页:

To initialize a matrix by specifying vectors or scalars, the components are assigned to the matrix elements in column-major order .

mat4(float, float, float, float,  // first column
float, float, float, float, // second column
float, float, float, float, // third column
float, float, float, float); // fourth column

所以一个 GLSL mat4 可以通过轴和平移的 4 个向量来设置:

mat4 m44 = mat4(
vec4( Xx, Xy, Xz, 0.0),
vec4( Yx, Xy, Yz, 0.0),
vec4( Zx Zy Zz, 0.0),
vec4( Tx, Ty, Tz, 1.0) );

绕 z 轴 (0, 0, 1) 向右(逆时针)数学旋转后,x 轴为 (0, 1, 0) 和 y 轴是 (-1, 0, 0),这导致矩阵:

 0  1  0  0   // x axis vector
-1 0 0 0 // y axis vector
0 0 1 0 // z axis vector
0 0 0 1 // translation vector

关于android - 为什么android.Matrix.setRotateM返回一个旋转方向与预期旋转矩阵相反的矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56764986/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com