У меня есть матрица преобразования 4x4, построенная следующим образом:
glm::mat4 matrix;
glm::quat orientation = toQuaternion(rotation);
matrix*= glm::mat4_cast(orientation);
matrix= glm::translate(matrix, position);
matrix= glm::scale(matrix, scale);
orientation = toQuaternion(localRotation);
matrix*= glm::mat4_cast(orientation);
matrix= glm::scale(matrix, localScale);
где вращение, положение, масштаб, localRotation и localScale - все vector3. Согласно совету по множеству разных вопросов на разных форумах, должно быть в состоянии выловить локальные направления из полученной матрицы следующим образом:
right = glm::vec3(matrix[0][0], matrix[0][1], matrix[0][2]);
up = glm::vec3(matrix[1][0], matrix[1][1], matrix[1][2]);
forward = glm::vec3(matrix[2][0], matrix[2][1], matrix[2][2]);
, где все эти направления нормализованы. Затем я использую эти указания, чтобы получить матрицу вида примерно так:
glm::lookAt(position, position + forward, up);
Все это прекрасно работает, ЗА ИСКЛЮЧЕНИЕМ: когда я летаю по сцене, правый и верхний векторы абсолютно ошибочны. Направление вперед всегда именно так, как и должно быть. Когда я в 0, 0, -1 смотрю на 0,0,0, все направления верны. Но когда я смотрю в разные стороны (за исключением обратного взгляда на начало координат от 0,0, -1), право и вверх несовместимы. Они не являются векторами мира и не являются локальными векторами. Они кажутся почти случайными. Куда я иду не так? Как я могу получить согласованные локальные восходящие и локальные правые векторы из матрицы преобразования 4x4?