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 )
: rotaa
radianes sobre el ejex
(roll, o alabeo)rotateY( a )
: rotaa
radianes sobre el ejey
(pitch o cabeceo)rotateZ( a )
: rotaa
radianes 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 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.
scale( s )
: escala todas las dimensiones por un factors
scale( 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 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