2012-05-22 21 views
5

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 en la que puedo ver el suelo. Ahora parece que esto:Iluminación 2D: hacer que la luz no entre en la pared

enter image description here

Así que la luz pasa a través de las paredes. Quiero que se vea como esto:

enter image description here

(I marcó el colisiones con las paredes con color amarillo oscuro)

Así que los rayos de luz de freno cuando se reunió 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 lanzar rayos desde la fuente y verificar cuando colisionan con la pared (sé cómo hacerlo), pero entonces tendría que lanzar 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 elipse o semielipse, incluso un triángulo o parte del círculo. En general, tengo el mapa de bits con luz que no colisiona con nada, y quiero restarlo 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 dimmension con 0 y 1.

Gracias por cualquier ayuda, perdón por la pregunta larga y mi mal inglés.

+0

¿Puedes usar el hecho de que la sombra creada por un obstáculo de línea recta va a ser un sector? Comience con su luz circular, con un radio que depende de la intensidad, y luego dibuje un trapecio en el color inverso para cada obstáculo. –

+0

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

Respuesta

7

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

This article debería darle un buen comienzo.

+0

nice link. Gracias –

2

En su ejemplo particular, puede fácilmente aplicar fuerza bruta comprobando la línea de visión desde cada píxel (vacío) al 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.

+0

¿No tomaría mucho tiempo? : O –

+0

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

+0

no hay mejor manera? Me gustaría generarlo de forma dinámica, por lo que los obstáculos en movimiento pueden arrojar sombras ... –

2

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

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

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

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

Cuestiones relacionadas