Как определить угол поворота трехмерного объекта по жесту смахивания? - PullRequest
0 голосов
/ 07 июля 2011

Я создаю приложение OpenGL ES 2.0. Я хочу реализовать сенсорное управление, чтобы я мог вращать свой 3D-объект, пока я выполняю жесты (например, смахивание) на экране.

У меня есть функции как для вращения камеры, так и для вращения объекта. Моя проблема в том, что мне нужно знать, какие углы поворота в X и Y должны быть переданы в функцию поворота.

Если пользователь выполняет пролистывание в определенном направлении, как рассчитать углы в направлениях X и Y, чтобы их можно было передать функции вращения?

1 Ответ

2 голосов
/ 07 июля 2011

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

Iвыполните последнее в этом примере приложения OpenGL ES 2.0 , где я выполняю вращение куба в ответ на смещение пальца в X и Y. В этом случае я использую разности координат точки касания для сопоставлениянепосредственно для поворота, используя код, подобный следующему:

    GLfloat totalRotation = sqrt(xRotation*xRotation + yRotation*yRotation);

    CATransform3D temporaryMatrix = CATransform3DRotate(currentCalculatedMatrix, totalRotation * M_PI / 180.0, 
                                                        ((xRotation/totalRotation) * currentCalculatedMatrix.m12 + (yRotation/totalRotation) * currentCalculatedMatrix.m11),
                                                        ((xRotation/totalRotation) * currentCalculatedMatrix.m22 + (yRotation/totalRotation) * currentCalculatedMatrix.m21),
                                                        ((xRotation/totalRotation) * currentCalculatedMatrix.m32 + (yRotation/totalRotation) * currentCalculatedMatrix.m31));

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

CATransform3D, который я здесь использую, преобразуется в матрицу представления модели OpenGL через вспомогательную функцию и передается в мои шейдеры как матричная униформа.

Трекбол - это еще один способ справиться с этим вращением, и Билл Дадни приводит пример этого в своем примере Core Animation здесь .Вы можете поднять его реализацию трекбола и выполнить то же преобразование CATransform3D, что и в моем приложении, чтобы сгенерировать соответствующую матрицу представления модели из этого кода.

...