Я использую преобразование CATransform3D, чтобы применить псевдо 3D перспективный эффект к виду.
Я использую гироскоп в iPhone 4 для управления параметрами преобразования.
Представление, которое я трансформирую, имеет несколько подпредставлений:

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

Моя следующая задача - либо предотвратить преобразование подпредставлений при преобразовании основного вида, либо применить обратное преобразование, чтобы подпредставления оставались неизменными.
Моя цель состоит в том, чтобы каждое подпредставление было перпендикулярно суперпредставлению, создавая впечатление, что они «стоят».
Код, который я использую для преобразования:
- (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];
}
но все, что удается сделать - заставить исчезнуть подвиды. Если я попытаюсь использовать существующее преобразование из слоя с [sublayer transform]
и применить к нему 3d-вращение, тогда подпредставления мерцают, но не вращаются.
Мои знания по математике не очень велики, поэтому я не знаю, правильный ли это подход.
Как сделать так, чтобы подпредставления располагались перпендикулярно суперпредставлению?