Tuve problemas para encontrar información sobre las calcomanías, por lo que tal vez esta pregunta ayude a otros. La implementación es para un renderizador hacia adelante.
¿Alguien podría confirmar si obtuve la implementación correcta de la calcomanía?
- Define un cubo de cualquier dimensión que definirá el volumen de proyección en el espacio común. Verifica la intersección del triángulo con el cubo definido para recibir triángulos a los que afectará la proyección.
- Recorta estos triángulos y guárdelos.
- Luego usa trucos de matriz para calcular las coordenadas UV para los triángulos guardados que harán referencia a la textura que está proyectando.
- Para hacer esto, toma los vectores que representan la altura, el ancho y la profundidad del cubo en el espacio común, de modo que la esquina inferior izquierda es el origen.
- Pones eso en una matriz como los vectores unitarios i, j, k, configuras la traducción para el cubo, luego inviertes esta matriz.
- Multiplica los vértices de los triángulos guardados por esta matriz, de esa manera obtienes sus coordenadas dentro de un cubo de tamaño 0 a 1 que utilizas como coordenadas UV.
- De esta manera, tiene los triángulos originales sobre los que está proyectando y tiene coordenadas UV para ellos (las coordenadas UV hacen referencia a la textura que está proyectando).
- Luego, vuelve a colocar los triángulos guardados en la escena y sobrescriben el área de proyección con la imagen proyectada.
Ahora las preguntas para las que no pude encontrar respuestas. ¿Es correcto el último punto? Nunca he hecho el recorte de software, pero parece bastante propenso a errores, debido a la precisión limitada, que se producirán algunas luchas z por la textura proyectada. ¿También es correcta la forma de obtener coordenadas UV?
Respuestas:
Mira este articulo:
http://blog.wolfire.com/2009/06/how-to-project-decals/
Parece que está usando exactamente el mismo enfoque que estás usando. No habla de peleas z, pero definitivamente podría convertirse en un problema a grandes distancias.
Mi sugerencia sería deshabilitar las calcomanías después de una cierta distancia si la lucha z se vuelve muy visible.
fuente
Lo que hice para resolver la lucha Z fue aumentar el valor Z del vértice en una pequeña cantidad, en mi sombreador de calcomanías, después de que esté en las coordenadas de la pantalla.
OK ..... uso calcomanías de malla ajustadas. Creo una malla nxn con Y sentado en el terreno. Yo uso el código para encontrar la Y en la malla del polígono del terreno. Después de todos los transfroms, estoy dibujando sobre la parte superior de la geometría existente en las coordenadas de la pantalla. El búfer de profundidad está en las coordenadas de la pantalla, por lo que al mover la Z de los polígonos de calcomanías un poco hacia la pantalla, se detiene la lucha Z. Al hacer esto, reduje a la mitad la cantidad de polígonos que forman mis mallas de calcomanías ajustadas. Este es el viejo código 120
Espero que esto lo explique mejor ... (según lo solicitado)
fuente