O que é script de geometria?
Script de geometria é um plugin da Unreal Engine que contém um conjunto de bibliotecas de funções que podem gerar e editar a geometria da malha usando Blueprints (BP) e Python. Para ver todas as funções disponíveis, consulte Referência de script de geometria .
Os nós "UFunctions" e de Blueprint do script de geometria operam em objetos "UDynamicMesh", que são objetos criados usando a estrutura de dados de malha triangular C++ "FDynamicMesh3" em C++. Essa é a mesma estrutura de dados usada pelo plugin Geometry Processing e pelo modo de editor de modelagem.
Você pode usar o script de geometria em Editor Utility Widgets e Asset Actions para criar ferramentas personalizadas de análise, processamento e edição de malha. Você também pode usá-lo em Blueprints de ator para criar objetos procedural e implementar consultas geométricas complexas.
O script de geometria tem vários usos potenciais:
- Testar e analisar a qualidade de importadores de malha de terceiros.
- Analisar UV de malha para identificar ativos com espaço de textura desperdiçado.
- Mesclar ativos de malha para fluxos de trabalho de produção.
- Atores de malha procedural, como as ferramentas de design de nível usadas no Jogo de amostra Lyra.
Como habilitar o plugin
Para usar o script de geometria, o plugin associado deve estar habilitado.
Para habilitar o plugin ou verificar se ele já está habilitado:
-
Na barra de menus, selecione Edit > Plugins.
-
Na barra de pesquisa, digite "script de geometria".
- Habilite o plugin Geometry Scripting e selecione Yes na janela pop-up da caixa de diálogo.
- Reinicie a engine.
Objetos de malha dinâmica
O script de geometria opera em vários novos tipos de objeto:
- "UDynamicMesh"
- "UDynamicMeshComponent"
- "ADynamicMeshActor"
De modo semelhante à malha estática, ao componente de malha estática e à arquitetura de ator de malha estática, essas classes não são parte específica do plugin de script de geometria. Estão localizadas no módulo Geometry Framework da engine e podem ser usadas separadamente do script de geometria.
Malha dinâmica
O componente principal que habilita o script de geometria é o objeto "UDynamicMesh". Esse "UObject" é um contêiner para uma estrutura de dados de malha não vinculada a um componente específico. Isso difere das abordagens anteriores da Unreal Engine, como "UProceduralMeshComponent", pois a geometria da malha pode ser criada e manipulada sem uma representação explícita da cena.
Por exemplo, uma "UDynamicMesh" pode ser inicializada com base em uma "UStaticMesh", editada e armazenada de volta no ativo. Em combinação com widgets utilitários do editor para fornecer a interface de usuário, os artistas técnicos podem criar ferramentas personalizadas de edição de malha em Blueprint ou operações de consulta e edição de ativos de malha de código via Python.
Você também pode converter vários tipos de geometria de ator de e para "UDynamicMesh", como volumes de jogabilidade.
Componente de malha dinâmica
Além de "UDynamicMesh", "UDynamicMeshComponent" foi promovido para um componente "real" (não transitório e serializável). Esse componente é semelhante a um "UProceduralMeshComponent". No entanto, ele é apoiado por uma "UDynamicMesh", que você pode manipular usando o script de geometria.
O "UDynamicMeshComponent" foi desenvolvido ao longo dos últimos anos como parte do conjunto de ferramentas de modelagem de malha, fornecendo pré-visualizações em tempo real da edição de malha. Semelhante a "UProceduralMeshComponent", ela permite atualizações na geometria da malha, atualização de atributos de vértice e criação e modificação de toda a topologia da malha. Você pode realizar essas atualizações no editor e em tempo de execução.
O traçado de raios é suportado, mas o Nanite e o Lumen não.
Ator de malha dinâmica
"ADynamicMeshActor" é semelhante a "AStaticMeshActor", pois é um contêiner para um "UDynamicMeshComponent". No entanto, atores de malha dinâmica fornecem suporte específico para Blueprints de ator que desejam implementar a geração procedural de malha com base em uma "UDynamicMesh".
Com atores de malha dinâmica, as ferramentas de script de geometria e modo de modelagem podem criar e editar qualquer tipo de ator de malha, além de volumes.
Ator de malha dinâmica gerado
"AGeneratedDynamicMeshActor" é uma subclasse de "ADynamicMeshActor" que fornece suporte adicional para a implementação de atores de malha procedural baseados em Blueprint. Especificamente, essa classe oferece a função On Rebuild Generated Mesh que pode ser implementada em subclasses do BP para gerar uma malha em vez de fazer isso no Construction Script. A função fornece um melhor desempenho interativo no editor e deixa a porta aberta para a geração de geometria procedural em larga escala com um gerenciamento mais cuidadoso no futuro.
O Event On Rebuild Generated Mesh só existe em Blueprints de ator derivados da classe GeneratedDynamicMeshActor. Além disso, a função Generated Dynamic Mesh Actor está disponível apenas no editor.
Principais diferenças entre UStaticMesh e UDynamicMesh
Ao contrário de "UStaticMesh", "UDynamicMesh" não é um ativo. Um "UDynamicMeshComponent" é proprietário de um "UDynamicMesh", em vez de ser compartilhado por diversos componentes, como em uma "UStaticMesh". Essa diferença significa que, por exemplo, a renderização por instância não está disponível.
Uma malha dinâmica é armazenada apenas em um nível, não em um arquivo de ativo separado. Duplicar um "UDynamicMeshComponent" cria uma cópia da malha (criando uma nova malha em vez de uma instância). A transferência entre níveis ou projetos deve ser feita copiando e colando.
De muitas maneiras, o "UDynamicMeshComponent" se comporta mais como objetos de malha em uma ferramenta de criação de conteúdo digital, como Autodesk 3ds Max, Autodesk Maya ou Blender. Esse processamento introduz possíveis problemas com malhas enormes que aumentam drasticamente o tamanho do arquivo de nível. No entanto, com um arquivo por ator, os dados da malha são armazenados com o arquivo de ator OFPA em vez do nível (portanto, ainda é potencialmente grande, mas em um arquivo separado).
Padrão de função
A maioria das funções do script de geometria segue um padrão semelhante ao nó Apply Mesh Plane Cut mostrado a seguir.
O primeiro argumento, Target Mesh, é a "UDynamicMesh" editada pela operação. Em geral, as operações de script de geometria modificam a malha de entrada em vez de criar uma nova malha para evitar a criação de vários objetos de malha temporários. A entrada "UDynamicMesh" é sempre retornada como uma saída, também chamada de Target Mesh ("same name == same Object"). Essa configuração facilita o encadeamento de várias operações em sequência.
Os nós de script de geometria têm muitos parâmetros e configurações. Expomos as opções usadas com mais frequência como argumentos, mas você pode encontrar opções adicionais em uma estrutura Options específica da operação. A maneira mais comum de criar a estrutura de opções adequada é arrastar do pin Options vazio. Além disso, você pode clicar com o botão direito no pin Options e usar o item de menu de contexto Split Struct Pin para expandir a estrutura Options no nó, como mostrado a seguir.
A maioria dos nós também tem um pin Debug para fornecer suporte à depuração geométrica para geradores de malha. Isso não está sendo usado ativamente, mas é um substituto para uma funcionalidade futura.
Uso de pools de UDynamicMesh
É comum criar malhas temporárias dentro de um gerador de malha, como usar uma malha primitiva para subtrair da malha principal. Para isso, é necessária uma "UDynamicMesh" temporária. Embora seja possível criar uma usando a função Construct Object From Class, você deve coletar a malha após o uso. No entanto, se você pretende executar o gerador com frequência, é mais eficiente reutilizar a malha entre execuções.
O ator de malha dinâmica tem suporte integrado para usar um "UDynamicMeshPool". Você pode usar essa configuração chamando Allocate Compute Mesh para obter uma malha temporária e, em seguida, liberá-la em algum lugar antes do final do caminho de execução do Blueprint. Cada malha temporária pode ser liberada explicitamente usando Release Compute Mesh, ou chamando Release All Compute Meshes, que retorna quaisquer malhas temporárias alocadas do pool no momento.
Em um widget de utilitário do editor, não há uma instância padrão do conjunto de malhas dinâmicas a partir da qual as malhas podem ser alocadas. No entanto, você pode usar Create Dynamic Mesh Pool para criar uma (por exemplo, como uma variável no widget de utilitário do editor ou no Blueprint de utilitário).
Como criar uma malha procedural
Como mencionado, um caso de uso do script de geometria é a criação de malhas procedurais usando Blueprints de atores. O exemplo a seguir usa uma subclasse de BP de Generated Dynamic Mesh Actor. O Event On Rebuild Generated Mesh preenche a "UDynamicMesh" de um "UDynamicMeshComponent". A "UDynamicMesh" é passada para uma função de script de geometria Append Box, que cria uma malha com base nas variáveis de entrada.
O código cria uma malha primitiva de caixa paramétrica com parâmetros que os artistas podem ajustar no editor com apenas alguns nós de BP. Ao adicionar nós, você pode compilar geradores de malha cada vez mais complexos diretamente nos Blueprints. Para expandir esse código e continuar aprendendo sobre o script de geometria, consulte Script de geometria por meio de Blueprints.

Notas adicionais
Para verificar a existência de uma função específica, confira a documentação Referência a script de geometria.
Algumas funções (como Apply PolyGroup Catmull Clarck SubD) são exclusivas do editor. Essa configuração significa que você só pode usar essas funções nas subclasses Editor Utility Actors/Actions/Widgets ou Generated Dynamic Mesh Actor BP.
A maioria das funções do script de geometria só funciona com objetos "UDynmicMesh". Existem funções para converter as representações internas da malha de uma malha estática, malha esquelética ou ator de volume em uma "UDynamicMesh", assim como funções para reconverter. Não existem funções para outros tipos de geometria, como paisagem, caches ou coleções de geometria, tratamentos e tecido.
No momento, "UDynamicMeshComponent" não é compatível com as seguintes funcionalidades:
- Nanite (Nanite)
- Lumen
- Campo de distância da malha
- LODs
- Renderização instanciada
Blueprints de ator e Blueprints do utilitário do editor são sempre executados no thread de jogo. Portanto, as funções do script de geometria chamadas também são executadas no thread de jogo. Algumas funções de script de geometria realizam partes do trabalho em threads de tarefas internamente, por exemplo, chamadas C++ para ParallelFor, Async ou "UE::Tasks::Launch()". No entanto, isso ocorre apenas no contexto de uma única função, e a função não retornará até que todo o trabalho paralelo esteja concluído.