4x4 преобразование матрицы преобразования

Я пытаюсь разложить однородную матрицу преобразования координат, которая является результатом этих матриц преобразований (примененных в порядке их записи): неравномерный Масштаб -> Повернуть -> Перевести У меня нет проблем с извлечением координат перевода из полученная матрица преобразования 4x4 (первые три значения последнего столбца), но я не смог найти способ извлечь матрицы вращения и масштабирования.

Я нашел следующий алгоритм декомпозиции матрицы в сети:

  1. Вычислить коэффициенты масштабирования как величины первых трех базисных векторов (столбцов или строк) матрицы
  2. Разделите первые три базисных вектора на эти значения (нормализуя их)
  3. Верхняя левая часть матрицы 3х3 теперь представляет вращение (вы можете использовать это как есть или преобразовать его в форму кватерниона)
  4. Перевод - это четвертый базисный вектор матрицы (в однородных координатах - это будут первые три элемента, которые вас интересуют)

Вот моя реализация Java

    public void decompose(Vec3 translation, Vec4 rotationAxisAndAngle, Vec3 scale) {
            translation = this.getTranslation();
            Vec3 c0 = new Vec3(values[ 0], values[ 1], values[ 2]);
            Vec3 c1 = new Vec3(values[ 4], values[ 5], values[ 6]);
            Vec3 c2 = new Vec3(values[ 8], values[ 9], values[10]);
            scale.x = Vec3.len(c0.x, c0.y, c0.z);
            scale.y = Vec3.len(c1.x, c1.y, c1.z);
            scale.z = Vec3.len(c2.x, c2.y, c2.z);

            Matrix4 mat = new Matrix4();

            mat.values[ 0] = c0.x / scale.x;        mat.values[ 4] = c1.x / scale.y;        mat.values[ 8] = c2.x / scale.z;    mat.values[12] = 0;
            mat.values[ 1] = c0.y / scale.x;        mat.values[ 5] = c1.y / scale.y;        mat.values[ 9] = c2.y / scale.z;    mat.values[13] = 0;
            mat.values[ 2] = c0.z / scale.x;        mat.values[ 6] = c1.z / scale.y;        mat.values[10] = c2.z / scale.z;    mat.values[14] = 0;
            mat.values[ 3] = 0;                     mat.values[ 7] = 0;                     mat.values[11] = 0;                 mat.values[15] = 1;
            rotationAxisAndAngle = mat.toAxisAngle();
            System.out.println("<Transform translation=\"" + translation.x + " " + translation.y + " " + translation.z + "\">");
            System.out.println("<Transform rotation=\"" + rotationAxisAndAngle.x + " " + rotationAxisAndAngle.y + " " + rotationAxisAndAngle.z + " " + rotationAxisAndAngle.w + "\">");
            System.out.println("<Transform scale=\"" + scale.x + " " + scale.y + " " + scale.z + "\">");
        }

Но угол оси и масштабный коэффициент, который он находит, неверны.
Что с этим не так?

0 ответов

Другие вопросы по тегам