2012-08-29 6 views

Respuesta

9

Lamentablemente no es el momento. Probablemente haya una llamada API oculta que Apple usa para convertir a través de CALayers y OpenGL, pero por ahora la siguiente es su mejor apuesta. Simplemente crearía una clase de utilidad que contendría esto en ella.

- (GLKMatrix4)matrixFrom3DTransformation:(CATransform3D)transform 
{ 
    GLKMatrix4 matrix = GLKMatrix4Make(transform.m11, transform.m12, transform.m13, transform.m14, 
             transform.m21, transform.m22, transform.m23, transform.m24, 
             transform.m31, transform.m32, transform.m33, transform.m34, 
             transform.m41, transform.m42, transform.m43, transform.m44); 

    return matrix; 
} 

usando algo como

CALayer *layer = [CALayer layer]; 
CATransform3D transform = layer.transform; 
GLKMatrix4 matrix4 = *(GLKMatrix4 *)&transform; 

Se llama tipo de juegos de palabras. A menos que comprenda cómo funciona esto, no debería usarlo. No puede escribir un juego de caracteres como CATransform3D en un GLKMatrix4 ya que sus estructuras de datos son diferentes en la memoria.

conexión de referencia: type punning

GLKMatrix4

union _GLKMatrix4 
    { 
     struct 
     { 
     float m00, m01, m02, m03; 
     float m10, m11, m12, m13; 
     float m20, m21, m22, m23; 
     float m30, m31, m32, m33; 
}; 
    float m[16]; 
} 
typedef union _GLKMatrix4 GLKMatrix4; 

CATransform3D

struct CATransform3D 
{ 
CGFloat m11, m12, m13, m14; 
CGFloat m21, m22, m23, m24; 
CGFloat m31, m32, m33, m34; 
CGFloat m41, m42, m43, m44; 
}; 
typedef struct CATransform3D CATransform3D; 
+0

trabajado como encanto: D gracias amigo :) – ravoorinandan

-1

Algo como esto debería funcionar:

CATransform3D t; 
GLKMatrix4 t2 = *((GLKMatrix4 *)&t); 
t = *((CATransform3D *)&t2); 

Suponiendo CATransform3d y GLKMatrix4 tener la misma configuración de columna/fila. (Creo que sí)

+5

En realidad esto no va a funcionar. Lo probé y, aunque compila, hay un problema básico. CATransform3d es una matriz de tipos CFFloat, que son dobles, y GLKMatrix4 es una matriz de GLfloat, que es flotante. Ningún yeso arreglará la incompatibilidad de tamaño. – Matt

+0

Por favor, no promueva este proceso de pensamiento. Las dos estructuras son completamente diferentes en la memoria. Puede probar esta teoría y realizar un GLKMatrix3MultiplyVector3 o similar (o incluso imprimir los valores recuperados) y encontrará inmediatamente que no se manejan igual en la memoria y le proporcionará resultados radicalmente diferentes. – TheCodingArt