Realmente no puedo entender qué causa que una superficie se superponga con otra. En un motor 3D que estoy creando, mi técnica falla en casos extremos.
Mi método es ordenar las superficies a pintar desde el más alejado hasta el más cercano. Para determinar la cercanía, estoy comparando los valores promedio de z. A veces, sin embargo, una superficie superpuesta tiene un valor z promedio más alto que el que se superpone. Por lo tanto, la superficie más alejada se pinta sobre la más cercana, lo que resulta en una representación extraña como esta:
Lo que uno debe ver es la superficie frontal púrpura del cubo solamente, mientras que la superficie lateral roja está pintada sobre la púrpura. El valor z promedio de la superficie púrpura es más alto y, por lo tanto, está "más lejos". Así que tengo dudas sobre si esta técnica es correcta.
Lo que también intenté es obtener la distancia desde la cámara (es decir, el origen) hasta la superficie, pero luego necesitaba un punto. Elegí el centro de cada superficie, pero esto no siempre parece funcionar porque no todas las superficies son tan grandes como la otra.
Por lo tanto, ¿cuál es una forma confiable de determinar el orden de proximidad de las superficies hacia el origen?
Lo que tienes es un problema de visibilidad . Una solución es usar un z-buffer .
fuente
La clasificación de las caras de acuerdo con su valor z promedio no funciona, porque el valor z promedio no proporciona información sobre el valor z real de los vértices o incluso los píxeles de la superficie.
Ejemplo (advertencia, arte ASCII por delante):
Hay dos caras A y B. Desde la perspectiva de la cámara, A está delante de B. Sin embargo, el valor z promedio de B es más pequeño. Veamos los otros valores z:
Podría intentar ordenarlos por sus valores z mínimos, pero hay casos en los que eso tampoco funcionará. Simplemente no hay forma de ordenar las caras arbitrarias correctamente usando solo un valor z.
En el algoritmo de Newell http://en.wikipedia.org/wiki/Newell 's_algorithm lo que haces es ordenar los rangos min / max de los valores z. Si los rangos de dos caras no se superponen, puede saber con certeza cuál está delante. Si lo hacen, a veces absolutamente tienes que dividir las caras. A veces será suficiente rastrear cada vértice para la oclusión o alguna otra técnica.
fuente
Es bueno que estés aprendiendo sobre renderizar haciendo. Prestigio. En este caso, no existe una solución de "algoritmo de pintores", en lugar de intentar solucionarlo ordenando, en la PS1 solíamos tratar de mantener los polígonos alrededor del mismo tamaño cuando estaban uno al lado del otro (lo que está haciendo como por lo que puedo decir), y el retroceso de la selección (que no estás haciendo)
Selección de la cara posterior es verificar la superficie normal en el espacio de la pantalla para su dirección (solo obtenga el signo del elemento de profundidad del espacio de la pantalla transformado normal (en nuestro caso era la z de lo normal), o el producto cruzado de dos vectores de triángulo, es decir, cruz (v1-v0, v2-v0))
Si implementa el sacrificio de la cara posterior, también reduce la cantidad de rasterización que está haciendo ... doble victoria.
fuente