Tengo un modelo 3d (M1) formado por varios puntos. Conozco todas sus coordenadas. También tengo otro modelo (M2). M2 y M1 son el mismo, pero M2 es un modelo después de la transformación rígida. No conozco el eje ni el centro de transformación. Lo único que sé es el tipo de transformación - traslación o rotación. Así que mi pregunta es - ¿cómo puedo encontrar el centro o el eje de rotación, y el valor del ángulo?
Respuestas
¿Demasiados anuncios?El paso del cuadro original (sin imprimar) al nuevo (imprimado) es bastante sencillo: $\vec{x'} = \vec{x} + \vec{R},$ avec $\vec{R}$ siendo un vector constante de traslación.
La rotación es un poco más complicada. Hay que tener en cuenta hasta tres ángulos: uno por cada eje principal. Estas rotaciones se expresan como un producto de matrices de rotación . Los elementos de las matrices producto son los cosenos de dirección de los ejes originales y los nuevos ejes.
Se puede derivar la transformada de base T que mapea M1 a M2 (I explicó el proceso aquí ). Una vez hecho esto, puedes "leer" los vectores base y utilizar los cosenos de los ejes para determinar el ángulo.
¡! SI Si puede identificar los "mismos" puntos en los dos modelos (tal vez el mismo índice en las matrices de puntos), puede "elegir" una traslación que fije el punto de rotación. \s y hacer que compartan un eje común:
Calcular el punto medio de cada uno de los dos modelos (tal vez casco convexo para simplificar, soporte imprimado para M2): $$\overline{p}=\frac{1}{n}\sum_{k=1}^np_k, \space \overline{p}^{'}=\frac{1}{n}\sum_{k=1}^np_k^{'}$$ Ahora, $\vec T=\overline{p}^{'}-\overline{p}$ es el vector de traslación.
A continuación, aplique $-\vec T$ a $M_2$ para que también tenga punto medio $\overline{p}$ (Por lo tanto, como si se gira alrededor de $\overline{p}$ ) y denotemos $M_2^{'}$
A continuación, elija dos puntos correspondientes de los modelos ( $p_1,p_2 \in M_1, \space p^{'}_1,p^{'}_2 \in M_2^{'}$ ), y utilizarlos para construir dos vectores: $$\vec{x}=p_2-p_1, \space \vec{x}^{'}=p^{'}_2-p^{'}_1.$$
El eje de rotiación puede obtenerse mediante el producto cruzado (normalizado): $$\vec {Ro}=\frac{\vec x \times \vec{x}^{'}}{|\vec x|^2}$$ Entonces, el ángulo es justo: $$\theta_{Ro}=\arcsin(|\vec {Ro}|)$$
Todo esto corresponde a:
1. $M_1$
2. Gire por $\theta_{Ro}$ acerca de $\overline{p}$ avec $\vec {Ro}$ correspondiente al eje de rotación.
3. Traducir por $\vec T$
4. $M_2$