Часто бывает так, что вы хотите изменить матрицу с одного набора соглашений вперед / вправо / вверх на другой набор соглашений вперед / вправо / вверх. Например, ROS использует z-up, а Unreal использует y-up. Процесс работает независимо от того, нужно ли вам сделать бросок на руку.
Обратите внимание, что фраза «переключаться с правой руки на левую» неоднозначна. Есть много левых вперед / вправо / вверх соглашений. Например: вперед = z, вправо = x, вверх = y; и вперед = x, вправо = y, вверх = z. Вы действительно должны думать об этом как ", как я могу преобразовать понятие ROS вперед / вправо / вверх в понятие Unreal вперед / вправо / вверх ".
Итак, простая задача - создать матрицу, которая конвертирует между соглашениями. Давайте предположим, что мы сделали это, и теперь у нас есть
mat4x4 unrealFromRos = /* construct this by hand */;
mat4x4 rosFromUnreal = unrealFromRos.inverse();
Допустим, у ОП есть матрица из ROS, и она хочет использовать ее в Unreal. Ее исходная матрица берет вектор в стиле ROS, делает что-то с ним и испускает вектор в стиле ROS. Ей нужна матрица, которая принимает вектор в стиле Unreal, выполняет те же функции и испускает вектор в стиле Unreal. Это выглядит так:
mat4x4 turnLeft10Degrees_ROS = ...;
mat4x4 turnLeft10Degrees_Unreal = unrealFromRos * turnLeft10Degrees_ROS * rosFromUnreal;
Должно быть достаточно ясно, почему это работает. Вы берете вектор Unreal, конвертируете его в ROS-стиль, и теперь вы можете использовать матрицу в ROS-стиле. Это дает вам вектор ROS, который вы конвертируете обратно в стиль Unreal.
Ответ Геррита не совсем общий, потому что в общем случае rosFromUnreal! = UnrealFromRos. Это правда, если вы просто инвертируете одну ось, но не так, если вы делаете что-то вроде преобразования X-> Y, Y-> Z, Z-> X. Я обнаружил, что менее подвержен ошибкам всегда использовать матрицу и ее инверсию для выполнения этих условных переключений, а не пытаться писать специальные функции, которые переворачивают только нужные члены.
Этот вид матричной операции inverse(M) * X * M
часто встречается. Вы можете думать об этом как об операции «изменение базы»; Чтобы узнать больше об этом, см. https://en.wikipedia.org/wiki/Matrix_similarity.