Странное поведение при перемещении и вращении по одной оси - PullRequest
1 голос
/ 08 октября 2019

Я пытаюсь повернуть объект в OpenGL ES вокруг его центра. Когда я использую Matrix.translateM () на той же оси, что и Matrix.setRotatem (), он меняет центр моего объекта на 0 на этой оси. Когда я пытаюсь выполнить операцию ниже:

Matrix.translateM(rotationMatrix, OFFSET, 0, 1, 0);
Matrix.setRotateM(rotationMatrix, OFFSET, 90, 0, 1, 0);
Matrix.translateM(rotationMatrix, OFFSET, 0, -1, 0);

Тогда эффект: enter image description here

Но когда я делаю что-то вроде этого:

Matrix.translateM(rotationMatrix, OFFSET, 0, 0, 0);
Matrix.setRotateM(rotationMatrix, OFFSET, 90, 0, 1, 0);
Matrix.translateM(rotationMatrix, OFFSET, 0, 0, 0);

Эффект: enter image description here

Вторая картинка - это правильный вид. Итак, мой вопрос: почему перевод по оси Y создает этот беспорядок.

1 Ответ

0 голосов
/ 09 октября 2019

Если вы хотите повернуть объект вокруг оси, вы должны:

  • Перевести объект таким образом, чтобы точка находилась в начале координат (0,0, 0).
    Поскольку ваш объект расположен в (0, 1, 0), это означает, что объект должен быть переведен как (0, -1, 0).

  • Поворот объекта. Если объект должен вращаться в плоскости проекции на экран, то осью вращения должна быть ось z (0, 0, 1). Если объект должен вращаться вокруг вертикальной оси, то ось вращения должна быть осью z (0, 1, 0). Для вращения вокруг горизонтальной оси объект должен вращаться вокруг оси x (0, 1, 0).

  • Переведите прямоугольник таким образом, чтобы ось вернулась наего исходное положение.
    Это означает, что объект должен быть переведен как (0, 1, 0).

rotationMatrix = translate(0, 1, 0) * rotate * translate(0, -1, 0)

Вы должны использовать матрицу 1021 * операции Matrix.translateM соответственно Matrix.rotateM, которые создают новую матрицу и умножают входную матрицу на новую матрицу:

private float[] rotationMatrix = new float[16];
Matrix.setIdentityM(rotationMatrix, 0);

Matrix.translateM(rotationMatrix, 0, 0, 1, 0);
Matrix.rotateM(rotationMatrix, 0, 90, 0, 0, 1);
Matrix.translateM(rotationMatrix, 0, 0, -1, 0);

Обратите внимание, что осью вращения являются последние 3 параметра Matrix.rotateM. Вы должны установить их для своих нужд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...