jardínBit

P3D: Transformaciones

Para dibujar en el mundo 3D usamos las transformaciones extendidas a tres dimensiones.

[Transformaciones]

Estas funciones alteran el estado de la matriz de transformaciones, que indica la posición del origen, dimensiones de los ejes, y rotaciones.

1 Funciones

1.1 translate( dx, dy, dz )

Traslada la posición del origen dx unidades sobre el eje x, dy unidades sobre el eje y, y dz unidades sobre el eje z, respecto a la posición anterior.

Los argumentos son de tipo float y pueden ser positivos o negativos.

// dibuja un cubo centrado en el origen
box(5); 

// traslada el origen 5 unidades sobre X
translate( 5, 0, 0 );

// dibuja otro cubo centrado en el nuevo origen
box( 5 );

1.2 rotateX(a), rotateY(a), rotateZ(a)

Estas funciones nos permiten rotar sobre cualquiera de los ejes, en uno a la vez:

// dibuja un cubo centrado en el origen
box(5); 

// rota un octavo de vuelta
rotateX( PI/4 );

// dibuja otro cubo centrado en el nuevo origen
box( 5 );

En las notas de Funciones Trigonométricas se detalla el uso de los radianes:

[Funciones trigonométricas]

Para especificar ángulos de rotación en grados, utizamos la función radians( ) que hace la conversión:

rotateX( radians(45) ); // rota 45 grados sobre el eje x

1.3 scale( )

Multiplica (escala) las dimensiones de las unidades por un factor.

Si el factor es 1, las dimensiones se mantienen. Si el factor es menor a 1, las dimensiones se reducen, y si es mayor a 1, las dimensiones incrementan.

Por ejemplo: un factor de 0.5 divide las dimensiones a la mitad, y un factor de 2 las multiplica al doble.

// dibuja un "disco" aplanando a una esfera
scale( 2, 2, 0.5); // incrementa en x, y, decrementa en z
sphere(5); // dibuja la esfera

1.4 pushMatrix() y popMatrix()

Estas funciones nos permiten guardar (pushMatrix()) y recuperar (popMatrix()) el estado de la matriz de transformaciones.

Nota: Por cada pushMatrix() tiene que haber un popMatrix() correspondiente.

Como toda nuestra construcción se basa en transformaciones acumuladas, conviene utilizar estas funciones para regresar a estados anteriores.

Por ejemplo:

box(2); // dibuja cubo en el origen
  
pushMatrix(); // guarda el origen
translate(1.5, 0, 0); // traslada en x (derecha)
rotateX( PI/4 ); // rota en el eje X
box(1); // dibuja otro cubo
popMatrix(); // recupera el origen
  
translate( 0, 0, 1.5); // traslada en z (arriba)
scale( 2, 2, 0.5); // "aplana" escalando
sphere(1); // dibuja esfera