значение на 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? Все още не разбирам обяснението ти. Какво означава m34? Какво правят промените? - 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