En este post explicaremos como eliminar las caras ocultas utilizando un buffer en el eje z.
Cuando se proyecta una escena de tres dimensiones en un plano de dos, es necesario determinar qué polígonos son visibles y cuáles no.
El algoritmo del pintor rasteriza los objetos en función de la profundidad, de forma que los mas cercanos cubren a los lejanos.
Lo que haremos será llevar un control de los valores de z de los triángulos que dibujemos, de forma que al terminar el renderizado solo se rastericen los píxeles de las caras más cercanas al punto de vista. La implementación será como la siguiente:
int *zbuffer = new int[width*height];
for (int i=0; i<width*height; i++) {
zbuffer[i] = std::numeric_limits<int>::min();
}
...
P.z = ??
...
if (zbuffer[int(P.x + P.y * width)] < P.z) {
zbuffer[int(P.x + P.y * width)] = P.z;
image.set(P.x, P.y, color);
}
Calcular el valor z de un punto a partir de las coordenadas baricéntricas de un triángulo
El valor del eje z en cada uno de los puntos indica, en este caso (cámara frontal), la profundidad (distancia) desde el punto de vista.
Este valor lo calcularemos a partir de las coordenadas baricéntricas respecto al triángulo por cada uno de los valores z de los vértices. Se entiende mejor con la nueva implementación para dibujar los triángulos: