Координаты iOS CATransform3D - PullRequest
       1

Координаты iOS CATransform3D

3 голосов
/ 04 января 2012

Был бы очень признателен за любую помощь в этом.Я применил трехмерное преобразование к виду, и мне нужно определить координаты краев визуализированного вида, чтобы я мог представить другой вид, смежный с ним (без пропуска пикселей).В частности, я хочу, чтобы ряд видов («страниц») складывался, как листовка, путем анимации угла.неудачная попытка использовать некоторые фрагменты математического кода матрицы, которые я нашел, но не смог взломать его или даже приблизиться (в зависимости от угла, хорошие 20 пикселей).Есть ли способ сделать это, не потратив 2 недели на чтение учебника по математике?

1 Ответ

5 голосов
/ 04 января 2012

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

При применении поворота на Y-оси и перспективы на вид, левый и правый края зрения движения к своей якорной точке (которая обычно центр зрения). Левый край также становится выше или короче, а правый - наоборот.

Таким образом, рамка вида (после применения преобразования) даст вам координату левого края и ширину преобразованного вида, а также верх и высоту более высокого края (который может быть левым или правым краем) , Вот мой тестовый код:

NSLog(@"frame before tilting = %@", NSStringFromCGRect(self.tiltView.frame));
float angle = 30.0;
CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;
rotationAndPerspectiveTransform.m34 = -1.0 / 2000; // Perspective
rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, 
       1 * angle / (180.0 / M_PI), 0.0f, 1.0f, 0.0f);
self.tiltView.layer.transform = rotationAndPerspectiveTransform;
NSLog(@"frame after tilting = %@", NSStringFromCGRect(self.tiltView.frame));

Вот вывод:

2012-01-04 12:44:08.405 layer[72495:f803] frame before tilting = {{50, 50}, {220, 360}}
2012-01-04 12:44:08.406 layer[72495:f803] frame after tilting = {{62.0434, 44.91}, {190.67, 370.18}}

Вы также можете получить координаты углов вида в координатном пространстве суперпредставления, используя convertPoint:fromView: или convertPoint:toView:. Тестовый код:

    CGRect bounds = self.tiltView.bounds;
    CGPoint upperLeft = bounds.origin;
    CGPoint upperRight = CGPointMake(CGRectGetMaxX(bounds), bounds.origin.y);
    CGPoint lowerLeft = CGPointMake(bounds.origin.x, CGRectGetMaxY(bounds));
    CGPoint lowerRight = CGPointMake(upperRight.x, lowerLeft.y);
#define LogPoint(P) NSLog(@"%s = %@ -> %@", #P, \
    NSStringFromCGPoint(P), \
    NSStringFromCGPoint([self.tiltView.superview convertPoint:P fromView:self.tiltView]))
    LogPoint(upperLeft);
    LogPoint(upperRight);
    LogPoint(lowerLeft);
    LogPoint(lowerRight);

Выход:

2012-01-04 13:03:00.663 layer[72635:f803] upperLeft = {0, 0} -> {62.0434, 44.91}
2012-01-04 13:03:00.663 layer[72635:f803] upperRight = {220, 0} -> {252.713, 54.8175}
2012-01-04 13:03:00.663 layer[72635:f803] lowerLeft = {0, 360} -> {62.0434, 415.09}
2012-01-04 13:03:00.663 layer[72635:f803] lowerRight = {220, 360} -> {252.713, 405.182}

Обратите внимание, что координаты Y точек upperLeft и upperRight отличаются в системе координат суперпредставления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...