【问题标题】:Convert GLKMatrix4 and CATransform3D转换 GLKMatrix4 和 CATransform3D
【发布时间】:2012-08-23 22:01:50
【问题描述】:

有没有办法从 CATransform3D 转换为 GLKMatrix4,还是我总是需要手动将它们从值转换为值? 我想投射会更快。

【问题讨论】:

    标签: glkit


    【解决方案1】:

    这样的事情应该可以工作:

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

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

    【讨论】:

    • 其实这行不通。我试过了,虽然它编译有一个基本问题。 CATransform3d 是 CFFloat 类型的矩阵,是 double 类型,GLKMatrix4 是 GLfloat 类型的矩阵,是 float。没有演员表可以解决尺寸不兼容问题。
    • 请不要宣传这种思维过程。这两种结构在内存上是完全不同的。您可以测试这个理论并执行 GLKMatrix3MultiplyVector3 或类似的操作(甚至打印出检索到的值),您会立即发现它们在内存中的处理方式不同,并且会为您提供完全不同的结果。
    【解决方案2】:

    很遗憾,目前还没有。 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-14
      • 1970-01-01
      • 1970-01-01
      • 2012-03-20
      • 2012-08-04
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      相关资源
      最近更新 更多