从OpenGL中的矩阵获取位置,旋转和缩放

时间:2014-12-26 10:29:47

标签: android matrix opengl-es

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

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

您能告诉我在哪里可以找到此矩阵中对象/摄像头的当前rotationpositionscale吗?这是针对同一位置的每个矩阵吗?

2 个答案:

答案 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中没有对象也没有摄像头。只有点,线和三角形一个接一个地绘制到屏幕上。并且变换矩阵用于将它们从它们的局部空间坐标放置到屏幕空间中。