Кажется, что то, что я пытаюсь сделать, должно быть достаточно простым: я создал двухмерный вид сверху вниз на старой грампластинке. Я хочу повернуть его (положить обратно) по оси X, а затем повернуть вокруг оси Z.
Я прочитал здесь все вопросы, содержащие CATransform3D в теле, я прочитал " Матрицы могут быть вашими друзьями », а также книгу Билла Дадни« Базовая анимация для Mac OS X и iPhone », я думаю, " Трехмерное вращение без трекбола " имеет правильный код, но поскольку он позволяет пользователю регулировать все три оси, Мне трудно сжать его код до того, что я воспринимаю как одно измерение (повернутая ось z).
Вот изображение, с которым я тестирую, но не то, чтобы детали важны для проблемы:
Я вывожу это на экран обычным способом: (в подклассе UIView)
- (void)awakeFromNib
{
UIImage *recordImage = [UIImage imageNamed:@"3DgoldRecord"];
if (recordImage) {
recordLayer = [CALayer layer];
[recordLayer setFrame:CGRectMake(0.0, 0.0, 1024, 1024)];
[recordLayer setContents:(id)[[UIImage imageNamed:@"3DgoldRecord"] CGImage]];
[self.layer addSublayer:recordLayer];
}
}
Это первый тест, просто вывод его на экран ;-)
Затем, чтобы «положить его обратно», я применяю преобразование для поворота вокруг оси X слоя, вставляя этот код после установки содержимого слоя на изображение и перед добавлением подслоя:
CATransform3D myRotationTransform =
CATransform3DRotate(recordLayer.transform,
(M_PI_2 * 0.85), //experiment with flatness
1.0, // rotate only across the x-axis
0.0, // no y-axis transform
0.0); // no z-axis transform
recordLayer.transform = myRotationTransform;
Это сработало, как и ожидалось: пластинка неплохо откладывается.
И для следующего шага, вызывающего вращение записи, я привязал эту анимацию к событию touchesEnded, хотя после выхода из фазы тестирования / обучения это вращение не будет контролироваться пользователем:
CATransform3D currentTransform = recordLayer.transform; // to come back to at the end
CATransform3D myRotationTransform =
CATransform3DRotate(currentTransform,
1.0, // go all the way around once
(M_PI_2 * 0.85), // x-axis change
1.00, // y-axis change ?
0.0); // z-axis change ?
recordLayer.transform = myRotationTransform;
CABasicAnimation *myAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
myAnimation.duration = 5.0;
myAnimation.fromValue = [NSNumber numberWithFloat:0.0];
myAnimation.toValue = [NSNumber numberWithFloat:M_PI * 2.0];
myAnimation.delegate = self;
[recordLayer addAnimation:myAnimation forKey:@"transform.rotation"];
Так что я почти уверен, что я зациклился на векторе в вызове CATransform3DRotate (поверьте мне: я пробовал простые изменения в этом векторе, чтобы наблюдать за изменением ... то, что там сейчас указано, просто последнее изменение Я пытался). Насколько я понимаю, значения x, y и z в преобразовании, по сути, представляют собой процент от значения, переданного во время анимации, в диапазоне от fromValue до toValue.
Если я на правильном пути, понимая это, можно ли выразить это в одном преобразовании? Или я должен для каждого эффективного кадра анимации немного повернуть исходное вертикальное изображение вокруг оси z, а затем отложить результат с поворотом оси x? Я видел вопрос / ответ, в котором говорилось об объединении преобразований, но это было преобразование масштаба, за которым следовало преобразование поворота. Я напортачил с преобразованием преобразования, но не делаю того, что, по моему мнению, должен получить (т.е. передача результата одного преобразования в аргумент преобразования следующего, казалось, просто выполняла одно полностью, а затем оживляла другое).