7.19  transforms.inc (Transformaciones)

Varios macros útiles de transformación. Todos producen transformaciones, puede usarlos en cualquier parte donde se pueda escalar, rotar, etc. Las descripciones asumen que está trabajando con un objeto, pero los macros trabajan también con texturas, etc.

Shear_Trans(A, B, C). Este macro reorienta y deforma un objeto para que sus ejes originales XYZ apunten a lo largo de A, B y C, resultando en un efecto cortante cuando los vectores no son perpendiculares. También puede usar vectores de longitudes diferentes para afectar el escalado (tamaño), o utilizar vectores perpendiculares para reorientar el objeto.
Parámetros:

Matrix_Trans(A, B, C, D). Este macro provee una manera de especificar una transformación de matriz a partir de 4 vectores. Los efectos son muy similares a los del macro Shear_Trans() (anterior), pero el cuarto parámetro controla la traslación.
Parámetros:

Axial_Scale_Trans(Axis, Amt). Como una clase de escala direccional, este macro "estirará" un objeto a lo largo de un eje específico.
Parámetros:

Axis_Rotate_Trans(Axis, Angle). Este macro es equivalente a la transformación hecha por la función vaxis_rotate(), que rota alrededor de un eje arbitrario.
Parámetros:

Rotate_Around_Trans(Rotation, Point). La rotación ordinaria ocurre alrededor del origen, pero este macro rota alrededor de un punto específico.
Parámetros:

Reorient_Trans(Axis1, Axis2). Este macro alinea Axis1 (Eje1) con Axis2 (Eje2) rotando el objeto alrededor de un vector perpendicular a ambos ejes ( eje1 y eje2 ).
Parámetros:

Point_At_Trans(YAxis). Este macro es similar al macro Reorient_Trans(), sólo que alinea el eje y a lo largo del Eje (Axis).
Parámetros:

Center_Trans(Object, Axis). Calcula una transformación que centrará un objeto a lo largo de un eje específico. Indique los ejes que quiere centrar añadiendo "x", "y", y "z" juntos en el parámetro Axis -Ejes-.

Nota: este macro en realidad realiza el cálculo de la transformación para centrar la caja de acotación (bounding box) del objeto; y que puede no ser enteramente exacto. No hay manera de definir el "centro" de un objeto arbitrario.

Parámetros:

Usos:
object {MyObj Center_Trans(MyObj, x)} //centrar a lo largo del eje x
 
También puede centrar a lo largo de ejes múltiples:
object {MyObj Center_Trans(MyObj, x+y)} //centrar a lo largo de los ejes x e y
 

Align_Trans(Object, Axis, Pt). Calcula la transformación que alineará los lados de la caja de acotación de un objeto con respecto a un punto. Valores negativos en "Axis" (Ejes) alinearán hacia los lados que encaran los extremos negativos del sistema de coordenadas, los valores positivos se alinearán con los lados opuestos, 0 significa que no se realiza ninguna alineación en ese eje.
Parámetros:

Usos:
  object {
     MyObj 
     Align_Trans(MyObj, x, Pt) //Alinea el lado derecho del objeto para ser
                               //coplanar con Pt
     Align_Trans(MyObj,-y, Pt) //Alinea el fondo del objeto para ser 
                               // coplanar con Pt
  } 
 

vtransform(Vect, Trans)y vinv_transform(Vect, Trans).
El macro vtransform() toma una transformación (rotar, escalar, trasladar, etc...) y un punto, y retorna el resultado de la aplicación de la transformación a ese punto. El macro vinv_transform()es similar, pero aplica el inverso de la transformación, en efecto "deshaciendo" la transformación. Puede combinar transformaciones encerrándolas en un bloque de transformación.
Parámetros:

Spline_Trans(Spline, Time, SkyVector, ForeSight, Banking). Este macro alinea un objeto a una curva spline para un valor de tiempo dado. El eje Z del objeto apuntará hacia el sentido 'hacia adelante' de la spline y el eje X del objeto apuntará hacia arriba.
Parámetros:

Uso:
   object {MyObj Spline_Trans(MySpline, clock, y, 0.1, 0.5)}