La IA de los videojuegos necesita responder preguntas espaciales constantemente. ¿Dónde está la cobertura más cercana? ¿Qué distancia puede recorrer esta unidad antes de chocar con un obstáculo? ¿Qué dirección debería tomar un enemigo que se mueve en zigzag para mantener una distancia dada del jugador? Los SDF convierten cada una de esas preguntas en una evaluación de campo: un número da el espacio libre y un gradiente da la dirección. Este artículo cubre las tres cargas de trabajo principales de navegación: los campos de distancia ambientales para consultas de espacio libre y colocación, la dirección basada en gradiente para evitar obstáculos y los campos de flujo para el movimiento de multitudes, y compara todo el enfoque con las mallas de navegación tradicionales.
Para los fundamentos de cómo funcionan el signo y el gradiente, comienza con la visión general de los Campos de Distancia con Signo . Para el contexto a nivel de motor, consulta los SDF en el desarrollo de videojuegos .
Campos de Distancia Ambientales como Datos de Navegación
Una malla de navegación tradicional almacena regiones poligonales transitables con información de conectividad. Un campo de distancia almacena, en cada punto del espacio, la distancia al obstáculo más cercano. Esa información adicional permite consultas que una navmesh no puede responder de manera eficiente.
El campo más útil para la navegación es el campo de distancia sin signo de la geometría de obstáculos, el campo de distancia ambiental (EDF, por sus siglas en inglés). En cualquier posición del mundo, el EDF devuelve qué tan lejos está la pared u obstáculo más cercano. Un valor de 2.0 significa que el agente tiene 2 metros de espacio libre en todas las direcciones. Ten en cuenta que aquí el campo no tiene signo: la navegación solo necesita saber qué tan lejos está un punto del obstáculo más cercano, no si está dentro de uno, porque el espacio transitable se define como estar fuera de todos los obstáculos.
Esto respalda directamente:
- Consultas de espacio libre: ¿puede una unidad de radio ocupar una posición sin intersectar ningún obstáculo? Verifica si .
- Selección de cobertura: muestrea posiciones candidatas y elige la que tenga la mejor combinación de distancia al enemigo, distancia a la superficie de cobertura más cercana y propiedades de línea de visión.
- Rutas de flanqueo: calcula una ruta que mantenga una distancia mínima de un obstáculo en lugar de rozar su límite.
Cada una de estas requeriría búsquedas repetidas del punto más próximo contra una malla. Contra un EDF son evaluaciones únicas, razón por la cual hornear un EDF para la geometría estática del nivel y consultarlo por agente es el patrón estándar.
Dirección Basada en Gradiente
El gradiente del campo de distancia ambiental apunta hacia el obstáculo más cercano. Para una unidad que quiere mantenerse a una distancia fija de una pared, la fuerza de dirección puede combinar la atracción a lo largo de la ruta de navegación con la repulsión de las superficies de obstáculos:
vec3 obstacleSteering(vec3 position, SDF environment, float preferredDistance) {
float d = evaluateSDF(position, environment);
if (d > preferredDistance * 2.0) return vec3(0.0); // Too far to care
vec3 gradient = normalize(gradientSDF(position, environment));
// Push away if too close, pull toward if too far
float error = d - preferredDistance;
float strength = clamp(abs(error) / preferredDistance, 0.0, 1.0);
return strength * sign(error) * gradient;
}
Cuando la unidad está más cerca que la distancia preferida, el error es negativo y la fuerza la aleja del obstáculo. Cuando está más lejos, la fuerza la atrae hacia el obstáculo. La magnitud aumenta linealmente desde cero en la distancia preferida hasta la fuerza completa cuando el error de distancia es igual a la distancia preferida. Esto crea un comportamiento suave y natural de seguir paredes sin segmentos de ruta explícitos.
Un ejemplo práctico: distancia preferida 1.0. En una posición donde el EDF lee 0.7, la unidad está 0.3 más cerca de lo preferido, el error es -0.3, la fuerza es 0.3 y la fuerza resultante es 0.3 unidades en la dirección que se aleja del obstáculo. Con una lectura del EDF de 1.4, la unidad está 0.4 demasiado lejos, el error es +0.4 y la fuerza la atrae 0.4 unidades de vuelta hacia el obstáculo. Entre los dos extremos, la fuerza pasa exactamente por cero en la distancia preferida, así que la unidad se asienta en un desplazamiento estable: sin oscilación, porque la magnitud de la fuerza se reduce a medida que se reduce el error.
La dirección basada en gradiente se compone con el seguimiento de rutas: la ruta proporciona una dirección, la dirección del EDF proporciona el desplazamiento del obstáculo, y los dos vectores se mezclan con pesos. Las unidades que siguen la pared de un pasillo simplemente se dirigen a lo largo de ella, y el parámetro de distancia preferida funciona además como control de separación entre multitudes cuando las unidades comparten el mismo valor.
Campos de Flujo para Movimiento de Multitudes
Para grandes cantidades de agentes, calcular rutas individuales se vuelve costoso. Un campo de flujo reemplaza la búsqueda de rutas por agente con un único campo vectorial global que todos los agentes siguen. El campo de flujo se construye resolviendo la ecuación eikonal hacia afuera desde las ubicaciones objetivo, lo que produce un campo de distancia desde el objetivo. En una rejilla, esto se calcula con el algoritmo de Dijkstra o un método de marching rápido: cada celda almacena el costo de viaje acumulado hasta el objetivo, y la dirección del flujo en una celda apunta hacia el vecino de menor costo, hacia el objetivo.
Los agentes simplemente leen la dirección del flujo en su posición actual y se mueven. Las verificaciones de distancia en el objetivo los detienen cuando llegan. El campo se recalcula solo cuando cambian los obstáculos o los objetivos, lo que lo hace mucho más barato que ejecutar búsquedas A* individuales para cientos de unidades.
Esta técnica se usa en juegos de estrategia en tiempo real, juegos de defensa de torres y cualquier escenario con multitudes densas de unidades que se mueven de forma independiente. El hilo común es que el campo de distancia hace doble trabajo: sus valores codifican la longitud de la ruta hasta el objetivo, y su gradiente codifica la dirección del siguiente paso.
Campos de Distancia vs Mallas de Navegación para Búsqueda de Rutas
| Propiedad | Malla de navegación | Campo de distancia |
|---|---|---|
| Consulta de distancia al obstáculo más cercano | Búsqueda del punto más próximo en polígonos | Evaluación de campo única |
| Espacio libre en un punto | Aproximado o por polígono | Exacto desde el campo |
| Búsqueda de rutas | A* sobre un grafo de polígonos | Dijkstra o A* sobre rejilla, o campo de flujo |
| Memoria | Datos poligonales compactos | Muestras de rejilla, dependiente de la resolución |
| Obstáculos dinámicos | Reconstruir regiones | Recalcular o actualizar localmente el campo |
| Comportamiento de seguir paredes | Trucos de suavizado de rutas | Dirección natural por gradiente |
Las dos representaciones son complementarias en la práctica. Las navmeshes destacan en la búsqueda de rutas de largo alcance con grafos escasos y eficientes, y son la opción estándar cuando los agentes necesitan regiones transitables exactas con enlaces, puertas y escaleras. Los campos de distancia destacan en las decisiones locales: verificaciones de espacio libre, desplazamiento de obstáculos y enrutamiento de multitudes densas. Un sistema de IA de producción suele usar ambos: una navmesh para rutas globales y un EDF horneado para la dirección y colocación local.
La principal limitación del enfoque de campo de distancia es el costo de memoria y actualización. Un EDF 3D sobre un nivel grande consume memoria dependiente de la resolución de la rejilla, y hornearlo es un paso de preprocesamiento que debe repetirse cuando el nivel cambia. Son las mismas compensaciones que se cubren en los campos de distancia con signo horneados , aplicadas aquí a los datos de navegación en lugar de a los datos de renderizado.
Resumen
La navegación convierte el contrato de los SDF en tres cargas de trabajo de IA:
- Consultas de espacio libre y colocación leen directamente los valores del EDF: ¿es seguro este lugar para una unidad de radio ?
- Dirección basada en gradiente usa el gradiente del EDF como una señal de error con signo que aleja a las unidades demasiado cercanas y atrae a las demasiado lejanas hacia el desplazamiento preferido.
- Campos de flujo convierten la ecuación eikonal en un único campo vectorial global que enruta a multitudes enteras.
La misma representación de campo horneado alimenta las consultas de colisión que se ejecutan sobre la misma geometría estática del nivel, así que un solo horneado sirve tanto al sistema de IA como al sistema de física.