Существует пара способов, с помощью которых вы можете выполнить задачу преобразования движения касания во вращение трехмерного объекта: установить трекбол или использовать масштабированные смещения пикселей для отображения на вращение.
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, что и в моем приложении, чтобы сгенерировать соответствующую матрицу представления модели из этого кода.