在OpenGL中从矩阵获取位置、旋转和缩放

8

目前我正在学习OpenGL ES用于Android开发。现在我需要处理ModelMatrix和CameraMatrix,但是我有一些问题:在OpenGL中,我们总是使用4x4矩阵,我知道为什么要这样做,但是不知道这个矩阵中不同的值存储在哪里。例如旋转和位置。假设我们有这个4x4矩阵:

      0   1   2   3
    -----------------
 0  |   |   |   |   |
    -----------------
 1  |   |   |   |   |
    -----------------
 2  |   |   |   |   |
    -----------------
 3  |   |   |   |   |
    -----------------

您能告诉我在这个矩阵中,我如何找到物体/相机的当前 旋转角度位置缩放比例?这适用于同一位置下的所有矩阵吗?

2个回答

16
为了简单起见,我假设矩阵仅包含旋转、平移和均匀缩放组合。一般变换矩阵可以表示其他类型的变换,例如:
  • 非均匀缩放。
  • 剪切变换。
矩阵的左上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 ...

4
比例和旋转共享左上角的3x3子矩阵;让我们称其为以下的T。为了将旋转和缩放分离,正交化左上角的3x3矩阵。这是旋转部分,记作R。然后解方程组:
T = R·S

T = S·R
具体取决于您是否寻找先旋转还是后旋转的缩放S。您典型的缩放矩阵应该是一个对角线矩阵,因此您可以解决任一情况并查看除对角线外哪个值为零。
第四列是翻译。
第四行是齐次坐标行,除非您处理透视投影矩阵(即包含透视投影的矩阵),否则始终应读取[0 0 0 1]。
这不是OpenGL的工作方式。在OpenGL中没有对象和相机。只有点、线和三角形,一个接一个地绘制到屏幕上。变换矩阵用于将它们从局部空间坐标置于屏幕空间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接