目前我正在学习用于Android开发的OpenGL ES。现在我处理ModelMatrix
和CameraMatrix
这一点,但我有一些问题:在OpenGL中我们总是使用4x4矩阵,我理解为什么我们这样做但我不知道这个矩阵中存储了不同的值。例如旋转和位置。我们假设我们有这个4x4矩阵:
0 1 2 3
-----------------
0 | | | | |
-----------------
1 | | | | |
-----------------
2 | | | | |
-----------------
3 | | | | |
-----------------
您能告诉我在哪里可以找到此矩阵中对象/摄像头的当前rotation
,position
和scale
吗?这是针对同一位置的每个矩阵吗?
答案 0 :(得分:8)
为了简单起见,我假设矩阵只包含旋转,平移和均匀缩放的组合。一般转换矩阵可以表示其他类型的翻译,例如:
旋转和比例位于矩阵的左上角3x3部分,它们是每个方向上索引为0到3的元素。如果没有缩放,则此3x3矩阵的每个行向量的长度为1.0。如果存在缩放,则可以通过计算任何这些行向量的长度来计算缩放因子:
scalingFactor = sqrt(m00 * m00 + m01 * m01 + m02 * m02);
然后通过将3x3子矩阵的所有元素除以缩放因子来获得旋转矩阵:
[ m00 m01 m02 ]
rotationMatrix = (1.0 / scalingFactor) * [ m10 m11 m12 ]
[ m20 m21 m22 ]
翻译向量位于最后一列的前3个元素中:
[ m03 ]
translationVector = [ m13 ]
[ m23 ]
有了这一切,请记住,OpenGL期望以列主顺序存储矩阵。所以矩阵在内存中的排列是:
m00 m10 m20 m30 m01 m11 ...
答案 1 :(得分:2)
缩放和旋转共享左上3×3子矩阵;让我们将此 T 称为以下内容。
要将旋转与缩放分开,请将左上3×3矩阵正交化。这是旋转部分, R 。然后求解方程组
T = R · S
或
T = S · R
取决于您是否正在寻找前置或后置旋转缩放 S 。
你的典型缩放矩阵是一个对角矩阵,所以你可以解决任何一种情况,并看看除了对角线之外它们中的哪一个为零。
翻译是第4栏。
第4行是同质坐标行,除非您处理透视投影矩阵(即包含透视投影的矩阵),否则应始终读取[0 0 0 1]。
您能否告诉我在哪里可以找到当前的旋转,位置和物体的比例
这不是OpenGL的工作原理。 OpenGL中没有对象也没有摄像头。只有点,线和三角形一个接一个地绘制到屏幕上。并且变换矩阵用于将它们从它们的局部空间坐标放置到屏幕空间中。