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

Cil*_*nco 4 android opengl-es matrix

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

      0   1   2   3
    -----------------
 0  |   |   |   |   |
    -----------------
 1  |   |   |   |   |
    -----------------
 2  |   |   |   |   |
    -----------------
 3  |   |   |   |   |
    -----------------
Run Code Online (Sandbox Code Playgroud)

你能告诉我在哪里可以找到当前的rotation,position以及scale这个矩阵中的物体/相机吗?这是针对同一位置的每个矩阵吗?

Ret*_*adi 9

为了简单起见,我假设矩阵只包含旋转,平移和均匀缩放的组合.一般转换矩阵可以表示其他类型的翻译,例如:

  • 非均匀缩放.
  • 剪切变换.

旋转和缩放位于矩阵的左上角3x3部分,它们是每个方向上索引为0到3的元素.如果没有缩放,则此3x3矩阵的每个行向量的长度为1.0.如果存在缩放,则可以通过计算任何这些行向量的长度来计算缩放因子:

scalingFactor = sqrt(m00 * m00 + m01 * m01 + m02 * m02);
Run Code Online (Sandbox Code Playgroud)

然后通过将3×3子矩阵的所有元素除以缩放因子来获得旋转矩阵:

                                         [ m00 m01 m02 ]
rotationMatrix = (1.0 / scalingFactor) * [ m10 m11 m12 ]
                                         [ m20 m21 m22 ]
Run Code Online (Sandbox Code Playgroud)

翻译向量位于最后一列的前3个元素中:

                    [ m03 ]
translationVector = [ m13 ]
                    [ m23 ]
Run Code Online (Sandbox Code Playgroud)

有了这一切,请记住,OpenGL期望以列主顺序存储矩阵.所以矩阵在内存中的排列是:

m00 m10 m20 m30 m01 m11 ...
Run Code Online (Sandbox Code Playgroud)