5

У меня есть слой с высотой 50, и я вращаю его вокруг оси x. , , Как вычислить высоту по мере продолжения вращения?CATransform3D: вычислить высоту после преобразования перспективы

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

Это грех (альфа) * ​​длина + cos (альфа) * ​​высота. –

+0

Можете ли вы уточнить? Что такое альфа, высота и длина? Можете ли вы сделать высоту предметом уравнения? Если высота равна 50, без вращения, что такое высота после поворота на 45 градусов? –

+1

Это: new_height = sin (50) * _ transitionLayer.bounds.size.width + cos (50) * _ transitionLayer.bounds.size.height. –

ответ

3

Для поворота вокруг оси у

  • у '= у * соз д - г * грешить д
  • г' = у * грешить д + г * соз д
  • x '= x

И высота y1 - y0. Поэтому для расчета новых y1 и 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

Если значение .m34 не равно 0, значение newHeight фактически не равно y1 - y0, оно немного короче y1 - y0. Поскольку эффект перспективы делает отображение высоты на экране короче. – lxmfly123