Có cách nào để truyền từ CATransform3D sang GLKMatrix4 hay tôi luôn cần phải chuyển đổi chúng theo cách thủ công từ giá trị sang giá trị? Tôi đoán việc truyền sẽ nhanh hơn.Chuyển đổi GLKMatrix4 và CATransform3D
Trả lời
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;
Something như thế này nên làm việc:
CATransform3D t;
GLKMatrix4 t2 = *((GLKMatrix4 *)&t);
t = *((CATransform3D *)&t2);
Giả sử CATransform3d
và GLKMatrix4
có cùng thiết lập cột/hàng. (Tôi nghĩ vậy)
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
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
- 1. Áp dụng một CATransform3D ngược cho các lớp con của một CALayer đã được chuyển đổi
- 2. Tại sao phép chuyển đổi này sử dụng CATransform3D làm giảm chiều rộng của khung nhìn?
- 3. CATransform3D so với CGAffineTransform?
- 4. Lấy 'thang đo' từ CATransform3D
- 5. mối quan hệ giữa UIView.frame và CALayer.frame là gì? (cả trước và sau một CATransform3D)
- 6. ý nghĩa của m34 của CATransform3D
- 7. CMAttitude và CATransform3D có liên quan đến ma trận quay không?
- 8. iPhoneSDK tính góc quay từ CATransform3D
- 9. StringBuilder và byte chuyển đổi
- 10. Làm cách nào để lật CALayer bằng CATransform3D?
- 11. 3D Animation - CABasicAnimation và CATransform3D cho khoảng cách giữa các quan điểm
- 12. Byte và chuyển đổi char trong Java
- 13. Chuyển đổi SqlDataSource để DataTable và DataView
- 14. Phản ánh và loại chuyển đổi Python
- 15. FREETDS và ký tự UNIXODBC chuyển đổi
- 16. TFS 2012 và web.config chuyển đổi
- 17. D3 chuyển đổi tỷ lệ và dịch
- 18. GZIP chuỗi giải nén và chuyển đổi
- 19. Chuyển đổi mantissa và exponent thành đôi
- 20. Java và trường hợp chuyển đổi
- 21. chuyển đổi chuỗi kép và ngôn ngữ
- 22. Chuyển đổi giữa SQL char và C#
- 23. chuyển đổi điểm nổi và hiệu suất
- 24. Cờ bitwise và câu lệnh Chuyển đổi?
- 25. Chuyển đổi jQuery và IF hiển thị
- 26. Chuyển đổi và Generics Operated Implicit
- 27. Chuyển đổi sang và từ lịch Hindu
- 28. Moment.js và Unix Epoch chuyển đổi
- 29. Chuyển đổi và văn bản trong angular.js
- 30. Chuyển đổi hình ảnh OpenCV và thay đổi phối cảnh
làm việc như quyến rũ: D nhờ bạn đời :) – ravoorinandan