Lanzamiento de sombras en tiempo real en un juego isométrico 2D

15

Estoy escribiendo un pequeño motor isométrico 2d en C ++ y estoy tratando de implementar la proyección de sombras en tiempo real. Seguí un enfoque simple descrito en esta página y aquí está el resultado (la luz se encuentra en la misma posición que el cubo amarillo):

ingrese la descripción de la imagen aquí

El resultado es muy bueno, pero faltan sombras en las paredes y en la parte superior de los cubos. Aquí hay un ejemplo de cómo debería verse (he dibujado las sombras esperadas en verde):

ingrese la descripción de la imagen aquí

Todos los cubos dibujados están hechos simplemente de 3 quads 2D ubicados en una posición XY y con una profundidad Z (z = x + y). Yo uso OpenGL con una matriz ortográfica (glOrtho). Las sombras se dibujan utilizando el búfer de la plantilla.

Estoy buscando recursos o soluciones que me ayuden a completar esta implementación de casting de sombras.

¡Muchas gracias!

XPac27
fuente
55
Su enlace a "esta página" apunta a una imagen y no a una página. Además, solo estoy adivinando aquí, pero podría ser más fácil resolver ese problema en 3D y proyectar la cámara iosmétricamente.
Tetrad
Oups, tienes razón, arreglé el enlace. Sin duda, sería más fácil con una proyección 3D, pero 2D también tiene sus ventajas y estoy seguro de que hay soluciones para implementar esto en 2D.
XPac27

Respuestas:

6

Para el techo y las paredes, puede intentar determinar las intersecciones entre los segmentos de la pared y las regiones de sombras generadas. Necesita dos pasos de representación de sus sombras. El primero hará lo que está haciendo hoy (en almacenamiento de memoria). La segunda pasada calculará las intersecciones de techo y pared. La última etapa es la representación real. DeadMG está mal, puedes hacer eso.

Nota: para el techo, debe cruzar el área de sombra y el área del techo.

sgc
fuente
Gracias por el buen consejo ! Si es posible, puede optimizar esta segunda pasada comprobando qué paredes deben calcularse utilizando el producto de puntos de su segmento en comparación con los segmentos de sombras. Lo intentaré y volveré a publicar si funciona.
XPac27
¡Ha pasado un tiempo, pero finalmente lo conseguí gracias a tus sugerencias! Solo necesitaba 2 métodos de geometría (uno para saber si un punto está dentro de un polígono y otro para obtener la intersección de dos segmentos). Todavía necesito manejar los techos, pero parece fácil saberlo. Puede ver el resultado en este video y ver el código fuente aquí (solo trabajé 1 día para que sea posible optimizarlo más).
XPac27
@ XPac27 que es asombroso. Gracias por compartir.
cenizas999
0

Básicamente, lo que estás buscando no se puede hacer. Desea tomar un montón de objetos 2D y hacer que proyecten sombras como si fueran objetos 3D. Si desea tener sombras 3D completas, debe tener objetos 3D.

DeadMG
fuente
1
Pero esa no es la sombra en 3D como en la pregunta. Cualquier muro bloquea completamente la línea de visión en esa dirección, no puede tener objetos de altura variable.
yuriks
0

La solución descrita no es 3D completa ya que no necesita una solución 3D completa. Se verá pero no lo es. La creación de sombras se debe considerar como una intersección entre el volumen. Lo que necesita es menos complicado. Recuerda (si tienes kown) condenas y condenas como el motor de renderizado. Todo el procesamiento se realizó en dos dimensiones.

sgc
fuente
0

Dado que quieres que este juego sea pequeño, ¿qué tal si decimos que la implementación actual de shadow es lo suficientemente buena?

Admito que no he visto esto en acción, es decir, no he visto cuán perturbadoras o no perturbadoras serán las imperfecciones de las sombras cuando este juego se ejecute en vivo con objetos dinámicos y fuentes de luz dinámicas, pero a juzgar por sus imágenes, yo ' Estoy muy tentado a decir "es lo suficientemente bueno, ahora concéntrate en completar el juego". Si la implementación actual es pequeña y se ejecuta rápidamente y arreglar lo que percibes como problemas hará que el código sea grande y lento, creo que es mejor no preocuparte por esas sombras.

Lo sé, lo sé, sugiriendo "no intentes resolver el problema" como una solución a un problema podría ser una mala práctica. Aún así, honestamente quiero decir que realmente es bueno, ya que si quieres una pequeña huella para tu código.

IllvilJa
fuente