Estoy intentando encontrar una solución a este problema. Estoy tratando de construir una malla de navegación en el formato de una cuadrícula de vértices bloqueados en coordenadas x, y con piso en forma de cuadrados para el espacio 3D. Pero tengo problemas para tratar de encontrar una manera de hacerlo.
Intenté buscar en la biblioteca de Recast. Es un método bastante robusto, pero aparentemente se ralentiza con mapas más grandes y espacios abiertos. Tampoco sé cómo generan vértices y bordes para el espacio mundial con el mapa de altura.
Mi siguiente pensamiento fue hacer lo que solía hacer Unreal Engine 3.
https://udn.epicgames.com/Three/NavigationMeshReference.html
Lo cual era usar rayos para generar la malla. No pude encontrar la manera de detener los rayos.
Entonces ... mi siguiente opción era la caja, posiblemente un molde de caja. Cree un volumen subdividido con un tamaño que sea una potencia de 2. Alinee el cuadro con la cuadrícula y dispare los prismas rectangulares hacia abajo como un rayo. Si cae sobre una pieza de geometría que es parte del suelo y el rectángulo no se cruza, deja un cuadrado allí. Y continúe hacia abajo hasta alcanzar los límites del volumen. Para verificar si los bordes deben estar vinculados, supongo que podría verificar si la pendiente entre dos pares de vértices está dentro de la pendiente transitable, fusionarlos si esto es cierto.
Mis principales problemas son ... esto no parece ser muy óptimo. Sin pensarlo, en la estimación, el proceso es O (N ^ 3) para un nivel multicapa. Lo que puede ser bastante desagradable.
Y el último bit es para crear automáticamente grupos rectangulares de estos cuadrados. No estoy completamente seguro de cómo hacer esto. La implementación de Unreal los separa por pendientes. Sin embargo, estoy tratando de mantener el formato de cuadrícula. Entonces eso no es del todo necesario. El problema sigue siendo la creación de grandes mosaicos rectangulares para dividir el proceso de búsqueda de ruta en una base por mosaico. Los azulejos no pueden ser demasiado grandes ni demasiado pequeños.
Entonces las preguntas son ...
¿Cuál sería una manera eficiente de generar este navmesh ceñido? ¿Y cuál sería una buena forma de crear los mosaicos?
Respuestas:
Un mundo 3D básico podría estar representado por una malla de navegación que se puede construir convenientemente en la mayoría de los motores de juego. El actor puede viajar a lo largo de los bordes de los polígonos.
Esa sería una solución simple. Hay muchos algoritmos para encontrar rutas y generar una malla de navegación.
Me gustaría compartir algo que leí hace un tiempo.
Esto describe una posible solución donde podemos dividir nuestro mundo de juego en fichas cuadradas. cada vez que se agrega una ficha cuadrada al juego (cuando el jugador se acerca a un área / terreno de procedimiento), se agrega una ficha cuadrada. Sin embargo, ya no tenemos que calcular todo el navmesh. simplemente lo calculamos para ese mosaico y lo agregamos al gráfico existente. Aumento significativo del rendimiento allí.
El siguiente problema abordado es el movimiento irregular del ejemplo anterior. Puedo entender que al considerar giros futuros y generalizar la dirección reduciría mucho el movimiento en zigzag y haría que el movimiento sea fluido. Los juegos con animación detallada no lo delatan, pero puedes notar esto en algunos juegos de mundo abierto donde supongo que la navegación está horneada principalmente.
En cuanto a la pregunta, le recomendaría que consulte la respuesta de Kromster en una lista de algoritmos de generación de navmesh.
También echa un vistazo a The AI Systems of Left 4 Dead del cual forman parte los ejemplos. Muchos más temas interesantes cubiertos
Buena suerte.
fuente
Hay muchas maneras, ¿por qué no solo hacer que sea local para el jugador, hacer una pequeña cuadrícula que siga al jugador y verifique debajo de cada intersección si es transitable o no, como si hubiera un piso allí y haga un rayo para ver si hay un muro / edificio en cualquier lado próximo ...
fuente
Este es un problema que he visto en todas partes. El truco es "separación de preocupaciones". "¿Decir qué?", Te escuché pensar. Lo que se muestra en la pantalla NO es lo que es la "estructura de datos". Mantener los elementos visuales separados de los datos para construir el elemento visual es importante. Hacerlo siempre "preparará para el futuro" su juego cuando se lancen nuevas versiones de software subyacentes.
Cree una estructura de datos (también conocido como: modelo) que represente su mundo de juego. Luego construya una "vista" del modelo de estructura de datos. Si desea cambiar el mundo de una cuadrícula de tablero de ajedrez a una cuadrícula hexagonal, la estructura de datos (modelo) permanece igual, pero la pantalla "pintará" (renderizará) una vista diferente.
fuente
Haz una doble matriz. Y luego, si un objeto / objetos son intransitables, tenga un método para indicarle a la matriz que la posición no es transitable. Cuando una IA intenta moverse, mirarán la matriz doble y verán si es pasable.
fuente