2012-08-29 8 views

Antwort

9

Leider gibt es jetzt nicht. Es gibt wahrscheinlich einen versteckten API-Aufruf, den Apple verwendet, um über CALayers und OpenGL zu konvertieren, aber für den Moment ist das Beste das Beste. Ich würde nur eine Utility-Klasse machen, die das darin enthalten würde.

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

mit so etwas wie

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

Ist Typ punning genannt. Wenn Sie nicht verstehen, wie das funktioniert, sollten Sie es nicht verwenden. Sie können eine CATransform3D nicht auf eine GLKMatrix4 schreiben, da sich ihre Datenstrukturen im Speicher unterscheiden.

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

arbeitete wie Charme: D danke Kumpel :) – ravoorinandan

-1

So etwas sollte funktionieren:

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

Unter der Annahme, CATransform3d und GLKMatrix4 haben die gleiche Spalte/Zeile Setup. (Ich denke schon)

+5

Eigentlich wird dies nicht funktionieren. Ich habe es ausprobiert und obwohl es kompiliert, gibt es ein grundlegendes Problem. CATransform3d ist eine Matrix von CFFloat-Typen, die doppelt sind, und GLKMatrix4 ist eine Matrix von GLfloat, die float ist. Kein Cast wird die Größeninkompatibilität beheben. – Matt

+0

Bitte fördern Sie diesen Gedankenprozess nicht. Die zwei Strukturen sind im Gedächtnis völlig unterschiedlich. Sie können diese Theorie testen und einen GLKMatrix3MultiplyVector3 oder einen solchen durchführen (oder sogar die abgerufenen Werte ausdrucken) und Sie werden sofort feststellen, dass sie im Speicher nicht gleich behandelt werden und Ihnen völlig andere Ergebnisse liefern. – TheCodingArt

Verwandte Themen