Iluminación 2D: haz que la luz no atraviese la pared

Tengo un mapa de colisión y algunos lugares que quiero que sean fuentes de luz. La fuente de luz proporciona luz que en realidad es una forma donde puedo ver el suelo. Ahora se ve así:

enter image description here

Entonces la luz atraviesa las paredes. Quiero que se vea así:

enter image description here

(Marqué las colisiones con paredes con amarillo oscuro)

Entonces los rayos de luz se detienen al encontrarse con la pared. Quiero obtener la forma de la luz correcta, lo mejor sería un mapa de bits que la contenga)

Mi primera idea fue emitir rayos desde la fuente y comprobar cuándo chocan con la pared (sé cómo hacerlo), pero luego necesitaría emitir rayos cada 0.001 grados, por ejemplo, así que es demasiado tiempo para generar luces. Lo siguiente es que la forma de la luz no siempre es un círculo, a veces puede ser una elipse o una semielipse, incluso un triángulo o parte del círculo. Generalmente, tengo el mapa de bits con luz que no choca con nada, y quiero restarle un poco para que se vea como en la segunda imagen.

Y lo último, estoy usando allegro 4.2.1, pero todos los mapas de bits mencionados anteriormente son matrices de 2 dimensiones con 0 y 1.

Gracias por cualquier ayuda, lo siento por la pregunta larga y mi mal inglés.

preguntado el 22 de mayo de 12 a las 13:05

¿Puedes usar el hecho de que la sombra creada por un obstáculo en línea recta será un sector? Comienza con tu luz circular, con radio dependiendo de la intensidad, y luego dibuja un trapezoide en el color inverso para cada obstáculo. -

hm, ¿puedes explicarlo un poco más? -

3 Respuestas

La idea básica es que calcule la región de sombra de sus paredes y simplemente no la coloree.

Este artículo debería darte un buen comienzo.

contestado el 22 de mayo de 12 a las 14:05

En su ejemplo particular, puede forzarlo fácilmente al verificar la línea de visión desde cada píxel (vacío) hasta el centro de su fuente de luz. Si tiene línea de visión y la distancia está dentro de la caída, entonces tiene luz allí. Si no, entonces está oscuro.

contestado el 22 de mayo de 12 a las 13:05

¿No llevaría mucho tiempo? :O- gato ruidoso

@kittyPL: es una opción de fuerza bruta, no necesariamente la forma más eficiente de hacer esto, no. La ventaja es que funcionaría para cualquier forma de obstáculo, aunque solo para fuentes de luz puntuales. - joris timmermans

no hay otra manera mejor? Me gustaría generarlo dinámico, para que los obstáculos en movimiento puedan proyectar sombras... - gato ruidoso

La solución MadKeithV necesita O (número de píxeles ^ 2) tiempo.

Mi solución es una idea ampliada de MadKeithV, pero se ejecuta en tiempo O (número de píxeles). Con algunas mejoras, funcionará en O (número de píxeles de luz)

Primero, comience con el píxel que contiene la fuente de luz. Luego, utilizando el procedimiento BFS, 'infecte' los píxeles más cercanos con luz y almacene el rango de ángulo en qué dirección puede progresar la luz desde cada punto.

En las siguientes instancias de BFS, repita este procedimiento, considerando solo los píxeles en el 'rango de infección'.

contestado el 24 de mayo de 12 a las 19:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.