【问题标题】:OpenGL - Matrix operationsOpenGL - 矩阵运算
【发布时间】:2013-08-18 08:07:17
【问题描述】:

假设我有 2 个矩阵:

MatrixA = translation1 * scale1 * rotation1
MatrixB = translation2 * rotation2 * translation3

MatrixA * MatrixB 等于 translation1 * scale1 * rotation1 * translation2 * rotation2 * translation3 吗?还是附近有什么?

实际上我只是想知道是否可以避免将矩阵相乘并通过仅使用 1 个矩阵然后链接数学运算来节省一些 CPU。

因为我计划制作一个基于 LibGDX 的小型自定义 2D 引擎,包括一个类似于 Android SDK 中的图形组件 API。无论如何,会有一些组件,那些在容器中的组件,当他们的父母移动时需要移动。所以我需要这些叠瓦式的算术。我知道可以使用矩阵,但由于它应该在移动设备上运行,我不希望它太慢。

【问题讨论】:

    标签: java opengl matrix 2d libgdx


    【解决方案1】:

    你确实是对的。您可以通过将它们的链相乘来避免拥有多个矩阵。但是,请记住矩阵乘法是不可交换的,这意味着更改运算顺序将导致两个不同的矩阵。例如:

    matrixTranslate * matrixRotate 将导致对象围绕一个点旋转,而:

    matrixRotate * matrixTranslate 将导致对象围绕自己的中心轴旋转。矩阵相乘的顺序没有错,但是您必须注意不同的结果。

    话虽如此,在你的问题中:

    MatrixA = translation1 * scale1 * rotation1
    MatrixB = translation2 * rotation2 * translation3
    MatrixC = MatrixA * MatrixB
    

    这是 5 个矩阵乘法运算。如果您要将它们全部链接在一起:

    MatrixC = translation1 * scale1 * rotation1 * translation2 * rotation2 * translation3
    

    您还将执行 5 次矩阵乘法运算。如您所见,实际操作没有区别。您在技术上分配了一个额外的矩阵,根据您的实现和频率,它可能会有所不同,但就数学运算而言,它是相同的。

    【讨论】:

    • 那么使用链式计算而不是直接乘以矩阵有真正的优势吗?矩阵乘法有那么慢吗?拥有这样的代码结构是否值得(我的意思是,用于移动设备上的 CPU 和内存使用)?
    • @miNde 它绝对可以节省您的操作。在上面的代码中,您总共执行了 7 次矩阵乘法,而使用链接执行了 6 次。我个人总是使用“链接”,但如果您没有看到性能下降,请不要太担心。
    • 其实我还没有通过测试进行比较。我只是想在开始使用它开发一些东西之前修复它。我不想白干活,听起来很正常:)
    • @miNde 很抱歉,我犯了一个巨大而荒谬的错误,我已经更新了答案。对于我来说回答堆栈溢出问题还为时过早;)
    • 大声笑...不用担心。我会测试一切,做一些板凳,如果你是正确的,然后接受你的答案。在问之前我应该​​自己做的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多