2012-08-29 85 views

回答

9

不幸的是,現在還沒有。 Apple最有可能通過隱藏的API調用通過CALayers和OpenGL進行轉換,但現在下面是您最好的選擇。我只想創建一個實用類來包含它。

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

使用類似

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

這叫雙關類型。除非你明白這是如何工作的,否則你不應該使用它。由於數據結構在內存中不同,因此不能將CATransform3D雙擊到GLKMatrix4。

參考鏈接: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

像魅力一樣工作:D感謝隊友:) – ravoorinandan

-1

像這樣的東西應該工作:

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

假設CATransform3dGLKMatrix4具有相同的列/行設置。 (我這麼認爲)

+5

其實這是不行的。我試了一下,儘管它編譯了一個基本問題。 CATransform3d是CFFloat類型的矩陣,它是雙精度的,而GLKMatrix4是GLfloat的矩陣,它是float。沒有演員會解決尺寸不兼容的問題。 – Matt

+0

請不要提倡這個思維過程。這兩種結構在內存上完全不同。你可以測試這個理論,並執行一個GLKMatrix3MultiplyVector3等(甚至可以打印出檢索到的值),你會立即發現它們在內存中的處理方式不同,並會給你提供截然不同的結果。 – TheCodingArt