Преобразование CATransform3D - PullRequest
1 голос
/ 30 марта 2012

Я пытаюсь добавить перспективу к виду с помощью CATransform3D. В настоящее время вот что я получаю:

enter image description here

И вот что я хочу получить:

enter image description here

Мне трудно это делать. Я полностью потерян здесь. Вот мой код:

CATransform3D t = CATransform3DIdentity;
    t.m11 = 0.8;
    t.m21 = 0.1; 
    t.m31 = -0.1; 
    t.m41 = 0.1;
    [[viewWindow layer] setTransform:t];

Ответы [ 2 ]

2 голосов
/ 30 марта 2012

Матричный элемент .m34 отвечает за перспективу.Это не обсуждается в документации, поэтому вам придется поиграть с этим.Этот ответ немного рассказывает о том, как его использовать: https://stackoverflow.com/a/7596326/1228525

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

Числа произвольны, сделайте их такими, какими они выглядятbest:

CATransform3D t = CATransform3DIdentity;
t.m34 = .005;
parentView.layer.sublayerTransform. = t;
childview.layer.transform = CATransform3DMakeRotation(45,1,0,0); 

Перспектива будет выглядеть по-разному в зависимости от того, где находится ребенок в родительском представлении.Если ребенок находится в центре родителя, это будет выглядеть так, как будто вы смотрите на детское изображение в 3D прямо.Чем дальше от центра, тем больше он будет выглядеть, если вы смотрите под углом.

Это то, что я получил, используя приведенный выше код и центрируя дочерний вид: (по-видимому, мне не разрешенопубликовать фотографии, так как я новичок, так что вам придется увидеть ссылку) http://i.stack.imgur.com/BiYCS.png

Очень сложно сказать, что вы собираетесь, основываясь на этих фотографиях;немного больше объяснений может быть полезным, если мой ответ не тот, который вы хотите.Насколько я могу судить по картинке, нижняя не является перспективной ...

1 голос
/ 22 июля 2015

Мне удалось легко добиться нужного CATransform3D с помощью AGGeometryKit .

#import <AGGeometryKit/AGGeometryKit.h>

UIView *view = ...; // create a view

// setting anchorPoint to zero
view.layer.anchorPoint = CGPointZero;
view.layer.transform = CATransform3DMakeTranslation(-view.layer.bounds.size.width * .5, -view.layer.bounds.size.height * .5, 0);

// setting a trapezoid transform
AGKQuad quad = view.layer.quadrilateral;
quad.tl.x -= 10; // shift top left x-value with 10 pixels
view.layer.quadrilateral = quad; // the quad is converted to CATransform3D and applied
...