traslacion transformaciones sirve rotacion que para gltranslatef glpushmatrix escalamiento objective-c cocoa-touch opengl-es core-animation

objective c - sirve - ¿Cómo convierto las transformaciones de matriz 3D OpenGL a CoreAnimation CATransform3Ds?



rotacion traslacion y escalamiento en opengl (1)

Imagine una superficie de renderizado OpenGL ES 1.1 con un CALayer transparente del mismo marco y límites directamente encima de él. Los objetos en la escena OpenGL se transforman (se traducen y giran) usando una matriz 4x4. El CALayer superpuesto transforma las subcapas con un CATransform3D ( que resulta ser una matriz 4x4, idéntica a las utilizadas para las transformaciones OpenGL ).

Las matrices OpenGL transforman los objetos de escena exactamente de la manera que me gustaría. Entonces me gustaría tomar la misma transformada de matriz utilizada en el objeto de escena y hacer que el CALayer la aplique a una subcapa de modo que la subcapa esté en la misma posición y orientación exactas que el objeto de escena.

El problema es (creo) que mi escena de OpenGL y la "escena" de CALayer no concuerdan en la definición de la "unidad de escena" arbitraria, y este desacuerdo se manifiesta como discrepancias en la traducción de la subcapa vs. la traducción del objeto de escena (las rotaciones son finas). Específicamente, el CALayer parece funcionar con el entendimiento de que una unidad de escena corresponde muy de cerca a un píxel de pantalla, mientras que mi escena OpenGL usa unidades mucho más grandes, lo que significa que el CALayer traduce solo una pequeña fracción de lo que hace un objeto de escena.

Entonces, lo que estoy buscando es una forma de convertir matemáticamente una transformación de matriz especificada en mis unidades de escena OpenGL a una transformación de matriz funcionalmente equivalente especificada en la unidad de escena CALayer. Necesito poder definir una unidad de escena CALayer en términos de mi unidad de escena OpenGL, pero no tengo idea de cómo el CALayer interactúa con OpenGL detrás de escena.

¿Es posible calcular la conversión de esa manera? Si no, ¿hay otros enfoques que pueden ayudar?

NOTA: He podido solucionar el problema con un enfoque puramente empírico que básicamente se reduce a señalar qué ajustes se deben realizar en el CATransform3D para que funcione en un par de posiciones y extrapolar. Estoy esperando algo más preciso.


Supongo que los problemas son causados ​​por la matriz de proyección de la vista OpenGL. Recuerde que la transformación de world to view es view_point = projection x modelview x world_point .