Что делать с кватернионом при смене базиса? Привет, %user%. Есть проблема, настраиваю экспорт геометрии из Unity3D в самописный движок, построенный на базе XNA/DirectX. И дело в том, что в Unity3D базис пространства (условно): vec3(1, 1, 1), а в XNADirectX — vec3(-1,1,1) (относительно Unity3D). При переносе геометрии достаточно учесть (локально для каждой модели) — newVec3 = vertexVec3 * vec3(-1, 1, 1); С трансформацией частично понятное дело, позицию и размер умножаем на vec3(-1, 1 ,1). Но трансформация и у меня и у юнити хранится в виде SRT (2 вектора на размер и на позицию и 1 кватернион). Так вот, как сменить у кватерниона базис в этом случае?
Для смены базиса у кватерниона вам нужно преобразовать его относительно нового базиса координат. Для этого можно создать матрицу поворота, которая представляет собой инвертированную матрицу перехода от старого базиса к новому. Затем умножьте кватернион на эту матрицу, чтобы преобразовать его в новый базис.
Вот пример кода на C# для преобразования кватерниона в новый базис:
Quaternion originalQuaternion = // ваш исходный кватернион Matrix4x4 basisMatrix = Matrix4x4.Scale(new Vector3(-1, 1, 1)); // матрица перехода от старого базиса к новому Matrix4x4 rotationMatrix = Matrix4x4.Rotate(originalQuaternion); // преобразуем кватернион в матрицу поворота Matrix4x4 newRotationMatrix = basisMatrix * rotationMatrix; // умножаем матрицу поворота на матрицу перехода Quaternion newQuaternion = Quaternion.FromRotationMatrix(newRotationMatrix); // получаем новый кватернион в новом базисе // используйте newQuaternion в вашем коде для трансформации объектов
Этот код предполагает, что вы используете C# и Unity3D. Примените подходящие функции и классы для вашего движка, если он отличается от Unity3D/XNA/DirectX. Также убедитесь, что матрицы и кватернионы правильно интерпретируются и используются в вашем движке для преобразования объектов.
Для смены базиса у кватерниона вам нужно преобразовать его относительно нового базиса координат. Для этого можно создать матрицу поворота, которая представляет собой инвертированную матрицу перехода от старого базиса к новому. Затем умножьте кватернион на эту матрицу, чтобы преобразовать его в новый базис.
Вот пример кода на C# для преобразования кватерниона в новый базис:
Quaternion originalQuaternion = // ваш исходный кватернионMatrix4x4 basisMatrix = Matrix4x4.Scale(new Vector3(-1, 1, 1)); // матрица перехода от старого базиса к новому
Matrix4x4 rotationMatrix = Matrix4x4.Rotate(originalQuaternion); // преобразуем кватернион в матрицу поворота
Matrix4x4 newRotationMatrix = basisMatrix * rotationMatrix; // умножаем матрицу поворота на матрицу перехода
Quaternion newQuaternion = Quaternion.FromRotationMatrix(newRotationMatrix); // получаем новый кватернион в новом базисе
// используйте newQuaternion в вашем коде для трансформации объектов
Этот код предполагает, что вы используете C# и Unity3D. Примените подходящие функции и классы для вашего движка, если он отличается от Unity3D/XNA/DirectX. Также убедитесь, что матрицы и кватернионы правильно интерпретируются и используются в вашем движке для преобразования объектов.