android - 从 OpenGL 中的矩阵获取位置、旋转和缩放

标签 android matrix opengl-es

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

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

你能告诉我在哪里可以找到这个矩阵中对象/相机的当前旋转位置比例吗?这是针对同一位置的每个矩阵吗?

最佳答案

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

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

旋转和缩放位于矩阵左上角的 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 ...

关于android - 从 OpenGL 中的矩阵获取位置、旋转和缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27655885/

相关文章:

android - Gradle错误: “Failed to apply plugin [id ‘myappid’]”

android - 屏幕锁定时打开/显示 Activity ?

android - 在下拉微调器上使用自定义项填充 arrayadapter

android - Android 上的 HttpClient 4.3.3

python - 当符号是标量时,抑制 sympy 输出中符号的转置

c++ - 使用 VBO 时 glVertexAttribPointer 的最后两个参数

r - 将一个列表中的矩阵合并到 R 中另一个列表中的矩阵上

c# - 如何转置矩阵?

opengl-es - OpenGL ES 2.0 中的纹理点?

iphone - glDrawArrays 上的 OpenGL ES EXC_BAD_ACCESS