¿Cómo puedo implementar luces y sombras en un mapa de mosaico 2D multicapa?

11

Estoy en el proceso de escribir un juego isométrico desde cero, y me gustaría saber cómo / si puedo agregar luces y sombras.

El código que tengo hasta ahora se puede encontrar aquí , pero debería ser suficiente para saber que en este momento , los mapas son simples matrices 3D de valores verdadero / falso . Aquí hay una foto del medio ambiente:Captura de pantalla del mosaico multicapa

Si se tratara de un mapa de mosaico de una sola capa, sería sencillo. Puedo entender el simple raycasting en 2d que se requiere.

Sin embargo, dado que mis mapas tienen múltiples niveles de altura, así como áreas similares a cuevas, realmente no sé cómo hacer sombras convincentes para ello. ¿Quizás una solución por bloque es la única forma realista?

Danie Clawson
fuente
¿Está buscando iluminación precocida o generada dinámicamente? ¿Se muestran las “áreas tipo cueva” recortadas si el jugador entra o la luz también debe considerar el techo? ¿Espera que cada mosaico sea binario iluminado / oscuro, o que tenga algún tipo de valor fraccional?
Anko
1
@Anko Preferiría algo fraccional, como 0-1.1 (para áreas demasiado brillantes como explosiones, etc.), pero podría estar simplemente basado en bloques, sin interpolación real ni nada de eso. Realmente quiero que sea dinámico y que soporte múltiples luces. Y aunque las áreas cubiertas de "cueva" se mostrarán cortadas, el algoritmo necesitaría considerar los bloques que no se muestran al calcular la luz. Por ejemplo, si entras en una casa, los bloques del techo desaparecerán, pero aún debe estar sombreado por dentro.
Danie Clawson
Si busca una solución como esa con cuevas y altura, parece que no tiene nada de 2D. Probablemente esté buscando una solución 3D completa, incluso si la cámara siempre está mirando en dirección norte-45º hacia abajo. Deberías mirar técnicas como stencil-shadow o similar.
Adrian Maire
En segundo lugar, @AdrianMaire, tendrás que hacer los cálculos 3D adecuados pero hacer algunos atajos si no hay interpolación en las caras de un "mosaico". Si no está haciendo interpolación, probablemente podría usar rayos.
NeomerArcana
No tengo el espacio mental en este momento para digerirlo en una respuesta, pero me topé con esta publicación de blog sobre la determinación de la línea de visión para el terreno del mapa de altura . Suena exactamente como lo que estás buscando.
Anko

Respuestas:

1

¿Puedo recomendar que las sombras 2D funcionen primero, incluso si es solo para el nivel en el que se encuentra actualmente tu avatar? Será más fácil comenzar a mirar el código de esa manera y hacerlo funcionar.

He implementado sombras en mapas de mosaicos 2D de varias maneras. Un método de proyección de sombras que encontré descrito por Eric Lippert en Microsoft funciona bastante bien.

Y la otra forma, lo que hice yo mismo la primera vez que miré este tipo de cosas fue barrer ortogonalmente las baldosas visibles y los bordes de las baldosas y generar bordes (y tal vez esquinas iirc) que describen la escena en el menor número de bordes. Luego, puede eliminar bordes ocultos y formar cualquier característica de sombreado personalizada, como sombras empotradas, si desea mostrar un poco de muro. Luego cree su geometría de sombra (¿proyección de sombra proyectiva?) Y renderícela sobre la parte superior.

Pero si trato de llevar esa idea a 3d, se vuelve más fácil hacerlo en 3d. Si bien el método descrito por Eric Lippert podría convertirse presumiblemente en 3d. Pero creo que encontrarás que hacerlo en 3D es costoso. Quizás también eche un vistazo al código fuente de Brogue . Puede tener una implementación más eficiente para la visibilidad 2d / proyección de sombras.

Buena suerte.

Gavin Williams
fuente