5

CATransform3D から GLKMatrix4 にキャストする方法はありますか、または値から値に手動で変換する必要がありますか? キャストの方が早いと思います。

4

2 に答える 2

9

残念ながら今のところありません。Apple が 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 に pun と入力することはできません。

参考リンク:タイプしゃれ

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;
于 2014-05-05T18:10:09.323 に答える
-2

このようなものが動作するはずです:

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

同じ列/行の設定があると仮定CATransform3dします。GLKMatrix4(そう思います)

于 2013-03-25T21:48:38.450 に答える