如何从矩阵中删除转换



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

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;

操作顺序很重要,如果你想删除矩阵3,你需要使transMatrix * inverse(Matrix3(代替。如果是矩阵 2,则需要删除矩阵 1(或 3(,然后删除矩阵 2。

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

你所说的矩阵实际上只是一个3D姿势:位置+旋转+大小。 假设您使用均匀缩放(大小 = 浮点(,您的 Pose 的 mat3 分量,即是一个正交矩阵,这些类型的矩阵具有一个特殊属性:

反(O( == 转置(O(

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

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

如果您想更进一步,我建议您创建 Pose 类并为 mat4 和 mat3 提供转换运算符,以便轻松实现全部性能。

最新更新