Quiero tener iluminación 2D que pueda ser bloqueada por objetos en el juego. Mi juego tiene una vista de arriba hacia abajo y todos los objetos del juego se describen mediante rectángulos.
Digamos que tengo un mundo de 10x10 y pongo una luz en 1x1 y paredes alrededor de esa luz. Quiero poder ver la fuente de luz en 1x1, pero no en ningún otro lugar, porque está bloqueada por las paredes.
He oído hablar de cómo funcionan los rayos de luz, pero ¿cómo funciona realmente?
opengl
2d
lighting
raycasting
LiquidFeline
fuente
fuente
Respuestas:
Amit Patel ha escrito un artículo muy bueno sobre el casting de rayos 2D.
Esto implica lanzar rayos a cada uno de los vértices dentro del rango de la fuente de luz para construir una malla de luz.
Todos los ejemplos visuales son interactivos en la publicación y muy fáciles de entender.
Tampoco tiene que limitarse a una caja, el perímetro que traza puede tener la forma que desee.
fuente
Debe usar el algoritmo de emisión de rayos, lo que significa que debe poder calcular la intersección del rayo (media línea) con cualquier objeto en su escena (líneas, cuadrados, círculos, triángulos ...) y elegir la intersección más cercana. Lanzas el rayo en todas las direcciones y luego "dibujas la luz" solo al objeto más cercano.
Así es como puede verse .
fuente
Si sabes lo que es la emisión de rayos, entonces todo lo que necesitas hacer es codificarlo. No es demasiado complejo siempre que tenga coordenadas para cada vértice.
Primero, crea un objeto que emana luz. Coloque su luz en las coordenadas x, y.
No se garantiza que funcione para un polígono cóncavo, pero debería funcionar bien para cualquier polígono convexo.
Esto funcionará si sus objetos ocultos (paredes, personajes, comedores de personas que vuelan de color púrpura) se pintan en la pantalla después de aplicar la iluminación. De lo contrario, la mitad de una pared aparecerá significativamente más brillante que la otra mitad. Si su punto de luz es equidistante de dos pares de vértices de la misma pared (exactamente la mitad de la altura de su pared), aplique el triángulo a los dos vértices más cercanos, en lugar de los dos más alejados.
También debo mencionar que este método requiere un punto de vértice creado dinámicamente donde el borde del radio de la luz se encuentra con la superficie del objeto oclusivo. Esto crea un mínimo de 3 vértices para cualquier objeto oclusivo y permitirá que las paredes que se extiendan más allá del radio de la luz (o fuera de la pantalla) también bloqueen cualquier luz.
Más información sobre polígonos cóncavos y convexos.
fuente