2012-08-29 12 views

Odpowiedz

9

Niestety, nie ma tak jak teraz. Najprawdopodobniej jest to ukryte wywołanie API, którego używa Apple do konwertowania za pomocą CALayers i OpenGL, ale na chwilę obecną jest to najlepsze rozwiązanie. Po prostu utworzę klasę narzędziową, która będzie zawierała w sobie to.

- (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; 
} 

Korzystanie coś

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

Nazywa rodzaj paronomazja. Jeśli nie rozumiesz, jak to działa, nie powinieneś go używać. Nie można wpisać polecenia CAT TRANSform3D do GLKMatrix4, ponieważ ich struktury danych są różne w pamięci.

Link referencyjny: 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

pracował jak urok: D dzięki kolego :) – ravoorinandan

-1

Coś jak to powinno działać:

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

Zakładając CATransform3d i GLKMatrix4 mają taką samą konfigurację kolumny/wiersza. (Tak mi się wydaje)

+5

Właściwie to nie będzie działać. Wypróbowałem to i, mimo że kompiluje, istnieje podstawowy problem. CATransform3d to macierz typów CFFloat, które są podwójne, a GLKMatrix4 jest macierzą GLfloat, która jest zmiennoprzecinkowa. Żadna obsada nie naprawi niezgodności rozmiarów. – Matt

+0

Nie promuj tego procesu myślowego. Te dwie struktury są zupełnie inne w pamięci. Możesz przetestować tę teorię i wykonać GLKMatrix3MultiplyVector3 lub podobną (lub nawet wydrukować pobrane wartości), a natychmiast odkryjesz, że nie są one obsługiwane w pamięci i dostarczają radykalnie różnych wyników. – TheCodingArt