Вращение в OpenGL относительно области просмотра - PullRequest
8 голосов
/ 03 мая 2010

Я пытаюсь отобразить объект в виде, который можно вращать естественным образом, перетаскивая курсор / сенсорный экран. На данный момент у меня есть X и Y вращение объекта, подобного этому

glRotatef(rotateX, 0f, 1f, 0f); // Dragging along X, so spin around Y axis
glRotatef(rotateY, 1f, 0f, 0f);

Я понимаю, почему это не делает то, что я хочу (например, если вы поворачиваете его вправо на 180 градусов, вращение вверх и вниз вращается) Я просто не могу понять, как в обоих направлениях оставаться влево-вправо и вверх-вниз относительно зрителя.

Могу предположить, что камера зафиксирована и смотрит вдоль оси Z. Есть идеи?

Ответы [ 3 ]

7 голосов
/ 03 мая 2010

Лучше всего реализовать вращение на основе Quaternion . В мире Quaternion каждый раз, когда вы вращаетесь, он будет выровнен по оси относительно указанной вами оси, без влияния предыдущих вращений. Именно поэтому он не страдает от блокировки карданного подвеса.

Я нашел эти страницы полезными для реализации кватернионов:

Удачи. Я уверен, что есть и другие решения, но это одно из самых чистых решений, которое вы можете иметь.

2 голосов
/ 13 января 2012

Решено! Добавьте xAngle и yAngle к текущей матрице.

Matrix.rotateM(matrix, 0, xAngleADD, matrix[1], matrix[5], matrix[9]);
Matrix.rotateM(matrix, 0, yAngleADD, matrix[0], matrix[4], matrix[8]);
gl.glMultMatrixf(matrix, 0);
1 голос
/ 10 сентября 2010

Я решил выложить свой класс DragControl для загрузки вместе с классом поддержки Quaternion. Если у вас есть холст OpenGL, смотрящий вдоль оси Z на какой-то объект, вам не составит труда его вставить. Это просто обычные файлы .java, а не встроенная библиотека.

DragControl обрабатывает практически все, включая взмах пальцев, поэтому вы можете отправить свой объект вращающимся движением.

http://github.com/halfninja/android-dragcontrol3d

В настройках активности:

dragControl = new DragControl();
glView.setOnTouchListener(dragControl);

При обновлении вращения объекта в цикле:

Quaternion rotation = dragControl.currentRotation();

Если вы сделаете какие-нибудь интересные изменения, я бы хотел их увидеть.

...