For the complete documentation index, see llms.txt. This page is also available as Markdown.

Meshes

Saiba que propriedades de mesh são suportadas em modelos 3D importados para o Decentraland.

Os modelos 3D têm uma malha composta por faces triangulares. Essas faces se encontram umas com as outras nas arestas (as linhas ao longo das quais se tocam) e nos vértices (os pontos onde seus cantos se unem).

💡 Dica: Instale o plugin Decentraland Tools Blender. Inclui várias funções úteis para o ajudar a editar e exportar modelos 3D, wearables e emotes.

Limitações de Espaço

Todos os modelos 3D na sua scene devem caber dentro dos limites de seus parcels. Se qualquer parte dos seus modelos se estender além desses limites ao executar uma preview, essas partes que se estenderem serão cortadas e não serão renderizadas.

No editor do Creator Hub, você verá o modelo tingido de vermelho e sua bounding box marcada em vermelho.

📔 Nota: No antigo cliente Web do Decentraland, por motivos de performance, se qualquer parte de um modelo 3D estivesse fora dos limites, mesmo que fosse apenas a bounding box, então o modelo inteiro não era renderizado. No cliente de desktop do Decentraland 2.0, apenas as partes de um modelo que estão fora dos limites são cortadas. As partes do modelo que estão dentro da scene são renderizadas.

Bounding Boxes

Se você tiver um modelo que tenha todos os seus vértices bem dentro da área da scene, mas que tenha grandes bounding boxes que estejam em sua maior parte vazias e se estendam além dos limites da scene, o modelo inteiro será marcado como fora dos limites da scene no Creator Hub. As partes do modelo que estiverem dentro dos seus parcels serão renderizadas corretamente, e você poderá publicar sua scene.

Toda mesh tem uma bounding box, que circunda os limites da forma. Para tornar um modelo 3D mais utilizável dentro do Decentraland, certifique-se de que suas bounding boxes não se estendam além do modelo mais do que o necessário.

Para evitar esse problema, você pode limpar seus modelos 3D para redefinir as posições e rotações das meshes, de modo que as bounding boxes não se estendam além das meshes que elas envolvem.

No Blender, você pode fazer isso selecionando os objetos, pressionando Ctrl+A e então aplicando “All transforms”.

Por exemplo, tenha cuidado ao rotacionar uma sub-mesh perto da borda do seu modelo. Como as bounding boxes são cubos, mesmo que a mesh seja redonda, os cantos da sua bounding box podem acabar saindo para fora após rotacioná-la em 45°.

Recomendamos que você faça o bake da rotação e da escala de cada mesh no modelo, para garantir que não haja bounding boxes indesejadas se estendendo além do tamanho que elas precisam ter.

Limitações de Triângulos

Como o Decentraland é um open world cheio de diferentes scenes e objects que estão sendo baixados on the fly (no mesmo espaço 3D), é importante otimizar nossas meshes para ter um bom desempenho durante o jogo. Nesse sentido, há algumas limitações de scene que sempre precisamos ter em mente quando se trata de meshes:

n representa o número de parcels que uma scene ocupa.

  • Triângulos: n x 10000 Quantidade total de triângulos para todos os modelos na scene.

  • Altura: log2(n+1) x 20 Altura em metros.

  • Tamanho do arquivo: 15 MB por parcel - 300 MB máx. Tamanho total dos arquivos enviados para o content server. Inclui modelos 3D e áudio. Não inclui arquivos que não são enviados, como pacotes node.js.

  • Tamanho máximo do arquivo: 50 MB por arquivo Nenhum arquivo individual de qualquer tipo na scene pode exceder 50 MB, não importa quantos parcels a scene tenha.

Para mais informações, confira todas as limitações da scene aqui.

Meshes em Scenes Grandes

Ao criar meshes, devemos ter em mente estas 2 boas práticas:

  • Modularidade: Divida meshes grandes em partes menores e modulares. Por exemplo, em vez de ter uma única mesh para um prédio inteiro, o prédio poderia ser dividido em meshes separadas para cada parede, piso e seção do prédio. Isso permite que o frustum culling do Unity funcione de forma mais eficaz, pois apenas as partes visíveis precisam ser consideradas para renderização. Isso também melhorará o uso de memória, porque uma mesh pode ser reutilizada várias vezes para o mesmo objeto em diferentes locais (para conseguir isso, você precisará referenciar a mesma mesh na definição da sua scene SDK7 ou usar instances em vez de objetos duplicados ao exportar a scene do Blender).

  • Volume de Bounding: Garanta que o volume de bounding de cada objeto se ajuste o mais perfeitamente possível. Espaço extra no volume de bounding pode fazer com que objetos sejam renderizados quando não estiverem visíveis.

O que é Frustrum Culling?

Frustum Culling é uma técnica de otimização que desativa os renderers (meshes) de objetos que estão fora da área de visão da câmera. Veja estes 2 exemplos:

Um nível interno em estilo labirinto. Esta visão normal da scene mostra todos os Game Objects visíveis.

O frustum culling regular renderiza apenas os objetos dentro da visão da câmera. Isso é automático e sempre acontece.

Instancing de Objetos vs Duplicação de Objetos

No Blender, duplicar um objeto cria uma cópia completamente separada do objeto, enquanto fazer instancing de um objeto cria uma duplicata que compartilha os mesmos dados que o objeto original.

Quando um objeto é duplicado, ele cria um novo objeto com um conjunto de dados completamente independente, incluindo toda a sua geometria, materials e animations. Isso significa que quaisquer alterações feitas no objeto original não serão refletidas no objeto duplicado, e vice-versa.

Por outro lado, quando um objeto é instanciado, quaisquer alterações feitas no objeto original serão refletidas em todas as suas instances, e vice-versa. Isso acontece porque todas as instances compartilham os mesmos dados subjacentes.

Em termos de performance, o instancing pode ser muito mais eficiente do que duplicar, especialmente ao trabalhar com scenes complexas ou grandes quantidades de objetos. Isso ocorre porque o instancing usa menos memória do que a duplicação, já que não cria novos dados para cada instance. Além disso, o instancing pode permitir que o Blender otimize o processo de renderização tratando todas as instances como um único objeto, em vez de renderizar cada duplicata separadamente.

De modo geral, o instancing pode ser uma ferramenta poderosa para melhorar a performance e a eficiência do fluxo de trabalho no Blender e na sua Decentraland Scene, especialmente ao trabalhar com scenes grandes e complexas.

Em alguns casos, ao duplicar objetos como árvores, plantas e postes de luz, o instancing pode melhorar significativamente a performance em comparação com a duplicação. Por exemplo, esta scene tem quatorze postes de luz, e todos eles são exatamente iguais. Sabemos que cada poste de luz tem duas textures diferentes, uma para o poste e outra para a luz. Então, nesse caso, teremos duas draw calls, uma por texture.

No Blender, quando você está na etapa de clonar e posicionar elementos no espaço, você tem três opções. Duplicar, Instanciar ou Unir objetos.

Vamos analisar quais são os prós e contras de cada procedimento.

Duplicar Objetos

Menu:
Object ‣ Duplicate Objects

Atalho:

Shift-D

Isso criará uma cópia visualmente idêntica do objeto selecionado, mas eles serão tratados como objetos diferentes. Então, ao exportar, haverá 2 draw calls por objeto, 2 * 14 = 28 draw calls, e um uso total de disco de 320kb.

Instancing de Objetos

Painel:
Toolbar ‣ Tools ‣ Edit ‣ Duplicate Linked

Menu:

Object ‣ Duplicate Linked

Atalho:

Alt-D

Isso criará um novo objeto com todos os seus dados vinculados ao objeto original. Se você modificar um dos objetos vinculados no Edit Mode, todas as cópias vinculadas serão modificadas. As propriedades de Transform continuam sendo cópias, não links, então você ainda pode rotacionar, escalar e mover livremente sem afetar as outras cópias.

Quando exportarmos esses modelos, ainda teremos o mesmo número de draw calls (28). No entanto, note que agora temos apenas uma mesh, o que reduz significativamente o uso de disco (41 kb).

Para manter tudo organizado, você pode simplesmente fazer instancing de collections na sua scene; isso permite controlar todas as instances a partir de uma única pasta e fonte.

Nomeação de Meshes

Use nomes significativos para suas meshes. O nome deve dar contexto de onde o asset é usado ou a que parte do objeto ele se relaciona.

Para nomear assets, use uma mistura de PascalCase e snake_case, que podemos chamar de PascalSnake_case. As regras básicas aí são - uma nova palavra ou a palavra após o separador (_) começa com Letra maiúscula.

  • Use nomes significativos para suas meshes Exemplos: 🟢 Prefira nomes - Teatro, Bonde 🔴 Evite nomes - Untitiled.008, primitive(1), Cylinder.091, _sphere-AB

  • Use underscore _ como separador para dar mais contexto ao nome. Coloque as coisas mais comuns primeiro e os detalhes no final. Exemplos: 🟢 Prefira nomes - FountainStatue, TheaterMainWall, TramWheelLeft 🔴 Evite nomes - North_MainWall_Theater, Tram_LeftFront_Wheel

Se houver mais de um objeto com o mesmo nome, adicione um número depois da palavra: FountainStatue01, FountainStatue02, etc.

Ferramentas para Criar Modelos

Há muitos addons e ferramentas externas que facilitam o trabalho ao criar assets para tornar o pipeline mais rápido e eficiente; algumas são gratuitas e outras precisam ser compradas, para citar algumas:

Decimate

Este é um modifier bastante conhecido que pode ser usado para reduzir a quantidade de tris da sua mesh enquanto mantém a estrutura da superfície do modelo. Embora seja uma ferramenta muito poderosa para otimizar modelos, leve em conta que, depois que o modelo é decimated, a topologia pode ser afetada, causando uma topologia ruim (porque ela quebra a geometria em pedaços imprevisíveis). Por outro lado, a decimation vai converter os quads da sua mesh em triângulos, tornando difícil modificá-la depois de usada. Nesse sentido a decimation pode ser útil para modelos estáticos, mas não é preferida para modelos animados.

Outra maneira de otimizar suas meshes usando decimation é decimar o modelo e depois fazer uma retopology adequada. Assim, você pode garantir um resultado mais previsível e uma topologia limpa.

Alguns addons de retopology que podem ser úteis são (alguns são pagos):

  • Simplygon: https://www.simplygon.com/

  • Speedretopo: https://blendermarket.com/products/speedretopo?ref=2

  • Retopoflow: https://blendermarket.com/products/retopoflow

Mirror Modifier

O Mirror Modifier no Blender é uma ferramenta usada para criar modelos simétricos espelhando uma metade de um objeto em qualquer direção (X,Y,Z). É uma ótima ferramenta quando você tem modelos simétricos, porque reduz o tempo de modelagem 3D, da realização do UV Unwrapping (porque você precisará desembrulhar apenas uma parte do modelo e o restante compartilhará as mesmas UV coordinates) e também ajuda a otimizar suas textures, evitando desperdiçar resolução de textura em partes que são essencialmente espelhadas.

Batch Rename

Uma ferramenta muito útil para alterar convenções de nomes de forma fácil é usar o Batch Rename que o Blender tem integrado em seu toolkit. Para acessá-lo, vá para Edit e depois em Batch Rename.

Selecione os objetos cujo nome você quer alterar e simplesmente substitua o nome padrão do objeto pelo novo. Essa ferramenta oferece diferentes métodos e tipos de asset para renomear, então é muito flexível para alterar nomes também de meshes, animations, bones, etc.

Boas práticas para geometrias #

  • Tenha cuidado com quantas faces você adiciona aos seus modelos 3D, pois mais faces tornam sua renderização mais exigente. Veja limitações da scene os limites impostos por uma scene.

  • Certifique-se de que não haja faces ocultas que não possam ser vistas, mas que aumentem a contagem de triângulos.

  • Para formas que devem ter lados arredondados, defina-as como suaves em vez de adicionar faces adicionais.

  • Certifique-se de que as normals de todas as faces estejam voltadas para fora e não para dentro. Se houver faces no seu modelo que parecem não estar lá quando você o renderiza, essa é provavelmente a causa.

  • Faça o bake da rotação e da escala das suas meshes, para que suas bounding boxes não se estendam para fora desnecessariamente.

Atualizado