Ява перекосил форму при повороте - PullRequest
0 голосов
/ 02 декабря 2018

Итак, у меня есть форма, и я хочу повернуть ее относительно оси y.Я уверен, что моя матрица вращения правильная, вот как выглядит матрица вращения в нашем руководстве:

enter image description here

И вот код, который я реализовал:

public static void rotate3Dy(float[] xCoords, float[] yCoords, float[] zCoords, float angle) {
    float cosine_angle = (float) Math.cos(angle);
    float sine_angle = (float) Math.sin(angle);

    for (int i = 0; i < yCoords.length; i++) {
        xCoords[i] = (xCoords[i] * cosine_angle) + (zCoords[i] * sine_angle) + 0;
        zCoords[i] = (-xCoords[i] * sine_angle) + (zCoords[i] * cosine_angle) + 0;
    }
}

Вращение формы вверх / вниз / влево / вправо само по себе выглядит хорошо, но когда я поворачиваю ее влево или вправо после вращения вверх / вниз, она начинает перекоситься.

enter image description here

Что я здесь упускаю / делаю неправильно?

1 Ответ

0 голосов
/ 02 декабря 2018

Предположительно, перекос вызван следующим недостатком вашего преобразования вращения: в цикле вашего rotate3Dy -метода вы преобразуете xCoords[i], а затем используете преобразованное значение для преобразования zCoords[i]вместо вычисления последнего со значением без преобразования , равным xCoords[i].

Попробуйте следующее: клонируйте массив xCoords перед его преобразованием, т.е. замените

    for (int i = 0; i < yCoords.length; i++) {
        xCoords[i] = (xCoords[i] * cosine_angle) + (zCoords[i] * sine_angle) + 0;
        zCoords[i] = (-xCoords[i] * sine_angle) + (zCoords[i] * cosine_angle) + 0;
    }

на

    float[] xCoordsTmp = xCoords.clone();
    for (int i = 0; i < yCoords.length; i++) {
        xCoords[i] = (xCoordsTmp[i] * cosine_angle) + (zCoords[i] * sine_angle) + 0;
        zCoords[i] = (-xCoordsTmp[i] * sine_angle) + (zCoords[i] * cosine_angle) + 0;
    }

Возможно, это решит проблему.

...