2012-06-25 2 views
2

Я хочу задать вопрос о перспективе, которая достигнута через CATransform3D. Я знаю, что если у вас есть мнение, что это 320х480, а затем применить это:Применение перспективы, которая всегда относится к экрану

CATransform3D perspective = CATransform3DIdentity; 
    CGFloat zDistance = 1000; 
    perspective.m34 = 1.0/-zDistance; 
    view.layer.sublayerTransform = perspective; 

создать перспективу, которая делает его похожим наблюдатель смотрит прямо в центре экрана и, следовательно, один и то же преобразование выглядит разные, в зависимости от того, где преобразование подсмотра находится на экране. Например, наклоняя вид выглядит так, когда представление находится в центре экрана:

И это выглядит так, если он находится в нижнем левом углу:

Теперь моя проблема заключается в том, что создание перспективы относительно экрана работает только в том случае, если преобразование, рассматриваемое мной, является подзапросом другого представления размером 320x480 пикселей. Но что, если представление, которое я хочу преобразовать, является подвидью представления, которое является только 100x100px? Есть ли способ сделать перспективу относительно всего экрана, если супервизор не является размером экрана? Заранее спасибо

ответ

0

Согласно apple

«Свойство anchorPoint является CGPoint, который определяет местоположение в пределах слоя, который соответствует позиции координат. Точка привязки определяет, как границы расположены относительно свойство position, а также служит точкой, в которой применяются преобразования.

Ваша перспектива не должна относиться к центру экрана или даже к центру вашего слоя по умолчанию, это то, где у вас есть якорная точка? Помимо этого, вы, кажется, спрашиваете, как сделать вашу перспективу похожей на другую точку. Фокус в том, что ваша перспектива создается путем умножения на вашу перспективную матрицу. Установка m34 на небольшое число не делает ничего волшебного, вы умножаетесь на матрицу проекции.

YourProjection = {1,0,0    ,0, 
        0,1,0    ,0, 
        0,0,1    ,0, 
        0,0,-1.0/zdistance,1}; 

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

float x = your coordinates relative to the screen center; 
float y = same thing 
TranslationMatrix = {1,0,0,0, 
        0,1,0,0, 
        0,0,1,0, 
        x,y,0,1}; 
ReverseTranslationMatrix = {1,0,0,0, 
          0,1,0,0, 
          0,0,1,0, 
          -x,-y,0,1}; 
//now just multiply them all together 
Final = ReverseTranslation*YourProjection*Translation; 

Вам нужно будет сделать матрицу математике самостоятельно, надеюсь, у вас уже есть общий столбец 4x4 основной матрицы класс, который может сделать умножение для вас, если не я предлагаю вам сделать один. Кроме того, если вас это интересует, вы можете рассмотреть возможность чтения. This для объяснения того, как работает матрица, которую вы используете в настоящее время, или This для другого приема проекционных матриц.

Смежные вопросы