Pregunta

Estoy empezando un proyecto de juego que permitirá a los personajes esconderse en zonas oscuras.Esconderte en un rincón oscuro debería hacer que sea más difícil que otros personajes te vean.

Lo que necesito es una forma de calcular cómo son las condiciones de iluminación donde se encuentra el personaje.

Lo ideal sería tener un

double getLightFactor(GameCharacter observer, GameCharacter target)

ya que supongo que podría haber condiciones de iluminación en las que la luz incida de modo que diferentes lados del objetivo reciban diferentes cantidades de luces.Pero con mucho gusto me conformaría con

double getLightFactor(GameCharacter target)

para obtener la luz para un personaje específico independientemente de dónde estés mirando o incluso

double getLightFactor(int x, int z)

para obtener la luz en un punto específico del mapa en el terreno.

El método debe tener en cuenta que las condiciones de iluminación pueden cambiar durante el juego, pero dado que se basa en turnos, se podrían permitir algunos cálculos complicados.Mi intención es hacer posible el uso de linternas, por lo que también es necesario tenerlas en cuenta (pero podrían modelarse y manipularse por separado).

Usaré Ogre3d para manejar mi escena, pero aceptaré con gusto soluciones genéricas o incluso soluciones para otros motores (mi elección de motor no está escrita en piedra).

¡Ideas, artículos o cualquier cosa realmente relevante es bienvenida!

¿Fue útil?

Solución

Podrías simplemente renderizar la escena desde el punto de vista del observador en un buffer fuera de la pantalla (incluso en una resolución bastante baja) teniendo en cuenta la configuración de iluminación actual.Luego podrías calcular un valor medio de luminosidad alrededor de la mitad del carácter objetivo.

No conozco el motor Ogre3d, pero esta debería ser una forma bastante genérica de manejar su problema (después de todo, solo se trata de renderizar la escena desde un punto de vista diferente...)

Otros consejos

Oh chico.Esto depende mucho del motor.Puedo decirte ahora que quieres la segunda opción.

¿Cómo funciona la iluminación?¿Es dinámico o estático?Supongamos que es una combinación de ambos.

Para iluminación estática, consulte el mapa de luces cercano.Está basado en vértices o en una textura; de cualquier manera, puedes probarlo en algunos puntos cercanos y promediarlos.Observe cómo el motor calcula la iluminación de los modelos, profundice en el código de gráficos y vea de dónde provienen realmente los datos; puede utilizar la misma fuente.Algunos juegos tienen información de iluminación volumétrica, Quake 2 lo hace por hoja en el árbol BSP (fácil de verificar) y Quake 3 tiene texturas volumétricas (también fáciles de verificar).

Luego necesitarás agregar las luces dinámicas.Una forma de hacerlo es disparando rayos desde el reproductor (probablemente algunos rayos diferentes, sin duda, desde diferentes partes del reproductor) hacia la fuente de luz.Cuente cuántos son alcanzados y agregue un poco a su número para cada uno, dependiendo de qué tan lejos esté la luz.Todos los motores de juegos decentes tienen un procedimiento para "disparar un rayo y ver qué golpea", así es como las IA hacen la línea de visión y cómo averiguas qué balas impactan y qué sucede cuando chocas contra la pared.No dispares demasiados rayos demasiado lejos porque podría ser lento.

No tendría que volver a calcular este valor con demasiada frecuencia; podría hacerlo cada vez que se cree una nueva fuente de luz y luego aproximadamente cada segundo.

Dependiendo de la complejidad del entorno, puedes hacer trampa y usar un mapa de luces 2D superpuesto al terreno.Cada celda tendría un valor de intensidad de luz basado en las fuentes de luz cercanas.Sería rápido de calcular incluso para objetos en movimiento, y rápido de acceder para determinar la "oscuridad" de una ubicación.

Es posible que tengas que "estampar" formas usando algoritmos simples de caja o círculo dependiendo del tipo de luces que tengas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top