¿Hay alguna manera de convertir CATransform3D a GLKMatrix4, o siempre tengo que convertirlos manualmente de valor a valor? Creo que el lanzamiento sería más rápido.Convierte GLKMatrix4 y CATransform3D
Respuesta
Lamentablemente no es el momento. Probablemente haya una llamada API oculta que Apple usa para convertir a través de CALayers y OpenGL, pero por ahora la siguiente es su mejor apuesta. Simplemente crearía una clase de utilidad que contendría esto en ella.
- (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;
}
usando algo como
CALayer *layer = [CALayer layer];
CATransform3D transform = layer.transform;
GLKMatrix4 matrix4 = *(GLKMatrix4 *)&transform;
Se llama tipo de juegos de palabras. A menos que comprenda cómo funciona esto, no debería usarlo. No puede escribir un juego de caracteres como CATransform3D en un GLKMatrix4 ya que sus estructuras de datos son diferentes en la memoria.
conexión de referencia: 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;
Algo como esto debería funcionar:
CATransform3D t;
GLKMatrix4 t2 = *((GLKMatrix4 *)&t);
t = *((CATransform3D *)&t2);
Suponiendo CATransform3d
y GLKMatrix4
tener la misma configuración de columna/fila. (Creo que sí)
En realidad esto no va a funcionar. Lo probé y, aunque compila, hay un problema básico. CATransform3d es una matriz de tipos CFFloat, que son dobles, y GLKMatrix4 es una matriz de GLfloat, que es flotante. Ningún yeso arreglará la incompatibilidad de tamaño. – Matt
Por favor, no promueva este proceso de pensamiento. Las dos estructuras son completamente diferentes en la memoria. Puede probar esta teoría y realizar un GLKMatrix3MultiplyVector3 o similar (o incluso imprimir los valores recuperados) y encontrará inmediatamente que no se manejan igual en la memoria y le proporcionará resultados radicalmente diferentes. – TheCodingArt
- 1. entendimiento CATransform3D
- 2. CATransform3D vs. CGAffineTransform?
- 3. CATransform3D a CGAffineTransform
- 4. ¿Están relacionados CMAttitude y CATransform3D por matrices rotacionales?
- 5. Obtener la 'balanza' de un CATransform3D
- 6. Devuelve CATransform3D para mapear cuadrilátero a cuadrilátero
- 7. iPhoneSDK calcular Ángulo de rotación de CATransform3D
- 8. Transición de Origami usando perspectiva CATransform3D
- 9. PHP convierte decimal a fracción y viceversa?
- 10. Convierte long to two int y viceversa
- 11. C# convierte entero a hexadecimal y viceversa
- 12. Convierte de UniqueIdentifier a BigInt y Atrás?
- 13. rotar CATransform3D hace que la mitad de la imagen desaparezca
- 14. ¿Cuál es la relación entre un UIView.frame y CALayer.frame? (tanto antes como después de un CATransform3D)
- 15. Convierte cadena en CLLocationCoordinate2D
- 16. TimeZoneInfo.ConvertTime no convierte nada
- 17. Convierte System.Drawing.Image a System.Windows.Controls.Image?
- 18. Convierte latin1 a UTF8
- 19. Convierte int64_t en time_duration
- 20. Convierte wchar_t en int
- 21. Mysql se convierte en '?
- 22. Convierte null en cadena
- 23. Convierte PrintStream a PrintWriter
- 24. Convierte cadena a datetime
- 25. ¿Convierte NSString a NSInteger?
- 26. Convierte hash.digest() en unicode
- 27. Convierte XDocument a Stream
- 28. number_to_currency localidad que convierte
- 29. Convierte BSTR a char *
- 30. Convierte Char a Int
trabajado como encanto: D gracias amigo :) – ravoorinandan