¿Qué es el secuenciación de comandos de geometría?
Geometry Script es un complemento de Unreal Engine que contiene un conjunto de bibliotecas de funciones que pueden generar y editar geometría de malla a través de blueprints (BP) y Python. Para ver todas las funciones disponibles, consulta Referencia de Geometry Script.
Las UFunctions de Geometry Script y los nodos de Blueprint operan en objetos UDynamicMesh, que se crean con la estructura de datos de triángulos FDynamicMesh3 de C++. Se trata de la misma estructura de datos que usan el complemento Geometry Processing y el modo de editor de modelado.
Se puede usar el complemento Geometry Script en los widgets de utilidad del editor y las acciones de recursos para crear herramientas personalizadas de análisis, procesamiento y edición de mallas. También puedes usarlo en blueprints de actor para crear objetos procedimentales e implementar consultas geométricas complejas.
La secuenciación de comandos de geometría tiene varios usos potenciales: Pruebas y análisis de calidad de importadores de mallas de terceros. Analizar los UV de malla para identificar recursos con espacio de texturas desperdiciado. Fusión programada de recursos de malla para procesos de trabajo de producción. Actores de malla procedimental, como las herramientas de diseño de niveles usadas en el juego de muestra Lyra.
Cómo habilitar el complemento
Para poder usar la secuenciación de comandos de geometría es necesario tener activado el complemento asociado.
Para habilitar el complemento o comprobar si ya lo está:
-
En la barra de menús, selecciona Editar > Complementos.
-
En la barra de búsqueda, escribe «Geometry Script».
- Activa el complemento Geometry Script y selecciona Sí en el cuadro de diálogo emergente.
- Reinicia el motor.
Objetos de malla dinámica
El complemento Geometry Script funciona con varios tipos de objetos nuevos:
UDynamicMesh
UDynamicMeshComponent
* ADynamicMeshActor
Al igual que en la arquitectura de malla estática, componente de malla estática y actor de malla estática, estas clases no forman parte específicamente del complemento Geometry Script. Se encuentran en el módulo del motor Geometry Framework y se pueden usar fuera del complemento Geometry Script.
Malla dinámica
El componente principal que permite la secuenciación de comandos de geometría es el objeto UDynamicMesh. Este UObject es un contenedor para una estructura de datos de malla que no está vinculada a un componente específico. Esto difiere de enfoques anteriores de Unreal Engine como el UProceduralMeshComponent en el sentido de que la geometría de malla se puede crear y manipular sin una representación de escena explícita.
Por ejemplo, una UDynamicMesh puede inicializarse a partir de una UStaticMesh, editarse y volver a almacenarse en el recurso. En combinación con los widgets de utilidad del editor para crear la interfaz de usuario, los artistas pueden crear herramientas de edición de malla personalizadas en Blueprint o secuenciar las operaciones de consulta y edición de recursos de malla a través de Python.
También puedes convertir varios tipos de geometría de actor desde *UDynamicMesh`, como volúmenes de jugabilidad.
Componente de malla dinámica
Además de UDynamicMesh, se ha promocionado UDynamicMeshComponent a un componente «real» (no transitorio, serializable). Este componente es similar a un UProceduralMeshComponent; sin embargo, cuenta con una UDynamicMesh como respaldo, la cual se puede manipular con Geometry Script.
El componente UDynamicMeshComponent se ha desarrollado en los últimos años como parte del conjunto de herramientas de modelado de mallas, proporcionando previsualizaciones en tiempo real de la edición de mallas. De forma similar a UProceduralMeshComponent, admite actualizaciones de la geometría de la malla, actualizando los atributos de vértice y creando y modificando la topología de toda la malla. Puedes realizar estas actualizaciones dentro del editor y en tiempo de ejecución.
Es compatible con el trazado de rayos; sin embargo, no lo es con Nanite y Lumen.
Actor de malla dinámica
ADynamicMeshActor se parece a AStaticMeshActor en que, básicamente, es un contenedor para un UDynamicMeshComponent. Sin embargo, los actores de malla dinámica proporcionan soporte específico para blueprints de actor que quieran implementar la generación procedimental de mallas basadas en una UDynamicMesh.
Con los actores de malla dinámica, las herramientas de Geometry Script y del modo de modelado pueden crear y editar cualquier tipo de actor de malla además de los volúmenes.
Actor de malla dinámica generado
AGeneratedDynamicMeshActor es una subclase de ADynamicMeshActor que proporciona soporte adicional para implementar actores de malla procedimental basados en blueprints. En concreto, esta clase ofrece la función En la malla generada reconstruida, que puede implementarse en subclases del BP para generar una malla en lugar de tener que hacerlo en la secuencia de comandos de construcción. La función proporciona un mejor rendimiento interactivo en el editor y deja la puerta abierta a una generación de geometría procedimental a gran escala gestionada con más cuidado en el futuro.
Evento al reconstruir la malla generada solo existe en blueprints de actor derivados de la clase GeneratedDynamicMeshActor. Además, la función Actor de malla dinámica generado actualmente solo está disponible en el editor.
Diferencias clave entre UStaticMesh y UDynamicMesh
A diferencia de UStaticMesh, UDynamicMesh no es un recurso. Un UDynamicMeshComponent posee su propia UDynamicMesh; en lugar de poses compartidas entre varios componentes, como una UStaticMesh.
Esta diferencia implica, por ejemplo, que no es posible crear instancias de renderizado.
Una malla dinámica se almacena solo en un nivel en lugar de en un archivo de recurso independiente. Al duplicar un UDynamicMeshComponent, se crea una copia de la malla (una nueva malla en lugar de una instancia). La transferencia entre niveles o proyectos debe hacerse copiando y pegando.
En muchos sentidos, UDynamicMeshComponent se comporta más como objetos de malla en una herramienta de creación de contenido digital (DCC), como Autodesk 3ds Max, Autodesk Maya o Blender. Esto introduce problemas potenciales con mallas enormes que aumentan drásticamente el tamaño del archivo del nivel. Sin embargo, con Un archivo por actor, los datos de la malla se almacenan con el archivo de actor OFPA en lugar de con el nivel (puede seguir siendo enorme, pero en un archivo separado).
Patrón de funciones
La mayoría de las funciones de secuenciación de comandos de geometría siguen un patrón estándar similar al del nodo Apply Mesh Plane Cut que se muestra a continuación.
El primer argumento, Malla objetivo, es la UDynamicMesh editada por la operación. Por lo general, las operaciones de secuenciación de comandos de geometría modifican la malla de entrada en lugar de crear una nueva para evitar crear varios objetos de malla temporales. La entrada UDynamicMesh siempre se devuelve como salida, también llamada Malla objetivo (mismo nombre == mismo objeto). Esta configuración facilita encadenar múltiples operaciones en secuencia.
Los nodos de Geometry Script tienen muchos parámetros y ajustes. Hemos expuesto las opciones más usadas como argumentos, pero puedes encontrar más opciones en la estructura de opciones específica de cada operación. La forma más común de crear la estructura de opciones adecuada es arrastrar desde el pin Opciones vacío. Además, puedes hacer clic derecho en el pin Opciones y usar el elemento del menú contextual Dividir pin de estructura para expandir directamente la estructura de opciones en el nodo, tal y como se muestra a continuación.
La mayoría de nodos también tienen un pin de depuración que permite la depuración geométrica de los generadores de malla. No se está usando de forma activa, pero es un marcador de posición para futuras funciones.
Cómo usar grupos de UDynamicMesh
Es habitual crear mallas temporales dentro de un generador de mallas, como usar una malla primaria para sustraerla de la malla principal. Para ello, se necesita una UDynamicMesh temporal. Aunque puedes crear una usando la función Construir objeto desde clase, debes usar un recolector de basura en la malla después de usarla. Sin embargo, si vas a ejecutar el generador con frecuencia, es más eficiente reutilizar la malla entre ejecuciones.
El actor de malla dinámica tiene soporte integrado para esto usando un UDynamicMeshPool. Puedes usar esta configuración haciendo una llamada a Asignar malla de cálculo para obtener una malla temporal y luego liberarla en algún lugar antes del final de la ruta de ejecución del blueprint. Cada malla temporal puede liberarse explícitamente con Liberar malla de cálculo o llamando a Liberar todas las mallas de cálculo, que devuelve cualquier malla temporal asignada actualmente del grupo.
En un widget de utilidad del editor, no hay una instancia de grupo de malla dinámica por defecto desde la que asignar mallas. Sin embargo, puedes usar Crear un grupo de mallas dinámicas para crear uno (por ejemplo, como variable en el widget de utilidad del editor o el blueprint de utilidad).
Creación de una malla procedimental
Como ya hemos dicho, un ejemplo de uso de la secuenciación de comandos de geometría es la creación de mallas procedimentales con blueprints de actor. En el ejemplo de abajo, se usa una subclase de BP de actor de malla dinámica generado. El Evento al reconstruir la malla generada rellena la UDynamicMesh de un UDynamicMeshComponent. La UDynamicMesh se pasa a una función de secuenciación de comandos de geometría Anexar caja, que crea una malla basada en las variables de entrada.
La secuencia de comandos crea una malla primaria de caja paramétrica con parámetros que los artistas pueden ajustar en el editor con unos pocos nodos de BP. Al añadir más nodos, puedes construir generadores de malla cada vez más complejos directamente en blueprints. Para ampliar esta secuencia y seguir aprendiendo sobre las secuenciación de comandos de geometría, consulta Secuenciación de comandos de geometría a través de blueprints.

Notas adicionales
Para comprobar si existe una función específica, consulta la documentación Referencia sobre secuenciación de comandos de geometría.
Algunas funciones (como Apply PolyGroup Catmull Clark SubD) son exclusivas del editor. Este ajuste significa que solo puedes usar estas funciones en las subclases de actores/acciones/widgets de la utilidad del editor o en las subclases de BP de actor de malla dinámica generada.
La mayoría de las funciones de secuenciación de comandos de geometría solo funcionan con objetos UDynmicMesh. Hay funciones para convertir las representaciones internas de la malla de un actor de malla estática, malla esquelética o volumen en un UDynamicMesh, así como funciones para volver a convertirlas. No existen funciones para otros tipos de geometría, como paisajes, cachés o colecciones de geometría, el renderizados capilares y telas.
Actualmente, UDynamicMeshComponent no es compatible con las siguientes funciones:
- Nanite
- Lumen
- Campo de distancia de malla
- LODs
- Renderizado instanciado
Los blueprints de actor y los blueprints de la utilidad del editor siempre se ejecutan en el subproceso de juego, por lo que las funciones de secuenciación de comandos de geometría a las que se llama también se ejecutan en el subproceso de juego. Algunas funciones de secuenciación de comandos de geometría realizan internamente parte de su trabajo en subprocesos de tarea. Por ejemplo, las llamadas de C++ a ParallelFor, Async o UE::Tasks::Launch(). Sin embargo, esto solo ocurre en el contexto de una sola función, y la función no se devolverá hasta que se haya completado todo el trabajo en paralelo.