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
- 1. GLKMatrix4 (i inne podobne) brakuje w swift?
- 2. Uzyskiwanie "skali" z CATransform3D
- 3. znaczenie m34 z CATransform3D
- 4. Animacja 3D - CABasicAnimation i CATransform3D dając luka między widokami
- 5. Jak animować CATransform3D za pomocą CAKeyframeAnimation?
- 6. Jak mogę odwrócić CALayer za pomocą CATransform3D?
- 7. Jak powinienem przetłumaczyć model OpenGLES do CATransform3D?
- 8. CATransform3D: Oblicz wysokość po transformacji perspektywy
- 9. jaki jest związek między UIView.frame a CALayer.frame? (zarówno przed i po CATransform3D)
- 10. Jaka jest różnica między Konwertuj i parsuj?
- 11. Konwertuj obiekt na pusty * i z powrotem?
- 12. Konwertuj RTF na i ze zwykłego tekstu
- 13. Konwertuj System.Drawing.Color na RGB i wartość heksadeci
- 14. Konwertuj dowolny rekord na ciąg i powróć?
- 15. Konwertuj i wyświetlaj obraz z tablicy bajtów
- 16. Konwertuj słownik na bajty i ponownie python?
- 17. Konwertuj między EnumSet i tablicą wartości logicznych
- 18. Konwertuj NSAttributedString na ciąg i cofnij
- 19. Konwertuj i używaj DataTable w WPF DataGrid?
- 20. Konwertuj geometrię na długą i długą
- 21. Konwertuj klasę na rozszerzenie
- 22. Konwertuj IEnumerable na DataTable
- 23. Konwertuj na wyliczenie
- 24. Konwertuj Maildir na mbox
- 25. Konwertuj obraz na XAML?
- 26. Konwertuj BytesIO na Plik
- 27. Konwertuj NSInteger na NSUInteger?
- 28. Konwertuj SVGSVGElement na ciąg
- 29. Konwertuj wielokąt na trójkąty
- 30. Konwertuj strtotime() na StrFTime()
pracował jak urok: D dzięki kolego :) – ravoorinandan