Es posible convertir un CATransform3D
en un CGAffineTransform
, pero perderá algunas capacidades. Me resultó útil convertir la transformación agregada de una capa y sus antecesores en un CGAffineTransform
para poder renderizarlo con Core Graphics. Las limitaciones son:
- Su entrada será tratado como plana en el plano XY
- Su salida será tratado como plana en el plano XY demasiado
será neutralizado
- Perspectiva/escorzo desde
.m34
Si eso suena bien para sus propósitos:
// m13, m23, m33, m43 are not important since the destination is a flat XY plane.
// m31, m32 are not important since they would multiply with z = 0.
// m34 is zeroed here, so that neutralizes foreshortening. We can't avoid that.
// m44 is implicitly 1 as CGAffineTransform's m33.
CATransform3D fullTransform = <your 3D transform>
CGAffineTransform affine = CGAffineTransformMake(fullTransform.m11, fullTransform.m12, fullTransform.m21, fullTransform.m22, fullTransform.m41, fullTransform.m42);
Yo Primero querrás hacer todo tu trabajo en transformaciones tridimensionales, digamos concatenando desde tus supercapas, y finalmente convertir el agregado CATransform3D
a CGAffineTransform
. Dado que las capas son planas para comenzar y renderizar sobre un objetivo plano, esto me pareció muy adecuado ya que mis rotaciones 3D se convirtieron en tijeras 2D. También encontré aceptable sacrificar el escorzo. No hay forma de evitarlo porque las transformaciones afines deben preservar las líneas paralelas.
Para hacer una capa 3D-transformado mediante núcleo de gráficos, por ejemplo, es posible concatenar las transformadas (! Respetando puntos de anclaje), a continuación, convertir a afín, y finalmente:
CGContextSaveGState(context);
CGContextConcatCTM(context, affine);
[layer renderInContext:context];
CGContextRestoreGState(context);
Por curiosidad, ¿por qué ¿le importa si estuviera aplicando un CATransform3D a una capa frente a un CGAffineTransform a una vista, si ya está obteniendo el resultado que desea de la primera? –
porque el valor inicial de self.layer.transform es diferente de self.transform, ¿o no? – Abramodj
Quiero decir, antes de llegar al método de pulso, aplico algunas transformaciones de Affine a la vista, pero no toco la capa, así que supongo que la transformación es la identidad allí – Abramodj