Для произвольного поворота объектов проще всего сохранить их текущую ориентацию в виде матрицы преобразования и манипулировать элементами. Я подробно объясняю это здесь.
Единственное отличие состоит в том, что в этом другом вопросе OP хотел применить вращение из двух элементов управления (горизонтального и вертикального), тогда как вам нужно вращение на основе перетаскивания. Методика в основном такая же, но вместо вращения вокруг оси X или Y вам необходимо вычислить произвольную ось вращения из дельта-вектора касания следующим образом:
axis = [0, 0, 1] ⨯ [diffX, diffY, 0]
(⨯
= "перекрестный продукт")
Затем вы поворачиваете векторы U, V и W (как описано в моем другом ответе) вокруг оси на некоторый угол, пропорциональный длине вектора дельты:
M = rotation(k * length([diffX, diffY, 0]), axis)
U = M * U
V = M * V
W = M * W
Если вы обнаружите, что объект вращается в направлении, противоположном ожидаемому, есть три возможности:
- Если неверно происходит только вертикальное вращение, вам нужно отрицать
diffY
. Это частая ошибка, которую я делаю из-за несоответствий между системами координат OpenGL и UIKit.
- Если это все вращение, вы можете либо поменять местами аргументы в перекрестном произведении, либо использовать [0, 0, -1]. Обычно это происходит из-за путаницы между левыми и правыми системами координат.
- Если это просто горизонтальное вращение, сделайте обе настройки. (Не отрицайте
diffX
, никто не использует координаты X слева направо.)
person
Marcelo Cantos
schedule
05.06.2013