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