За произволно завъртане на обекти е най-лесно да съхраните текущата им ориентация като трансформационна матрица и да манипулирате елементите. Обяснявам това подробно тук.
Единствената разлика е, че в този друг въпрос 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