значение m34 CATransform3D

В чем смысл m34 структуры CATransform3D, я знаю только, что он может менять перспективу, но какой смысл, когда значение равно -0,001 и 0,001?


person Xiangwei Wang    schedule 07.10.2010    source источник
comment
m34 означает запись в позиции 3,4 в матрице. developer.apple.com/documentation/quartzcore/catransform3d/   -  person Koen.    schedule 21.09.2020


Ответы (2)


Полную информацию можно найти здесь. Обратите внимание, что Apple использует обратный порядок умножения для проецирования (относительно данной ссылки), поэтому все умножения матриц обратные, а все матрицы транспонированы.

Краткое описание смысла:

  • m34 = расстояние 1/z до плоскости проекции (термин 1/ez в справочной ссылке)
  • + поскольку ось z направлена ​​к зрителю, что приводит к ощущению «смотрения в зеркало» при использовании -
  • центр проекции равен (0,0,0) плюс любые переводы, которые вы настроили
person Mihai Timar    schedule 29.09.2011
comment
Что такое 1/z? Я все еще не понимаю твоего объяснения. Что означает м34? Что делают изменения? - person confile; 04.06.2015
comment
z — расстояние до вашей плоскости проекции, m43 = 1/z. Я обновил ответ, чтобы сделать этот момент немного яснее. Изменения изменяют расстояние и заставляют перспективу выглядеть по-разному на одной и той же сцене. - person Mihai Timar; 05.06.2015

Я прочитал несколько статей, включая эту: https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreAnimation_guide/AdvancedAnimationTricks/AdvancedAnimationTricks.html#//apple_ref/doc/uid/TP40004514-CH8-SW13

Мои решения здесь:

Объекты:

  • eye - расстояние от экрана до глаза
  • scale - визуальный масштаб трансформируемого объекта
  • distance - расстояние до трансформируемого объекта

Связующие формулы:

  • scale = eye / (eye + distance)
  • distance = eye * (1.0/scale - scale)
  • eye = distance / (1.0/scale - scale)

Пример вычисления z-расстояния для уменьшенного масштаба выбранного расстояния между глазами:

CATransform3D transformByScaleAndEye(CGFloat scale, CGFloat eye) {
    CATransform3D t = CATransform3DIdentity;
    t.m34 = -1.0 / eye;
    CGFloat distance = -eye*(1.0/scale - scale);
    return CATransform3DTranslate(t, 0, 0, distance);
}
person k06a    schedule 19.01.2017