Найти матрицу вращения в OpenGL - PullRequest
1 голос
/ 05 августа 2020

Отнеситесь к этому с недоверием, я практически не разбираюсь в линейной алгебре. Тем не менее, моя проблема заключается в матрице вращения, которую я несколько раз умножил на мою текущую матрицу. По сути, я пытаюсь получить исходную матрицу перед преобразованием (правильная терминология?). Так что теоретически я должен иметь возможность «отменить» матрицу вращения. Я слышал о транспонировании матрицы, к которой применялась матрица вращения, однако я даже не знаю, как мне это получить. Каждый метод, который я теоретизировал о том, как это сделать, в конечном итоге приводит к необходимости знать, какой была исходная матрица до того, как к ней применялась матрица вращения (или какой-то способ узнать). Есть ли способ сделать это в OpenGL и / или математически?

Заранее спасибо. С уважением.

1 Ответ

1 голос
/ 05 августа 2020

Поговорив с Майком еще немного, я определил, что у него есть глубинные проблемы, которые сначала необходимо решить, прежде чем пытаться их решить. Похоже, что он использует устаревший OpenGL (glPush / Pop) и не имеет доступа к рассматриваемым матрицам. Я проинструктировал его изучить современный opengl, а затем вернуться к этой c топи позже.

Однако я обнаружил, что вы действительно можете извлечь поворот из матрицы преобразования RTS. В OpenTK, который он использует, это делается с помощью ExtractRotation () Matrix4, что дает вам четверть. Затем вы используете функцию ToEulerAngles () Quaternion, чтобы получить Vector3, который символизирует вращение в радианах. Последний шаг - преобразовать эти радианы в градусы, используя что-то вроде этого:

        /// <summary>
        /// Converts radians to degrees.
        /// </summary>
        /// <param name="radians">The angle in radians.</param>
        public static float ToDegrees(float radians)
        {
            return radians * 57.29578f;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="radians"></param>
        /// <returns></returns>
        public static Vector3 ToDegrees(Vector3 radians)
        {
            return new Vector3(ToDegrees(radians.X),ToDegrees(radians.Y), ToDegrees(radians.Z));
        }

И это даст вам поворот компонентов xy и z. Следует отметить еще раз, что это работает только для RTS Transformations. И, как окончательное мнение, ничего из этого не следует использовать в коде, чувствительном к производительности; вместо этого я бы посоветовал где-нибудь сохранить поворот, чтобы вы могли быстро ссылаться на него вместо того, чтобы пытаться извлечь его, и, если необходимо, синхронизируйте c и создайте матрицу преобразования на слое под ним.

...