iPhoneSDK рассчитать угол поворота из CATransform3D - PullRequest
9 голосов
/ 25 августа 2010

Как рассчитать вращение в радианах вокруг оси Z, задав в качестве входных данных структуру CATransform3D?

В основном мне нужно наоборот CATransform3DMakeRotation.

Ответы [ 2 ]

24 голосов
/ 15 октября 2010

Это зависит от того, на какую ось вы делаете вращение.

Поворот вокруг оси z представлен как:

a  = angle in radians
x' = x*cos.a - y*sin.a
y' = x*sin.a + y*cos.a
z' = z

( cos.a  sin.a  0  0)
(-sin.a  cos.a  0  0)
( 0        0    1  0)
( 0        0    0  1)

, поэтому угол должен быть a = atan2(transform.m12, transform.m11);

Вращение вокруг оси x:

a  = angle in radians
y' = y*cos.a - z*sin.a
z' = y*sin.a + z*cos.a
x' = x

(1    0      0    0)
(0  cos.a  sin.a  0)
(0 -sin.a  cos.a  0)
(0    0     0     1)

Вращение вокруг оси y:

a  = angle in radians
z' = z*cos.a - x*sin.a
x' = z*sin.a + x*cos.a
y' = y

(cos.a  0  -sin.a   0)
(0      1    0      0)
(sin.a  0  cos.a    0)
(0      0    0      1) 
16 голосов
/ 15 марта 2012

Если преобразование прикреплено к слою, вы можете получить значение поворота следующим образом:

CGFloat angle = [(NSNumber *)[layer valueForKeyPath:@"transform.rotation.z"] floatValue];

Из документации :

Базовая анимация расширяет протокол кодирования значения ключа, позволяя получать и устанавливать общие значения матрицы CATransform3D уровня по ключевым путям. В таблице 4 описаны ключевые пути, для которых свойства transform и sublayerTransform слоя соответствуют кодированию значения ключа и его соблюдению

...