Caminos procesales en Houdini y Unity

imagen

Para mi juego Frameshift post-apocalíptico , necesitaba llenar un mundo abierto muy grande con diversas ciudades. Nuestro equipo tiene solo 3 personas, ¡así que, por supuesto, usé el poder de procedimiento de Houdini!

Anteriormente, cuando no sabía sobre Houdini, escribí en C # mis propias herramientas para la generación de mallas de procedimiento para Unity. Agregar nuevas funciones fue un proceso muy largo, y cuando escuché una vez que Houdini está diseñado para tales tareas, inmediatamente cambié a él. Experimenté con diferentes formas de generar ciudades y calles, y en este artículo hablaré brevemente sobre la técnica que finalmente utilicé para el juego.

Primero, creé una herramienta para generar una red de calles que podrían usarse en la ciudad. Mi decisión se basa en los conceptos presentados aquí , así como en el artículo utilizado como referencia. Se habla mucho sobre los campos tensoriales y los vectores propios, y todo está escrito de manera muy técnica, pero en pocas palabras se puede explicar de la siguiente manera: para mi caso (generar una red de carreteras en un relieve) necesitaba generar líneas de contorno del relieve, así como líneas perpendiculares a ellos.

Comencé con el relieve, y gracias a un poco de ayuda del ejemplo de Houdini Gubbins, generé vectores en cada punto del relieve dirigido hacia el camino, y líneas de gradiente usando VEX:

imagen

Los vectores amarillos muestran líneas de contorno.

Luego, necesitamos crear una cuadrícula de calles de la ciudad y mezclar sus vectores con vectores que repitan las curvas naturales del relieve. Entonces crearemos un área que se asemeje a una cuadrícula de calles de la ciudad, combinando bien con el relieve. Aquí colocamos la cuadrícula en el relieve, luego el poliframe para que las normales se alineen a lo largo de las líneas de la cuadrícula, agreguemos una caída para una mezcla suave y finalmente establezcamos un nuevo vector de ruta que sea una mezcla de dos vectores:

imagen

En la imagen de arriba, puede ver que dentro de los bordes del rectángulo las líneas de contorno son más como una cuadrícula. También realizo un proceso similar para agregar la influencia de los caminos creados manualmente al juego. Introduje un control deslizante en Unity HDA para que la influencia se pueda cambiar creando calles más "ubicadas" de forma natural o más dentro de los límites de la ciudad.

A continuación, convertiré los campos vectoriales a VDB para que pueda tomar muestras de ellos para crear carreteras preparadas. Con el seguimiento de volumen SOP puede obtener una hermosa visualización:

imagen

¡Ya está empezando a parecer una cuadrícula de calles! Están demasiado cerca el uno del otro, pero en general ya hay formas. Luego realizamos muchas operaciones de muestreo a partir de velocidades de VDB y muchos vex para crear líneas de carreteras preparadas. El código vex esencialmente organiza las carreteras a la distancia correcta y las termina si están demasiado cerca de otras carreteras o si son demasiado largas:

imagen

Luego realizamos un procesamiento posterior para suavizar todo, eliminar partes pequeñas, alargar los callejones sin salida para crear intersecciones realistas y colocar caminos en el terreno. El resultado final se ve así:

imagen

Todavía hay algunas partes poco realistas, pero una pequeña limpieza manual en Unity es aceptable, dado el tiempo que ahorramos en esto.

Entonces, generamos procesalmente una red de calles de la ciudad, pero el resultado fue solo un montón de curvas en Houdini. Ahora le mostraré cómo generar geometría de carreteras para cada una de estas curvas para crear mallas que pueda usar en Unity. Aquí están nuestros resultados anteriores portados a Unity:

imagen

Primero debe decir cómo se realiza la transferencia de datos entre Houdini y Unity. En el caso de las carreteras, escribo en el archivo JSON una secuencia de puntos, el ancho de la carretera y la superficie de la carretera preestablecida. En Unity, creé herramientas de edición para editar caminos manualmente usando curvas Bezier:

imagen

Puede encontrar muchos tutoriales en los motores de búsqueda sobre cómo crear un editor de curvas Bezier en Unity. Para transferir datos a Houdini, utilizo el nodo Python para leer el archivo JSON:

imagen

Aquí puede ver el resultado de crear una red de calles urbanas, obtenida anteriormente, pero esta vez se lee del archivo JSON, porque ahora se obtiene de Unity con cambios manuales.

También importo un alivio de Unity, leyendo sus datos en bruto. Probablemente hoy se puede hacer de forma nativa con la ayuda de HDA, porque el motor Houdini ha mejorado el soporte para terreno Unity, pero cuando hice este trabajo, todavía no era tan bueno.

Luego creamos las intersecciones. El trabajo principal aquí lo realiza el Intersection Stitch SOP, pero también utilicé VEX para alargar ligeramente las carreteras en caso de que no se cruzaran por completo, y eliminé los extremos cortos para que las intersecciones en T se crearan correctamente.

imagen

A continuación, creo un grupo de intersecciones con la ayuda de una caída desde el punto de intersección, donde la distancia de debilitamiento es igual a la más ancha en la intersección de la carretera. Luego amplío este grupo de bordes en los casos en que el ángulo entre dos caminos es inferior a 45 grados para que haya suficiente espacio entre los dos extremos de la intersección para crear una malla del ancho deseado:

imagen

Los cálculos en el nodo VEX encuentran la hipotenusa de un triángulo rectángulo (podemos suponer que cada parte individual de la intersección consta de dos triángulos rectángulos):

imagen

Como sabemos cuál debe ser el ancho de las carreteras del grupo de intersección (indicado en la figura anterior como A) y conocemos el ángulo a, podemos calcular C para encontrar la distancia por la cual necesitamos expandir el grupo de intersección para dividirlos por el ancho deseado.

Luego creamos grupos de puentes, destacando secciones de carreteras que están por encima de cierta distancia sobre el suelo. Esto se realiza utilizando Ray SOP con la "distancia de intersección de puntos" activada y los "puntos de transformación" desactivados. Luego, para crear curvas preparadas para la geometría de cierre, usamos Polycut para cortar los grupos de intersección y puentes de modo que solo queden caminos comunes.

imagen

Y ahora finalmente estamos comenzando a crear mallas reales. La subred que crea las mallas de intersección es una versión modificada del tutorial Resolver intersecciones . La subred que crea la geometría de la carretera también cierra la línea y crea UV. Hay otro gran tutorial creado por HoudiniSimon. Le indica cómo generar UV para doblar una curva cerrada, pero la primera parte del tutorial se puede aplicar a curvas abiertas.

imagen

Luego, acabo de crear algunos grupos para aplicar los materiales para usar el atributo roadPreset tomado de mis curvas en Unity.

A continuación creamos la geometría de los puentes. La red que se muestra a continuación pasa iterativamente a través de todos los grupos de puentes creados previamente y, dependiendo de la altura sobre el suelo, la longitud y la tortuosidad, inserta un puente a granel o arqueado. Consideraré crear un puente de arco en un tutorial separado, y el puente a granel utiliza el excelente SOP de Geometría de Barrido Gamedev con los grupos de inicio y finalización activados para cerrar la geometría del puente creada previamente a lo largo de la curva del puente.

imagen

Resultado:

imagen

Estas mallas de puente consisten en secciones de inicio / final / medio modeladas manualmente, deformables y duplicadas a lo largo de una curva usando Gamedev Sweep Geometry SOP. Así es como se ven la geometría y los grupos creados manualmente:

imagen

Se selecciona el grupo central, y los extremos están en los grupos bridgeStart y bridgeEnd, que son utilizados por el nodo de cierre de geometría.

Completamos el puente extrudiéndolo un poco para crear un terraplén de camino en el que se aplicará la textura de grava; También se establecen varias variables booleanas para las intersecciones de ciertos tipos de carreteras. Por ejemplo, si un camino de tierra se cruza con una carretera, entonces se trunca.

imagen

Al final, guardamos toda la geometría para usar en Unity y en herramientas adicionales de Houdini. Dividimos las mallas de carreteras en fragmentos más pequeños y los exportamos como FBX, y también guardamos los datos en archivos .bgeo para que puedan usarse más tarde.

imagen

En la unidad:

imagen

imagen

imagen

Espero que hayan disfrutado esta breve descripción de nuestro proceso de creación de geometría de carreteras Houdini. En la próxima publicación hablaré sobre la creación de marcas viales y la nivelación del terreno para que coincida más estrechamente con las carreteras.

Source: https://habr.com/ru/post/478516/


All Articles