【发布时间】:2012-08-23 22:01:50
【问题描述】:
有没有办法从 CATransform3D 转换为 GLKMatrix4,还是我总是需要手动将它们从值转换为值? 我想投射会更快。
【问题讨论】:
标签: glkit
有没有办法从 CATransform3D 转换为 GLKMatrix4,还是我总是需要手动将它们从值转换为值? 我想投射会更快。
【问题讨论】:
标签: glkit
这样的事情应该可以工作:
CATransform3D t;
GLKMatrix4 t2 = *((GLKMatrix4 *)&t);
t = *((CATransform3D *)&t2);
假设 CATransform3d 和 GLKMatrix4 具有相同的列/行设置。 (我想是的)
【讨论】:
很遗憾,目前还没有。 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;
【讨论】: