6.3.1  Transformaciones

Las transformaciones soportadas son rotate (rotación), scale (escalado), y traslate (traslación). Se usan para girar, cambiar de tamaño y mover un objeto o textura. Tambien puede usarse una matriz de transformacion para especificar directamente una transformacion compleja. Grupos de transformación pueden ser asociados juntos y guardados en un identificador de transformación. La sintaxis para las transformaciones es como sigue:

TRANSFORMATION:
    rotate <Rotate_Amt> | scale <Scale_Amt> | 
    translate <Translate_Amt> | transform TRANSFORM_IDENTIFIER | 
    transform { TRANSFORMATION_BLOCK...} |
    matrix <Val00, Val01, Val02,
        Val10, Val11, Val12,
        Val20, Val21, Val22,
        Val30, Val31, Val32>
TRANSFORMATION_BLOCK:
    TRANSFORM_IDENTIFIER | TRANSFORMATION | inverse
TRANSFORM_DECLARATION:
    #declare IDENTIFIER = transform { TRANSFORMATION_BLOCK...} |
    #local IDENTIFIER = transform { TRANSFORMATION_BLOCK...}

6.3.1.1  Traslación

Los objetos pueden moverse agregando el modificador translate. Consiste en la palabra clave translate seguida por una expresión vectorial. Los tres términos del vector especifican el número de unidades que se moverá en cada dirección "x", "y" y "z". Translate mueve el elemento relativo a su posición actual. Por ejemplo:

 sphere { <10, 10, 10>, 1
  pigment { Green }
  translate <-5, 2, 1>
 }

moverá la esfera desde la posición <10,10,10> a la posición <5,12,11>. No la mueve a la posicion absoluta <-5,2,1>. Los desplazamientos son siempre relativos a la posición del objeto antes del movimiento. Desplazarlo cero unidades dejará el objeto en la misma posición en ese eje. Por ejemplo:

 sphere { <10, 10, 10>, 1
  pigment { Green }
  translate 3*x  // evalúa a <3,0,0> entonces se mueve 3 unidades
                 // en la dirección "x" y ninguna por "y" o "z"
 }

6.3.1.2  Escalado

Puede cambiar el tamaño de un objeto patrón de textura agregando el modificador escala. Consiste en la palabra clave scale seguida por una expresión vector. Los tres términos del vector especifican la cantidad de escala en cada dirección "x", "y" y "z".

Se puede usar un escalado "desparejado" para expandir o comprimir un elemento. Valores mayores a 1 expanden el elemento en ese eje mientras que valores menores a 1 son usados para comprimir el elemento. Escalar es relativo al tamaño actual del elemento. Si el elemento ha sido previamente ajustado de tamaño usando scale entonces scale modificará el tamaño relativo al tamaño nuevo. Pueden usarse múltiples valores de escala.

Por ejemplo:

 sphere { <0,0,0>, 1
  scale <2,1,0.5>
 }

estirará y aplastará la esfera en una forma elíptica que es dos veces el tamaño original a lo largo de la dirección "x", mantiene el mismo tamaño en la dirección "y", y tiene la mitad del tamaño en la dirección "z".

Si se especifica sólo una expresión flotante, ésta será promovida a un vector de tres componentes cuyos términos son todos iguales. De esa manera el objeto se escala uniformemente por la misma cantidad en todas las direcciones. Por ejemplo:

 object {
  MyObject
  scale 5 // Evalúa como <5,5,5> entonces escala uniformemente 
         // por 5 en cada dirección.
 }

Cuando uno de los componentes de escala es cero, POV-Ray cambia este componente a 1 ya que asume que 0 significa no escalar en esa dirección. Se mostrará una advertencia: "Valor ilegal: Escalar X, Y o Z por 0.0. Cambiado a 1.0.".

6.3.1.3  Rotación

Usted puede cambiar la orientación de un objeto o patrón de textura agregando el modificador rotate. Consiste en la palabra clave rotate seguida por una expresión vector. Los tres términos del vector especifican el número de grados de rotacion alrededor de los ejes X, Y, Z.

Nota: el orden de la rotación es importante. Las rotaciones ocurren primero en el eje x, luego el eje y, luego el eje z. Si no está seguro de que es esto lo que quiere, entonces debería rotar sólo en un eje a la vez usando múltiples declaraciones de rotación para obtener la rotación correcta.

rotate <0, 30, 0>  // 30 grados en el eje Y luego,
rotate <-20, 0, 0> // -20 grados en el eje X luego,
rotate <0, 0, 10>  // 10 grados en el eje Z

La rotación es siempre relativa a los ejes. De esta manera, si un objeto está a cierta distancia del eje de rotación, no solo rotará, también orbitará en el eje, como si estuviera balanceándose en una cuerda invisible.

POV-Ray usa el sistema de rotación de la mano izquierda. Usando el famoso ejercicio de "aerobic de gráficos por computadora", mantenga arriba su mano izquierda y apunte su pulgar en la dirección positiva del eje de rotación. Doble sus dedos en la dirección positiva de rotación. De modo semejante si apunta su pulgar en la dirección negativa del eje, sus dedos se doblarán en la dirección negativa de rotación. Vea "Comprendiendo el Sistema de Coordenadas de POV-Ray" para una ilustración.

6.3.1.4  El identificador Matrix

La palabra clave matrix puede usarse para especificar explícitamente la matriz de transformación que se usará para la transformación de objetos o texturas. Su sintaxis es:

MATRIX:
    matrix <Val00, Val01, Val02,
        Val10, Val11, Val12,
        Val20, Val21, Val22,
        Val30, Val31, Val32>

Donde Val00 hasta Val32 son expresiones de coma flotante encerradas en paréntesis angulares y separadas por comas.

Nota: esto no es un vector. Es un conjunto de 12 expresiones de coma flotante.

Estos valores de coma flotante especifican los elementos de una matriz de 4 por 4 con la cuarta columna implícitamente puesta a <0,0,0,1>. En cualquier punto dado P, P=<px, py, pz>, es transformado en el punto Q, Q=<qx, qy, qz> por

qx = Val00 * px + Val10 * py + Val20 * pz + Val30

qy = Val01 * px + Val11 * py + Val21 * pz + Val31

qz = Val02 * px + Val12 * py + Val22 * pz + Val32

Normalmente usted no usará la palabra clave matrix porque es menos descriptiva que los comandos de transformación y más dificil de visualizar. De todas formas el comando matrix permite efectos de transformación más generales como shearing. La siguiente matriz causa que un objeto sea cizallado a lo largo del eje "y".

 object {
  MyObject
  matrix < 1, 1, 0,
       0, 1, 0,
       0, 0, 1,
       0, 0, 0 >
 }