Вращение трекбола в OpenGL - PullRequest
       2

Вращение трекбола в OpenGL

5 голосов
/ 28 октября 2010

У меня проблемы с реализацией вращения трекбола в OpenGL.Когда я поворачиваю свой куб с помощью трекбола на 90 градусов вправо вдоль оси X (перетаскивая мышь слева направо на экране), а затем пытаюсь повернуть его, перетаскивая мышь сверху вниз, я ожидаю, что кубвращаться вдоль оси Y моей перспективы.Вместо этого он вращается вдоль своей оси Y после вращения, вращаясь в сторону от моей перспективы.

Может кто-то показать мне, что я могу делать неправильно?

Ответы [ 3 ]

5 голосов
/ 28 октября 2010

Похоже, вы не используете кватернионы для представления вращения. Если вы используете Google для «Arcball Graphics Gems», вы сможете найти код Кена Шумейка в Graphic Gems IV.

Или, если вам нужен только код, иди сюда .

3 голосов
/ 13 января 2011

+ 1 за советы Даниила о кватернионах и аркболе.Вы всегда должны использовать кватернионы для представления ориентации и поворота.

Еще один совет: расширение Arcball, реализованное Гэвином Беллом, делает его гораздо более интуитивным для щелчков мышью за пределами сферы вращения.Он распространяется в примерах библиотеки Glut, здесь и здесь .

Он похож на реализацию NeHe , нопереход между внутри и снаружи сферы происходит плавно.Подход Белла используется в ряде 3D-библиотек с открытым исходным кодом, в том числе:

0 голосов
/ 03 декабря 2015

Я нашел очень дешевый и грязный способ сделать это. Таким образом, матрица в OpenGL выглядит следующим образом
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15

если вы возьмете 3 вертикальных числа за вектор вращения, вы получите желаемый эффект. Например:

Если вы будете вращаться вокруг вектора (0, 4, 8), вы будете вращаться вокруг оси x.
Аналогично (1, 5, 9) будет y, (3, 6, 10) будет z.
Почему это работает? .... хорошо, когда вы берете вертикальные числа, вы сделали транспонированную копию исходной матрицы, и это дает вам некую исходную матрицу по сравнению с повернутой матрицей ..... Извините, я не математик, но это работает. Поверь мне;).

Мой пример кода на OpenGL ES:

        Matrix.rotateM(Settings.anchorMatrix, 0, rX, Settings.anchorMatrix[0], Settings.anchorMatrix[4], Settings.anchorMatrix[8]);
        Matrix.rotateM(Settings.anchorMatrix, 0, rY, Settings.anchorMatrix[1], Settings.anchorMatrix[5], Settings.anchorMatrix[9]);
        Matrix.rotateM(Settings.anchorMatrix, 0, rZ, Settings.anchorMatrix[2], Settings.anchorMatrix[6], Settings.anchorMatrix[10]);

anchorMatrix - технически моя основная матрица, которую я создал для отслеживания треков. Android OpenGL ES не позволяет мне брать текущую матрицу из конечного автомата.

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