Czy istnieje sposób przesyłania z CATransform3D do GLKMatrix4, czy też zawsze muszę ręcznie przekonwertować je z wartości na wartość? Chyba casting byłby szybszy.Konwertuj GLKMatrix4 i CATransform3D
Odpowiedz
Niestety, nie ma tak jak teraz. Najprawdopodobniej jest to ukryte wywołanie API, którego używa Apple do konwertowania za pomocą CALayers i OpenGL, ale na chwilę obecną jest to najlepsze rozwiązanie. Po prostu utworzę klasę narzędziową, która będzie zawierała w sobie to.
- (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;
}
Korzystanie coś
CALayer *layer = [CALayer layer];
CATransform3D transform = layer.transform;
GLKMatrix4 matrix4 = *(GLKMatrix4 *)&transform;
Nazywa rodzaj paronomazja. Jeśli nie rozumiesz, jak to działa, nie powinieneś go używać. Nie można wpisać polecenia CAT TRANSform3D do GLKMatrix4, ponieważ ich struktury danych są różne w pamięci.
Link referencyjny: 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;
Coś jak to powinno działać:
CATransform3D t;
GLKMatrix4 t2 = *((GLKMatrix4 *)&t);
t = *((CATransform3D *)&t2);
Zakładając CATransform3d
i GLKMatrix4
mają taką samą konfigurację kolumny/wiersza. (Tak mi się wydaje)
Właściwie to nie będzie działać. Wypróbowałem to i, mimo że kompiluje, istnieje podstawowy problem. CATransform3d to macierz typów CFFloat, które są podwójne, a GLKMatrix4 jest macierzą GLfloat, która jest zmiennoprzecinkowa. Żadna obsada nie naprawi niezgodności rozmiarów. – Matt
Nie promuj tego procesu myślowego. Te dwie struktury są zupełnie inne w pamięci. Możesz przetestować tę teorię i wykonać GLKMatrix3MultiplyVector3 lub podobną (lub nawet wydrukować pobrane wartości), a natychmiast odkryjesz, że nie są one obsługiwane w pamięci i dostarczają radykalnie różnych wyników. – TheCodingArt
pracował jak urok: D dzięki kolego :) – ravoorinandan