11 junio 2011

Convertir de 3D a 2D usando perspectiva caballera


Hay varias formas de representar en un plano de 2 dimensiones, puntos que realmente pertenecen al espacio de 3 dimensiones. Algunas de ellas son muy típicas de dibujo técnico, como la perspectiva caballera, la perspectiva isométrica o la perspectiva cónica. Otras aprovechan la capacidad de cálculo de los ordenadores, para permitir cualquier punto de vista o cualquier posición de los ejes.

Vamos a empezar por la perspectiva caballera. En ella, el eje X (anchura) y el Z (altura) se muestran "en verdadera magnitud" (a tamaño real), y el eje Y (profundidad) forma 135 grados con ellos:



Las distancias en el eje Y se suelen representar "reducidas", en un factor de 1/2, o bien de 2/3 o de 3/4.

Representar un punto 3D en pantalla usando este método es fácil:
  • La coordenada X se representará tal cual, correspondiendo con la coordenada X de nuestra pantalla, salvo quizás un desplazamiento a un lado o a otro, para colocar el origen de coordenadas en un punto que no sea la esquina de la pantalla, y salvo quizá un factor de escala para poder ver las cosas con mayor o menor detalle.
  • La coordenada Z del espacio (vertical) corresponderá con la coordenada Y de nuestra pantalla, salvo el desplazamiento del origen, quizá un factor de escala, y con una diferencia importante: es habitual que la Y de una pantalla crezca hacia abajo, y la Z del sistema de coordenadas suele crecer hacia arriba, así que habrá que cambiar de signo.
  • Cada avance en el eje Y del espacio (profundidad), se reflejará en un ligero avance hacia abajo en la pantalla (y*0.5) y un ligero retroceso en horizontal (-y*0.5)

Por tanto, las coordenadas X e Y en pantalla de un punto de coordenadas reales (X,Y,Z), si no hacemos ningún cambio de escala, serían:

xPantalla = x + desplazX
yPantalla = -z + (y * 0.5) - (x * 0.5) + desplazY

Así un fuente de Basic256 que dibujara un "muelle" (un círculo "estirado hacia arriba", para que sus puntos tengan coordenadas X, Y, Z, distintas de cero en su mayoría, y se note el efecto de la profundidad y el de la altura) podría ser:

REM Datos del circulo
xCentroCirculo = 200
yCentroCirculo = 180
radioCirculo = 50

REM Desplazamiento del origen
desplazX = 0
desplazY = 200

clg
for i = 1 to 360
REM Calculo la x,y,z reales
x = xCentroCirculo + radioCirculo * cos(radians(i))
y = yCentroCirculo + radioCirculo * sin(radians(i))
z = i

REM Y las coordenadas de pantalla equivalentes
xPantalla = x + desplazX
yPantalla = -z + (y * 0.5) - (x * 0.5) + desplazY
plot xPantalla, yPantalla
pause (0.01)
next i

(Puedes leer más sobre perspectiva caballera, por ejemplo aquí:)