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):
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):
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!
Respuestas:
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.
fuente
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.
fuente
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.
fuente
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.
fuente