xyz traslacion transformaciones transformacion rotacion matriz geometricas esfericas ejes coordenadas cilindricas cartesianas math matrix flash-builder

math - traslacion - rotacion de ejes xyz



extraer rotación, valores de escala de la matriz de transformación 2d (3)

¿Cómo puedo extraer los valores de rotación, escala y traducción de la matriz de transformación 2d? Me refiero a tener una transformación 2d

matrix = [1, 0, 0, 1, 0, 0] matrix.rotate(45 / 180 * PI) matrix.scale(3, 4) matrix.translate(50, 100) matrix.rotate(30 / 180 * PI) matrix.scale(-2, 4)

ahora mi matriz tiene valores [a, b, c, d, tx, ty]

olvidemos los procesos anteriores e imaginemos que solo tenemos los valores a, b, c, d, tx, ty

¿Cómo puedo encontrar la rotación total y los valores de escala a través de a, b, c, d, tx, ty

Lo siento por mi ingles

Gracias su avance

EDITAR

Creo que debería ser una respuesta en alguna parte ...

Acabo de probar en Flash Builder (AS3) como este

var m:Matrix = new Matrix; m.rotate(.25 * Math.PI); m.scale(4, 5); m.translate(100, 50); m.rotate(.33 * Math.PI); m.scale(-3, 2.5); var shape:Shape = new Shape; shape.transform.matrix = m; trace(shape.x, shape.y, shape.scaleX, shape.scaleY, shape.rotation);

y el resultado es:

x = -23.6 y = 278.8 scaleX = 11.627334873920528 scaleY = -13.54222263865791 rotation = 65.56274134518259 (in degrees)


Me encontré con este problema hoy y encontré la solución más fácil para transformar un punto usando la matriz. De esta forma, puede extraer la traducción primero, luego la rotación y la escala.

Esto solo funciona si xey siempre tienen la misma escala (escala uniforme).

Dada tu matriz m que ha sufrido una serie de transformaciones,

var translate:Point; var rotate:Number; var scale:Number; // extract translation var p:Point = new Point(); translate = m.transformPoint(p); m.translate( -translate.x, -translate.y); // extract (uniform) scale p.x = 1.0; p.y = 0.0; p = m.transformPoint(p); scale = p.length; // and rotation rotate = Math.atan2(p.y, p.x);

¡Aquí tienes!


No todos los valores de a, b, c, d, tx, ty arrojarán una secuencia de rotación válida. Supongo que los valores anteriores son parte de una matriz de rotación homogénea de 3x3 en 2D

| a b tx | A = | c d ty | | 0 0 1 |

que transforma las coordenadas [x, y, 1] en:

[x'', y'', 1] = A * |x| |y| |z|

  • Por lo tanto, configure la traducción en [dx, dy]=[tx, ty]
  • La escala es sx = sqrt(a² + c²) y sy = sqrt(b² + d²)
  • El ángulo de rotación es t = atan(c/d) o t = atan(-b/a) ya que también deberían ser iguales.

De lo contrario, no tienes una matriz de rotación válida.

La transformación anterior se expande a:

x'' = tx + sx (x Cos θ - y Sin θ) y'' = ty + sy (x Sin θ + y Cos θ)

cuando el orden es rotación, seguido de escala y luego traducción.


Si al escalar escalaras la misma cantidad en x y en y, entonces el determinante de la matriz, es decir, ad-bc, que te dice que el multiplicador de área también te dirá el cambio lineal de escala, sería el cuadrado raíz del determinante. atan (b / a) o mejor atan2 (b, a) le diría el ángulo total por el que ha girado.

Sin embargo, como su escalado no es uniforme, generalmente no habrá una forma de condensar su serie de rotaciones y escala a una sola rotación seguida de una escalada no uniforme en xe y.