Матричное преобразование Java

#matrix #lwjgl #transformation-matrix

Вопрос:

Я пытаюсь визуализировать четырехугольник, а затем использовать матрицу преобразования, чтобы перемещать его по дисплею. Я отследил проблему до своего метода createTransformationMatrix. Я знаю, что проблема, скорее всего, в том, как я вызываю функции из своего матричного класса. Рассматриваемый код выглядит следующим образом:

 public static Matrix4f createTransformationMatrix(Vector3f translation, float rx, float ry, float rz, float scale) {
        Matrix4f matrix = new Matrix4f();
        Matrix4f.translate(translation.x, translation.y, translation.z);
        Matrix4f.rotate((float) Math.toDegrees(rx), 1, 0, 0);
        Matrix4f.rotate((float) Math.toDegrees(ry), 0, 1, 0);
        Matrix4f.rotate((float) Math.toDegrees(rz), 0, 0, 1);
        Matrix4f.scale(scale, scale, scale);

        return matrix;
}
 

Я думаю, что проблема заключается в вызове Matrix4f для преобразований, но они статичны, поэтому я не уверен, как решить эту проблему. При необходимости функции преобразования следующие.

 public static Matrix4f translate(float x, float y, float z) {
        Matrix4f translation = new Matrix4f();

        translation.m03 = x;
        translation.m13 = y;
        translation.m23 = z;

        return translation;
}

public static Matrix4f rotate(float angle, float x, float y, float z) {
        Matrix4f rotation = new Matrix4f();

        float c = (float) Math.cos(Math.toRadians(angle));
        float s = (float) Math.sin(Math.toRadians(angle));
        Vector3f vec = new Vector3f(x, y, z);
        if (vec.length() != 1f) {
            vec = vec.normalize();
            x = vec.x;
            y = vec.y;
            z = vec.z;
        }

        rotation.m00 = x * x * (1f - c)   c;
        rotation.m10 = y * x * (1f - c)   z * s;
        rotation.m20 = x * z * (1f - c) - y * s;
        rotation.m01 = x * y * (1f - c) - z * s;
        rotation.m11 = y * y * (1f - c)   c;
        rotation.m21 = y * z * (1f - c)   x * s;
        rotation.m02 = x * z * (1f - c)   y * s;
        rotation.m12 = y * z * (1f - c) - x * s;
        rotation.m22 = z * z * (1f - c)   c;

        return rotation;
}

public static Matrix4f scale(float x, float y, float z) {
        Matrix4f scaling = new Matrix4f();

        scaling.m00 = x;
        scaling.m11 = y;
        scaling.m22 = z;

        return scaling;
}
 

Стоит отметить, что мой матричный класс был создан SilverTiger, так как я недостаточно знаком с матричной математикой и линейной алгеброй, чтобы писать такие классы.

Мы очень ценим вашу помощь.

Комментарии:

1. После некоторого тестирования я ЗНАЮ, что проблема в том, что матрица не записывается. Помощь в этом была бы отличной.

2. Это не записывается на процессор или не записывается форма в шейдере?

Ответ №1:

Вы никогда не пишете matrix в createTransformationMatrix методе. Вам нужно сохранить ссылку на матрицы перевода, поворота и масштабирования, а затем умножить их вместе. scale * rotation * translation должно дать вам правильную матрицу преобразования. Если порядок преобразования кажется «перевернутым», просто перенесите порядок умножения.