То, что я пытаюсь сделать, похоже, должно быть достаточно простым: я создал двухмерный вид сверху на старый фонограф.Я хочу повернуть его (отложить) по оси X, а затем повернуть вокруг оси Z.
Я прочитал здесь все вопросы, в которых есть CATransform3D, я прочитал Стива Бейкера «Матрицы могут быть вашими друзьями» статья, а также книга Билла Дадни «Базовая анимация для Mac OS X и iPhone», я думаю, «3-D вращение Брэда Ларсона без трекбола» имеетвсе правильно, но так как он позволяет пользователю регулировать все три оси, мне трудно сжать его код в то, что я воспринимаю как одно измерение (повернутая ось 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?Я видел вопрос / ответ, в котором говорилось о комбинировании преобразований, но это было преобразование масштаба, за которым следовало преобразование вращения.Я возился с преобразованием преобразования, но не делаю то, что, как я думаю, должен получить (т.е. передача результата одного преобразования в аргумент преобразования следующего, казалось, просто выполняет одно полностью, а затем анимирует другое).