如何从矩阵中删除变换

How to remove transformations from a matrix

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

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 的倒数:

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

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

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

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

Inverse(O) == Transpose(O)

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

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

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