5

Mam warstwę o wysokości 50, a ja obracam ją wokół osi X. . . Jak mogę obliczyć wysokość podczas obrotu?CATransform3D: Oblicz wysokość po transformacji perspektywy

CATransform3D subLayerTransform = CATransform3DMakeTranslation(0, 0, 0); 
subLayerTransform.m34 = -1/1800; //How does height relate to perspective and angle? 
subLayerTransform = CATransform3DTranslate(subLayerTransform, 0, 0, 0); 
subLayerTransform = CATransform3DRotate(subLayerTransform, 45 * (M_PI/180), 1, 0, 0); 
_transitionLayer.sublayerTransform = subLayerTransform; 
+1

Jest to sin (alpha) * length + cos (alpha) * height. –

+0

Czy możesz rozwinąć? Co to jest alfa, wysokość i długość? Czy możesz uczynić wysokość przedmiotem równania? Jeśli wysokość wynosi 50, bez obrotu, jaka jest wysokość po obrocie o 45 stopni? –

+1

Jest to: new_height = sin (50) * _ transitionLayer.bounds.size.width + cos (50) * _ transitionLayer.bounds.size.height. –

Odpowiedz

3

obracać się wokół osi Y

  • y '= y * cos q - Z * sin q
  • Z' = Y * sin q + Z * cos
  • Q
  • x '= x

Wysokość to y1 - y0. Aby obliczyć nowy y1 i y0:

CGFloat y0 = 0; 
CGFloat y1 = 50; 
CGFloat z = -1800; //This relates to the m34 perspective matrix. 

y0 = y0 * cos(radians(45)) - z * sin(radians(45)); 
y1 = y1 * cos(radians(45)) - z * sin(radians(45)); 

CGFloat newHeight = y1 - y0; 
+0

Jeśli .m34 nie ma wartości 0, newHeight w rzeczywistości nie jest y1 - y0, jest nieco krótszy niż y1 - y0. Ponieważ efekt perspektywy powoduje, że wyświetlenie wysokości na ekranie jest krótsze. – lxmfly123