---
title: "P3D: Transformaciones"
---

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

[[Transformaciones]](/notas/transformaciones.html)

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

# Funciones

## 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.

```java
// 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 );
```

## rotateX(a), rotateY(a), rotateZ(a)

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

* `rotateX( a )`: rota `a` radianes sobre el eje `x` (*roll*, o *alabeo*)
* `rotateY( a )`: rota `a` radianes sobre el eje `y` (*pitch* o *cabeceo*)
* `rotateZ( a )`: rota `a` radianes sobre el eje `z` (*yaw* o *guiñada*)

```java
// 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]](/notas/trig.html)

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

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

## 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 factor `s`
* `scale( sx, sy, sy )`: escala cada dimensión por un factor correspondiente `sx`, `sy`, `sz`

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

## 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:

```java
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
```

