Geometria processual
Existem várias maneiras de gerar geometria proceduralmente no Godot. Nesta série de tutoriais, exploraremos algumas delas. Cada técnica tem seus próprios benefícios e limitações, portanto é melhor compreender cada uma e como ela pode ser útil em uma determinada situação.
Nota
Todos os métodos de geração procedural de geometria descritos aqui são executados na CPU. O Godot ainda não oferece suporte à geração de geometria na GPU.
O que é geometria?
Geometria é uma forma elegante de dizer forma. Em computação gráfica, a geometria é tipicamente representada por um array de posições chamado "vértices". No Godot, a geometria é representada por Meshes.
O que é uma Malha?
Muitas coisas no Godot têm "mesh" no nome: o Mesh, o ArrayMesh, o ImmediateMesh, o MeshInstance3D, o MultiMesh, e o MultiMeshInstance3D. Embora todos estejam relacionados, eles têm usos ligeiramente diferentes.
Meshes e ArrayMeshes são recursos, os quais são desenhados usando um nó MeshInstance3D. Recursos como Meshes e ArrayMeshes não podem ser adicionados diretamente à cena. Um MeshInstance3D representa uma instância de uma mesh na sua cena. Você pode reutilizar uma única mesh em vários MeshInstance3Ds para desenhá-la em diferentes partes da cena com materiais ou transformações diferentes (escala, rotação, posição etc.).
Se você pretende desenhar o mesmo objeto várias vezes, pode ser útil usar um MultiMesh com um MultiMeshInstance3D. MultiMeshInstance3Ds desenham meshes milhares de vezes de forma muito eficiente aproveitando o instanciamento via hardware. A desvantagem de usar um MultiMeshInstance3D é que cada superfície da mesh é limitada a um único material para todas as instâncias. Ele utiliza um array de instâncias para armazenar cores e transformações diferentes para cada instância, mas todas as instâncias de cada superfície usam o mesmo material.
O que é uma malha
Uma Mesh é composta por uma ou mais superfícies. Uma superfície é um array composto por múltiplos sub-arrays contendo vértices, normais, UVs, etc. Normalmente, o processo de construção de superfícies e meshes é oculto do usuário no RenderingServer, mas com ArrayMeshes, o usuário pode construir uma Mesh manualmente passando um array contendo as informações da superfície.
Superfícies
Cada superfície possui seu próprio material. Alternativamente, você pode substituir o material de todas as superfícies da Mesh ao usar um MeshInstance3D, utilizando a propriedade material_override.
Matriz de superfície
O array de superfícies é um array com comprimento ArrayMesh.ARRAY_MAX. Cada posição do array é preenchida com um sub-array contendo informações por vértice. Por exemplo, o array localizado em ArrayMesh.ARRAY_NORMAL é um PackedVector3Array de normais dos vértices. Veja Mesh.ArrayType para mais informações.
O array de superfície pode ser indexado ou não indexado. Criar um array não indexado é tão simples quanto não atribuir um array no índice ArrayMesh.ARRAY_INDEX. Um array não indexado armazena informações únicas de vértice para cada triângulo, o que significa que, quando dois triângulos compartilham um vértice, o vértice é duplicado no array. Um array de superfície indexado armazena informações de vértices apenas para cada vértice único e também armazena um array de índices que define como construir os triângulos a partir do array de vértices. Em geral, usar um array indexado é mais rápido, mas isso implica compartilhar dados de vértices entre triângulos, o que nem sempre é desejado (por exemplo, quando se deseja normais por face).
Ferramentas
O Godot oferece diferentes formas de acessar e trabalhar com geometria. Mais informações sobre cada uma delas serão fornecidas nos tutoriais a seguir.
ArrayMesh
O recurso ArrayMesh estende Mesh para adicionar algumas funções que facilitam o uso e, mais importante, a capacidade de construir uma superfície de Mesh via script.
Para obter mais informações sobre o ArrayMesh, consulte o tutorial do ArrayMesh.
MeshDataTool
O MeshDataTool é um recurso que converte dados de uma Mesh em arrays de vértices, faces e arestas que podem ser modificados em tempo de execução.
Para mais informações sobre o MeshDataTool, consulte o tutorial MeshDataTool.
Ferramenta de Superfície
O SurfaceTool permite a criação de Meshes usando uma interface no estilo do modo imediato do OpenGL 1.x.
Para obter mais informações sobre a SurfaceTool, consulte o tutorial da SurfaceTool.
ImmediateMesh
ImmediateMesh é uma mesh que usa uma interface no estilo do modo imediato (como o SurfaceTool) para desenhar objetos. A diferença entre o ImmediateMesh e o SurfaceTool é que o ImmediateMesh é desenhado diretamente por meio de código de forma dinâmica, enquanto o SurfaceTool é usado para gerar uma Mesh com a qual você pode fazer o que quiser.
ImmediateMesh é útil para prototipagem devido à sua API simples, mas é lento porque a geometria é reconstruída toda vez que uma alteração é feita. Ele é mais útil para adicionar geometria simples para depuração visual (por exemplo, desenhar linhas para visualizar raycasts de física etc.).
For more information about ImmediateMesh, please see the ImmediateMesh tutorial.
Qual devo usar?
A abordagem que você usa depende do que você está tentando fazer e com que tipo de procedimento você se sente confortável.
Tanto o SurfaceTool quanto o ArrayMesh são excelentes para gerar geometria estática (meshes) que não mudam com o tempo.
Usar um ArrayMesh é ligeiramente mais rápido do que usar um SurfaceTool, mas a API é um pouco mais complexa. Além disso, o SurfaceTool possui alguns métodos que facilitam o uso, como generate_normals() e index().
ImmediateMesh é mais limitado do que ArrayMesh e SurfaceTool. No entanto, se você precisa que a geometria mude a cada frame, ele oferece uma interface muito mais simples que pode ser ligeiramente mais rápida do que gerar um ArrayMesh a cada frame.
O MeshDataTool não é rápido, mas oferece acesso a todos os tipos de propriedades da mesh que você não obtém com as outras abordagens (arestas, faces, etc.). Ele é extremamente útil quando você precisa desse tipo de dado para transformar a mesh, mas não é uma boa ideia usá-lo se essas informações extras não forem necessárias. O MeshDataTool é mais indicado quando você pretende usar um algoritmo que exige acesso ao array de faces ou arestas.