3D вращение на 2D жесте / движении (OpenGL / Cocos3D) - PullRequest
1 голос
/ 01 марта 2012

Я использую OpenGL, а именно Cocos3d, для отображения глобуса в проекте iPhone / iPad. Я хочу, чтобы пользователь мог вращать шар пальцем. Вращение вокруг только одной оси работает нормально, но я не знаю, как решить 3 оси "все вместе ...

Захват движения пальца также работает -> Я получаю 2D (x / y) значения, но как мне преобразовать их в 3D вращение?

Ответы [ 2 ]

2 голосов
/ 01 марта 2012

Представьте, что в центре окна находится 3d-сфера (не эллипс), которая касается краев окна.Он расположен в пространстве экрана, а не в мировом пространстве.«Пространство экрана» означает, что если ваше окно имеет размер 640x480, то сфера находится в x = 320, y = 240 и имеет радиус 240 (min(width,height)/2), независимо от вашей модели просмотра / матрицы проекции.

Когдапользователь нажимает кнопку мыши, выбирает точку на сфере.Если щелчок находится за пределами этой сферы, начальная точка перемещается в границу сферы.Давайте назовем эту точку pointA.Когда пользователь перетаскивает мышь, положение мыши указывает, где пользователь хочет, чтобы эта начальная точка была.Давайте назовем это pointB.

Теперь для сферы довольно легко вычислить 3-ю координату с учетом первых 2, так как R^2 = X^2+y^2+z^2 Таким образом, вы можете вычислить 3-ю координату для начальной точки (pointA) и 3-йкоордината текущей точки (pointB).Теперь, используя две точки, вы можете вычислить два вектора от центра сферы (O) до точки (vectorOA = pointA - O; vectorOB = pointB - O).Теперь, поскольку у вас есть два вектора, вы можете использовать их для вычисления оси вращения (используя перекрестное произведение = rotationAxis = normalize(vecOA x vecOB);) и угла поворота (используя acos на скалярное произведение нормализованных векторов = acos(dot(normalize(vecOA), normalize(vecOB))).Используя ось и угол, вы можете построить матрицу вращения в пространстве экрана, которая затем может быть преобразована в желаемое пространство и применена к объекту.

Технику обычно называют «трекбол».Он использовался в некоторых примерах в Microsoft DirectX SDK, и вы сможете найти его где-нибудь в NVidia OpenGL SDK.Поэтому, если вы не понимаете объяснения, я предлагаю взять sdk и изучить любой пример, который позволяет вращать объект с помощью мыши.

0 голосов
/ 02 марта 2012

Простой способ - просто установить вращение вокруг оси Y на компонент translationInView x для вращения и вращение вокруг оси X на компоненту translationInView y.Возможно, вам придется разделить перевод на некоторое количество, так как значения вращения указаны в радианах.Обычно я нахожу достаточным предоставление пользователю 2 степеней свободы, но если вам нужно разрешить пользователю вращаться вокруг оси z, вы можете рассмотреть возможность использования UIRotationGestureRecognizer для обработки этого случая отдельно.

CGPoint translation = [sender translationInView:self.view];
_rotationY = translation.x / 100.0f;
_rotationX = translation.y / 100.0f;
...