Применение обратного CATransform3D к подслоям уже преобразованного CALayer

Я использую преобразование CATransform3D, чтобы применить к виду эффект псевдо-трехмерной перспективы.

Я использую гироскоп в iPhone 4 для управления параметрами преобразования.

Представление, которое я преобразовываю, имеет несколько вложенных представлений:

View with subviews

Результат примерно такой:

3D transform in action

Моя следующая задача - либо предотвратить преобразование вложенных представлений при преобразовании основного представления, либо применить обратное трансформируйте так, чтобы подвиды оставались неизменными.

Моя цель - сделать так, чтобы каждое подпредставление было перпендикулярно супервизору, создавая впечатление, что они «стоят».

Код, который я использую для преобразования:

- (void)update:(NSTimer *)timer
{
    roll = [[[_manager deviceMotion] attitude] roll];
    pitch = [[[_manager deviceMotion] attitude] pitch];
    yaw = [[[_manager deviceMotion] attitude] yaw];

    CALayer *layer = [self.view layer];
    CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, -90 * M_PI / 180.0f, 0.0f, 0.0f, 1.0f); // make landscape again  
    rotationAndPerspectiveTransform.m34 = 1.0 / -500; // apply the perspective
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, roll, 1.0f, 0.0f, 0.0f);
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, yaw, 0.0f, 0.0f, 1.0f);
    [layer setTransform:rotationAndPerspectiveTransform];       
}

Я пробовал следующий код, пытаясь инвертировать преобразование, применив поворот перспективы на 90 градусов к подпредставлению вокруг оси Y:

for (UIView *subview in [self.view subviews])
{
    CALayer *sublayer = [subview layer];
//CATransform3D inverseTransformation = [sublayer transform];
CATransform3D inverseTransformation = CATransform3DIdentity;
rotationAndPerspectiveTransform.m34 = 1.0 / -500; // apply perspective
inverseTransformation = CATransform3DRotate(inverseTransformation, 90 * M_PI / 180.0f, 0.0f, 1.0f, 0.0f);
[sublayer setTransform:inverseTransformation];
}

но все это приводит к исчезновению подпредставлений. Если я попытаюсь использовать существующее преобразование из слоя с [преобразование подслоя] и применить к нему трехмерное вращение, то подвиды мерцают, но не вращаются.

Мои познания в математике Матрицы невелики, поэтому я не знаю, правильный ли это подход.

Как сделать так, чтобы вложенные представления располагались перпендикулярно супервизору?

6
задан Jasarien 9 November 2011 в 16:43
поделиться