Преувеличение перспективы CATransform3DPerspective

У меня есть анимация, которую я добавляю в представление. В анимации у меня есть ячейка, которая сворачивается, как будто ее сворачивают. Я разделяю вид на два отдельных слоя и применяю поворот к каждому слою. Это работает, однако эффект более тонкий, чем хотелось бы. Я ищу способ увеличить зазор между концами центральной линии (верхним и нижним краями каждого слоя) во время анимации. По сути, половинки недостаточно высоки, чтобы убедительно выглядеть так, как будто они складываются назад. Вот то, что у меня сейчас есть в середине анимации, оранжевые линии примерно там, где я хотел бы, чтобы линии попадали во время анимации:

введите здесь описание изображения

Вот код, обрабатывающий вращение:

- (CABasicAnimation *)foldLayerToValue:(CGFloat)toValue expanding:(BOOL)expanding
{
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"];
    CATransform3D rotate = CATransform3DIdentity;
    rotate.m34 = 1.0 / -2000.f;

    rotate = CATransform3DRotate(rotateAndScale, [self radiansFromDegrees:toValue], 1.f, 0.f, 0.f);

    animation.toValue = [NSValue valueWithCATransform3D:rotateAndScale];

    return animation;
}

Это добавляется в CATransaction, который также перемещает нижнюю часть вниз на правильную величину во время анимации. Я попытался добавить коэффициент масштабирования к анимации, но это повлияло на весь слой, масштабируя как верхний, так и нижний края. Я попытался увеличить высоту слоев по мере их вращения, но это также дало неприятные результаты.

Любые идеи? Есть ли способ вручную установить положение по углу за углом?

Я думаю, что часть проблемы в том, что мои опорные точки находятся на центральной линии. Во время вращения верхний и нижний края приближаются к точке обзора, а не центральная линия удаляется. Вы можете видеть, что углы немного выходят за пределы экрана, что ограничивает количество видимого эффекта. Ранее у меня была версия с опорными точками в верхней и нижней части слоев, но мне не удалось заставить два слоя оставаться «соприкасающимися» во время анимации. Я пытался добавить перевод к координате Z во время анимации, но, похоже, это ни на что не повлияло.


person Sean Kladek    schedule 21.06.2014    source источник
comment
Вы пытались изменить значение m34? Он определяет количество применяемой перспективы.   -  person guardabrazo    schedule 21.06.2014


Ответы (1)


Используемое вами значение (-1.0/2000.0) соответствует объекту, находящемуся далеко от камеры/глаза и обычно имеющему низкую перспективу. Если вы хотите что-то более перспективное, вам следует изменить его на что-то, что соответствует меньшему расстоянию до камеры. Обычно диапазон около 500-800 является «нормальным» расстоянием, поэтому вы, вероятно, ищете что-то в диапазоне 200-400.

То есть: изменить значение .m34 на -1.0/200.0 и будет больше перспективы.

person David Rönnqvist    schedule 21.06.2014
comment
Спасибо, я не понял, как значение m34 влияет на вид. Это проясняет ситуацию. - person Sean Kladek; 21.06.2014