5. De heightmap a malha 3D

Vértices, triângulos e cor, montados na mão.

Um heightmap é só uma tabela de alturas. Para virar terreno é preciso construir uma malha: uma lista de vértices (posições) e uma lista de triângulos (trios de índices). Siga os passos: a grade plana, as alturas, os triângulos, o sombreamento e as cores. Arraste no canvas para girar.

Como montar a malha

// vértices: um por ponto do grid (largura × altura)
para z em 0..H-1:
  para x em 0..W-1:
    y = altura[x, z] * multiplicador           // fBm redistribuído
    vertices.push( (x, y, z) )
    uvs.push( (x/(W-1), z/(H-1)) )

// triângulos: dois por quadrado do grid
para z em 0..H-2:
  para x em 0..W-2:
    i = z*W + x                                // índice do canto superior esquerdo
    triangulos.push( i, i+W, i+1 )             // sentido horário = face para cima (Unity)
    triangulos.push( i+1, i+W, i+W+1 )

mesh.vertices = vertices; mesh.triangles = triangulos; mesh.uv = uvs
mesh.RecalculateNormals()
Por que não usar o Terrain do Unity? Ele funciona e é o caminho do tutorial do Brackeys. Mas é um objeto único, quadrado, de tamanho fixo. Na aula 2, o mundo será dividido em chunks que nascem e somem conforme o jogador anda, e para isso cada pedaço precisa ser uma malha comum, que você cria e destrói como qualquer objeto. No Godot, o equivalente é ArrayMesh ou SurfaceTool.
Limite de vértices. Um chunk de 241×241 vértices tem 58 mil vértices e 115 mil triângulos. Malhas com índice de 16 bits param em 65 535 vértices; acima disso use índice de 32 bits ou chunks menores.