¿Cómo podrías modelar "rastros de olor" en un juego?

11

Supongamos que desea crear un juego en 3D, y que los jugadores o los móviles puedan atrapar a otra entidad siguiendo sus rastros de olor. ¿Existe alguna estructura de datos conocida que coincida con este caso de uso?

Si solo tiene unas pocas personas, probablemente pueda hacer algo como un mapa de coordenadas 3D a la identificación de entidad, pero el olor real funciona de manera diferente, porque se desvanece con el tiempo, pero lentamente. Y la mayoría de las veces, solo puede saber aproximadamente qué fue allí, y aproximadamente cuántas cosas de ese tipo fueron allí. Y la aproximación empeora con el tiempo, hasta que se va.

Me imagino que es como comenzar con un número exacto y perder lentamente los dígitos menos significativos, hasta que también pierda el dígito más significativo. Pero eso realmente no me ayuda, porque las ID de entidad normalmente no están codificadas para contener el tipo de entidad, además de su ID individual.

Sebastien Diot
fuente
Dwarf Fortress está haciendo algo así en el próximo lanzamiento.
Russell

Respuestas:

10

Hay mucha variedad en cómo puedes hacer esto; Voy a sugerir las opciones "obvias para mí", pero hay muchas variaciones que podrían diseñarse. Descargo de responsabilidad: en realidad no he implementado nada como esto.

Primero, necesita una estructura de datos que cubra su mundo. Si está haciendo un movimiento de NPC en un espacio 3D, entonces probablemente tenga, o eventualmente necesitará, dicha estructura para propósitos de búsqueda de ruta, por ejemplo, una malla de navegación. Entonces, supongamos que podemos agregar un campo para olores a eso.

Entonces, ¿qué ponemos en ese campo? Propongo una lista de registros ( aroma , fuerza , tiempo ). Esta lista se mantiene a una longitud máxima o inferior, y se ordena por fuerza , por lo que se descartarán los aromas débiles. El olor podría ser algo definido explícitamente para cada entidad o tipo de entidad, o podría ser simplemente el tipo de entidad, dependiendo de lo que desee poder rastrear de manera distinta. La hora es una marca de tiempo de cuándo se actualizó por última vez este registro de esencia.

Cuando una entidad pasa a través de un área (por ejemplo, un triángulo dado de la malla de navegación), es hora de actualizar la lista de olores. Primero, disminuya todas las fuerzas de acuerdo con la cantidad de tiempo transcurrido de acuerdo con el valor del tiempo frente al tiempo actual; la disminución exponencial es probablemente una opción razonable aquí. Luego agregue el aroma de la entidad actual a la lista, tal vez con una fuerza que dependa del tipo de entidad. Luego, si la lista se hizo demasiado larga, descarte la fuerza más baja.

Para obtener un resultado de seguimiento, encuentre el aroma en la lista para la ubicación actual, luego haga lo mismo para todos sus vecinos, y vaya en la dirección del aroma más fuerte (esa no es la dirección desde la que acaba de llegar el rastreador).

Para realismo extra:

  • Difusión: transfiera periódicamente una fracción del aroma en cada ubicación a sus vecinos. Esto confunde los senderos, pero también significa que las cosas estacionarias se pueden rastrear (encontrar comida, cadáveres, etc.). (Incluso es un tipo reconocido de IA para basar las acciones completamente en este tipo de información: el panorama proporciona información sobre qué camino tomar para obtener un recurso en particular, etc. Olvidé el nombre). La principal desventaja es el tiempo dedicado calculando la difusión en todas partes.

  • Los olores fuertes deben evitar la detección de olores débiles; divida la fuerza del aroma buscado por la fuerza del aroma más fuerte y falle si es demasiado pequeño. Esto podría permitir confundir deliberadamente el rastro de olor de uno.

Kevin Reid
fuente
9

Modificaría una técnica llamada mapeo de influencia para crear un mapa para olores. Se disipará y se desvanecerá naturalmente, se mezclará y competirá con otros aromas, y probablemente más. Parece que hará exactamente lo que necesita, pero puede ser más elaborado de lo que está buscando implementar. Como mínimo, debería darle algunas buenas ideas, y es bastante simple de implementar sobre cualquier estructura que esté utilizando actualmente.

Un tutorial / explicación que encontré útil.

jsonnull
fuente