2012-08-29 20 views

Trả lời

9

Thật không may là hiện tại không có. Có nhiều khả năng một cuộc gọi API ẩn mà Apple sử dụng để chuyển đổi qua CALayers và OpenGL, nhưng hiện tại, đây là đặt cược tốt nhất của bạn. Tôi sẽ chỉ làm một lớp tiện ích có thể chứa nó trong đó.

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

Sử dụng một cái gì đó giống như

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

Được gọi là loại punning. Trừ khi bạn hiểu cách làm việc này, bạn không nên sử dụng nó. Bạn không thể gõ pun một CATransform3D vào GLKMatrix4 vì cấu trúc dữ liệu của chúng khác nhau trong bộ nhớ.

link tham khảo: 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

làm việc như quyến rũ: D nhờ bạn đời :) – ravoorinandan

-1

Something như thế này nên làm việc:

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

Giả sử CATransform3dGLKMatrix4 có cùng thiết lập cột/hàng. (Tôi nghĩ vậy)

+5

Trên thực tế điều này sẽ không làm việc. Tôi đã thử nó và mặc dù nó biên dịch có một vấn đề cơ bản. CATransform3d là ma trận của các loại CFFloat, gấp đôi, và GLKMatrix4 là ma trận của GLfloat, nổi lên. Không có phép đúc nào sẽ khắc phục sự không tương thích về kích thước. – Matt

+0

Vui lòng không quảng bá quá trình suy nghĩ này. Hai cấu trúc hoàn toàn khác nhau trong bộ nhớ. Bạn có thể kiểm tra lý thuyết này và thực hiện một GLKMatrix3MultiplyVector3 hoặc như vậy (hoặc thậm chí in ra các giá trị lấy ra) và bạn sẽ ngay lập tức thấy rằng chúng không được xử lý giống nhau trong bộ nhớ và sẽ cung cấp cho bạn kết quả hoàn toàn khác nhau. – TheCodingArt

Các vấn đề liên quan