Как удалить преобразования из матрицы - PullRequest
0 голосов
/ 29 мая 2020

У меня есть матрица преобразования, которая представляет собой комбинацию трех других матриц преобразования.

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

если когда-нибудь позже я просто хочу удалить эффект Matrix1 из transMatrix. могу я это сделать?

1 Ответ

1 голос
/ 06 июня 2020

Короче говоря, вы можете просто умножить на обратную матрицу Matrix1:

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

Порядок операций важен, если вы хотите удалить Matrix3, вам нужно вместо этого сделать transMatrix * inverse (Matrix3). Если бы это была матрица Matrix2, вам нужно было бы удалить matrix1 (или 3), а затем matrix2.

Однако инверсии матрицы следует избегать любой ценой, поскольку это очень неэффективно, и для вашего ситуацию можно избежать.

То, что вы называете Матрицей, на самом деле является просто трехмерной позой: Положение + Вращение + Размер. Предполагая, что вы используете равномерное масштабирование (Size = float) компонент mat3 вашей позы, то есть это ортогональная матрица, этот тип матриц имеет специальное свойство:

Inverse (O) = = Транспонирование (O)

Вычисление транспонирования матрицы намного проще, чем обратное, это означает, что вы можете сделать следующее, чтобы достичь тех же результатов, но намного быстрее :

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

Если вы хотите go еще больше, я рекомендую вам создать класс Pose и предоставить операторы приведения для mat4 и mat3, чтобы легко получить полную производительность.

...