【问题标题】:How to remove transformations from a matrix如何从矩阵中删除变换
【发布时间】:2020-05-29 03:55:28
【问题描述】:

我有一个转换矩阵,它是其他三个转换矩阵的组合。

glm::mat4 Matrix1 = position * rotation * scaling;
glm::mat4 Matrix2 = position * rotation * scaling;
glm::mat4 Matrix3 = position * rotation * scaling;  
glm::mat4 transMatrix = Matrix1 * Matrix2 * Matrix3;

如果稍后我只想从 transMatrix 中移除 Matrix1 的效果。

我该怎么做?

【问题讨论】:

  • 可能是逆(Matrix1)* transMatrix
  • @Alex 谢谢您,您的回答很好,如果您想将此作为答案发布,请这样做。
  • 如果您只想提取(或重置)位置、旋转或缩放,那么可以直接查看:Understanding 4x4 homogenous transform matrices 您只需重置适当的矩阵单元

标签: c++ opengl glsl glm-math


【解决方案1】:

简而言之,您可以简单地乘以 Matrix1 的倒数:

glm::mat4 Matrix2And3 = glm::inverse(Matrix1) * transMatrix;

操作顺序很重要,如果要删除 Matrix3,则需要 make transMatrix * inverse(Matrix3) 代替。如果是 Matrix2,则需要先删除 matrix1(或 3),然后再删除 matrix2。

但是,应该不惜一切代价避免矩阵求逆,因为它的效率非常低,而且对于您的情况是可以避免的。

你所说的 Matrix 实际上只是一个 3D Pose:Position + Rotation + Size。 假设您使用统一缩放(Size = float)姿势的 mat3 组件,即是正交矩阵,这些类型的矩阵具有特殊属性:

逆向(O) == 转置(O)

计算矩阵的转置比求逆要简单得多,这意味着您可以执行以下操作来获得相同的结果,但更快

mat4 inv = (mat4)transpose((mat3)Matrix1);
inv[3] = glm::vec4(-position1, 1.0f);
mat4 Matrix2And3 = inv * transMatrix;

如果您想更进一步,我建议您创建 Pose 类并为 mat4 和 mat3 提供强制转换运算符,以轻松获得完整的性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2013-07-22
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多