利用者:Pepribal/Notas/Matriz parent inverse
En el mismo momento de establecer una relación jerárquica entre objetos (emparentar), las coordenadas de transformación del objeto hijo permanecen sin cambio, y sin embargo el objeto no cambia sus transformaciones globales visualmente (posición, orientación o escala), aunque su 'mundo' de referencia ha cambiado desde el origen global (transformaciones cero) a las transformaciones globales del padre.
El origen de los objetos sin padre es el origen global: posición global (0,0,0), rotación cero y escala unidad. Después de ser emparentado, el nuevo origen debería ser igual al origen del padre. Y lo es. Pero se aplica una matriz de corrección al hijo para que el nuevo punto de referencia continúe siendo el origen global.
Esa matriz correctora es la parent inverse, y corrige las coordenadas de transformación del padre (posición, rotación y escala), para llevar el punto de referencia del hijo de vuelta al origen global. Sucesivas modificaciones de transformación del padre no cambiarán más esa parent inverse de ese hijo, por lo que desde el momento después del emparentado en adelante, esta matriz correctora permanecerá constante (a no ser que se cambie explícitamente). Las transformaciones que sufra el padre después del emparentado, sí afectarán al hijo; las que se produzcan antes no, gracias a la parent inverse. Debe tenerse en cuenta que la matriz correctora se aplica y pertenece a los objetos hijo, aunque su valor depende de los valores de las transformaciones del padre en el preciso instante del emparentado. También hay que tener en cuenta que si bien un objeto puede tener varios hijos, ningún objeto puede tener varios padres.
El valor exacto de la matriz parent inverse de un objeto hijo es la inversa de la matriz de transformación global del padre en el mismo momento del emparentado, y permanece inmutable para siempre, a no ser que cambiemos su valor explícitamente.
Si 'ponemos a cero' esa matriz correctora en un objeto hijo, el origen de ese objeto hijo será efectivamente la posición, orientación y escala globales del padre. Téngase en cuenta que al mismo tiempo el padre puede tener su propio padre, y por lo tanto, puede tener también una matriz correctora.
Propiedades de transformación Python del objeto
Los objetos almacenan sus coordenadas de transformación en una matriz de 4x4. Para acceder a esa matriz, puede usarse la propiedad matrix_basis. Básicamente almacena la información que encontramos en el panel Transform en la barra lateral Properties del editor 3D View. También podemos acceder a las propiedades de posición (location), rotación (rotation_axis_angle, rotation_euler o rotation_quaternion, dependiendo del valor de rotation_mode) o escala (scale).
Los objetos tienen también una propiedad que almacena la matriz correctora parent inverse. Esa propiedad es matrix_parent_inverse. Si el objeto no tiene padre o tiene esa matriz 'puesta a cero', esa matriz es igual a la matriz unidad, de tal modo que multiplicar cualquier transformación (matriz) por esta matriz unidad devolverá la primera sin cambio.
Existe, además, otra propiedad de objeto, matrix_local, que almacena el resultado de multiplicar matrix_basis por matrix_parent_inverse. Si el objeto tiene la parent inverse 'puesta a cero', entonces matrix_local es igual a matrix_basis. Esta propiedad muestra las coordenadas de transformación del objeto a partir de las transformaciones globales del padre (o a partir del origen global si no tiene padre).
Finalmente, está matrix_world, que refleja las transformaciones globales del objeto, utilizando para su cálculo la matrix_world de su padre (si lo tiene).
In resumen:
- matrix_basis = coordenadas de transformación del objeto
- matrix_parent_inverse = matriz correctora del objeto
- matrix_local = matrix_parent_inverse x matrix_basis
- matrix_world = matrix_world del padre (o origen global) x matrix_local