iPhoneSDK вычисляет угол поворота с помощью CATransform3D
-
01-10-2019 - |
Вопрос
Как мне вычислить вращение в радианах вокруг оси Z, предоставив структуру CATransform3D в качестве входных данных?
в принципе, то, что мне нужно, - это наоборот CATransform3DMakeRotation
.
Решение
Это зависит от того, на какой оси вы выполняете вращение.
Вращение вокруг оси 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(преобразование.m12, преобразование.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)
Другие советы
Если преобразование прикреплено к слою, то вы можете получить значение поворота, как следует следующим образом:
CGFloat angle = [(NSNumber *)[layer valueForKeyPath:@"transform.rotation.z"] floatValue];
Из документация:
Основная анимация расширяет протокол кодирования клавишного значения для получения и настройки общих значений матрицы Catransform3D слоя через ключевые пути. В таблице 4 описаны ключевые пути, для которых преобразование слоя и свойства SublayerTransform являются кодированием ключевым значением и соблюдающим соблюдение.