转换GLKMatrix4和CATransform3D(Convert GLKMatrix4 and

2019-06-27 12:27发布

有没有办法从CATransform3D转换为GLKMatrix4,或者我总是需要手动转换他们的价值的价值? 我猜铸造会更快。

Answer 1:

不幸的是,不是现在。 目前最有可能的是苹果采用通过CALayers和OpenGL转换隐藏的API调用,但现在,以下是你最好的选择。 我只想做一个实用工具类,将包含这吧。

    - (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作为其数据结构在内存不同。

参考链接: 类型双关

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;


Answer 2:

像这样的东西应该工作:

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

假设CATransform3dGLKMatrix4具有相同的列/行设置。 (我认同)



文章来源: Convert GLKMatrix4 and CATransform3D
标签: glkit