【问题标题】:Get position, rotation and scale from matrix in OpenGL从OpenGL中的矩阵获取位置、旋转和缩放
【发布时间】:2014-12-26 10:29:46
【问题描述】:

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

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

您能告诉我在哪里可以找到此矩阵中对象/相机的当前rotationpositionscale?这是否适用于同一位置的每个矩阵?

【问题讨论】:

    标签: android matrix opengl-es


    【解决方案1】:

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

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

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

    【讨论】:

    • "scalingFactor = sqrt(m00 * m00 + m01 * m01 + m02 * m02)" 这看起来不正确。假设一个单位矩阵 - 你通过这个计算得到 sqrt(3) 的比例因子。应该是 (m00 * m01 * m02)^ (1/3)
    【解决方案2】:

    缩放和旋转共享左上角的 3×3 子矩阵;我们将其称为 T 用于以下内容。

    要将旋转与缩放分开,请对左上角的 3×3 矩阵进行正交归一化。这是旋转部分,R。然后求解方程组

    T = R · S

    T = S · R

    取决于您是在寻找旋转前还是旋转后缩放S

    您的典型缩放矩阵是对角矩阵,因此您可以解决任何一种情况,并查看除对角线之外的哪一种情况为零。


    翻译是第 4 列。


    第 4 行是齐次坐标行,除非您正在处理透视投影矩阵(即包含透视投影的矩阵),否则应始终读取 [0 0 0 1]。



    你能告诉我在哪里可以找到对象的当前旋转、位置和比例

    这不是 OpenGL 的工作方式。 OpenGL 中没有物体,也没有相机。只有点、线和三角形被一一绘制到屏幕上。并且使用变换矩阵将它们从它们的局部空间坐标放置到屏幕空间中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多