P3D: Transformaciones
Para dibujar en el mundo 3D usamos las transformaciones extendidas a tres dimensiones.
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:
rotateX( a ): rotaaradianes sobre el ejex(roll, o alabeo)rotateY( a ): rotaaradianes sobre el ejey(pitch o cabeceo)rotateZ( a ): rotaaradianes sobre el ejez(yaw o guiñada)
// 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:
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 x1.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.
scale( s ): escala todas las dimensiones por un factorsscale( sx, sy, sy ): escala cada dimensión por un factor correspondientesx,sy,sz
// dibuja un "disco" aplanando a una esfera
scale( 2, 2, 0.5); // incrementa en x, y, decrementa en z
sphere(5); // dibuja la esfera1.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