# Meshes

Os modelos 3D têm uma *mesh* composta por *faces*. Essas faces se encontram umas com as outras nas *edges* (as linhas ao longo das quais se tocam) e nos *vertices* (os pontos onde seus cantos se unem).

## Limitações de Espaço

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

![](/files/b9f9b35aed56cfbcb3e59d33cec19122232402f7)

No editor do Creator Hub, você verá o modelo com uma tonalidade vermelha e sua bounding box marcada em vermelho.

![](/files/647dd6e63594d2897a8102b5525ad8edcdc14aba)

{% hint style="info" %}
**📔 Nota**: No cliente Web antigo do Decentraland, por motivos de desempenho, 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 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.
{% endhint %}

## Bounding Boxes

Se você tiver um modelo que tenha todos os seus vertices perfeitamente dentro da área da scene, mas que tenha bounding boxes grandes, em sua maioria vazias, e que 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 envolve 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.

![](/files/1ea0def1caf0b2ddcc9ab9207ddbd54053268e9e)

*No Blender você pode fazer isso selecionando os objetos, pressionando Ctrl+A e depois Apply “All transforms”.*

Por exemplo, tenha cuidado ao girar 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 ficando para fora após girá-la 45°.

![](/files/a2288388814f1465b1aaaa21b57a16088306c6bc)

Recomendamos que você faça 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 Triangles

Como o Decentraland é um mundo aberto cheio de diferentes scenes e objetos que são baixados em tempo real (no mesmo espaço 3D), é importante otimizar nossas meshes para ter um bom desempenho enquanto joga. Nesse sentido, há algumas limitações da scene que precisamos sempre ter em mente quando se trata de meshes:

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

* **Triangles:** n x 10000 Quantidade total de triangles de todos os modelos na scene.
* **Height:** log2(n+1) x 20 Altura em metros.
* **Tamanho do arquivo:** 15 MB por parcel - 300 MB máximo Tamanho total dos arquivos enviados ao servidor de conteúdo. 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.](https://docs.decentraland.org/creator/development-guide/scene-limitations/)

{% hint style="warning" %}
**🔥Dica de Otimização🔥: Adicione o Polygon Count** Uma dica valiosa é sempre acompanhar o polycount dos seus modelos. Para fazer isso no Blender, você precisa ativar as estatísticas no painel de overlays do viewport.

<img src="/files/9e2488ab92a18937b5dd238e56e1c6c60078c5e2" alt="" data-size="original">
{% endhint %}

## 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 pode 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, já que apenas as partes visíveis precisam ser consideradas para renderização. Isso também melhorará a pegada 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).
* **Bounding Volume**: Garanta que o bounding volume de cada objeto se ajuste o mais firmemente possível. Espaço extra no bounding volume pode fazer com que objetos sejam renderizados quando não estão visíveis.

![](/files/5b36cc8e401787bc7bb368f298c0d870ba37455e)

### 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 visualização da câmera. Veja estes 2 exemplos:

![](/files/6ce3367b8eed8df0d675664259538ccd0d7aab84)

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

![](/files/609b6450fb84940aa1a00b3db381a8a965129d9e)

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

## Instanciando Objetos vs Duplicando Objetos

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

Quando um objeto é duplicado, ele cria um novo objeto com um conjunto de dados completamente independente, incluindo toda a sua geometria, materiais e animações. 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 ocorre porque todas as instances compartilham os mesmos dados subjacentes.

Em termos de desempenho, instanciar pode ser muito mais eficiente do que duplicar, especialmente ao trabalhar com scenes complexas ou grandes quantidades de objetos. Isso ocorre porque instancing usa menos memória do que duplicar, já que não cria novos dados para cada instance. Além disso, 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.

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

![](/files/16d17aeffb0d32faed788ff21f27803dc170adaf)

Em alguns casos, ao duplicar objetos como árvores, plantas e postes de luz, instancing pode melhorar significativamente o desempenho 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 texturas diferentes, uma para o poste e outra para a luz. Então, nesse caso, teremos dois draw calls, um por textura.

![](/files/d92d9c40f985eaf4d2aab6efbf4d60f7f5d34d8a)

No Blender, quando você está na etapa de clonar e posicionar elementos no espaço, você tem três opções. Duplicate, Instance ou Merge objects.

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

### Duplicate Objects

| 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, você terá 2 draw calls por objeto, 2 \* 14 = 28 draw calls, e um uso total em disco de 320kb.

![](/files/524cccb0f004bf53e91e7afc4b2d3907a517d7d6)

### Instancing Objects

| 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 em 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.

![](/files/e4c3437c51000a284fb0797b415067c34a49e781)

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

![](/files/e521bb675e9acaccb5e83b0106c5246895a8ad58)

*Para manter as coisas organizadas, você pode simplesmente instanciar collections na sua scene; dessa forma, você pode 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 qual parte do objeto ele se relaciona.

Para nomear assets, use uma mistura de `PascalCase` e `snake_case`, à qual podemos chamar `PascalSnake_case`. Regras básicas aqui - uma palavra nova ou uma palavra após o separador (`_`) começa com **Letra maiúscula.**

* Use nomes significativos para suas meshes **Exemplos:** 🟢 **Prefira** nomes - `Theater`, `Tram` 🔴 **Evite** nomes - `Untitiled.008`, `primitive(1)`, `Cylinder.091`, `_sphere-AB`
* Use underscore `_` como separador para trazer 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 após a palavra: `FountainStatue01, FountainStatue02, etc.`

## Ferramentas Para Criar Modelos

Existem muitos addons e ferramentas externas que facilitam o trabalho ao criar assets, tornando o pipeline mais rápido e eficiente; algumas são gratuitas e outras pagas, para citar algumas:

### Decimate

Este é um modifier bem conhecido que pode ser usado para reduzir a quantidade de tris da sua mesh, mantendo a estrutura de superfície do modelo. Embora seja uma ferramenta muito poderosa para otimizar modelos, leve em conta que, uma vez que o modelo é decimated, a topologia pode ser afetada, causando uma topologia ruim (porque ele quebra a geometria em pedaços imprevisíveis). Por outro lado, a decimation converterá os quads da sua mesh em triangles, 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.**

![](/files/eaa4c3bec9bb9c80a2768f9515e3a6911dbc9b65) ![](/files/d4de58815487914908cac1dc915c89a2a1849adb)

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

Alguns addons de retopology que podem ser úteis são (alguns deles 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 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, de UV Unwrapping (porque você precisará desembrulhar apenas uma parte do modelo e o restante compartilhará as mesmas UV coordinates) e também otimiza suas textures, evitando desperdiçar resolução de textura em partes que são essencialmente espelhadas.

![](/files/e2a854bc9ecb64d29d187b6e6d68acb737c20790)

### Batch Rename

Uma ferramenta muito útil para alterar convenções de nome 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*.

![](/files/8213866826bc65e15648cd397be68a6b45d22f26)

Selecione os objetos cujo nome você deseja alterar e apenas substitua o nome padrão do objeto pelo novo. Esta ferramenta oferece diferentes métodos e tipos de asset para renomear, então é muito flexível para alterar os nomes também de meshes, animações, bones etc.

![](/files/af8b30dde01f1705fbcf8fac4d26429ed9ea2424) ![](/files/2c449f8f0e5f70e255b8907d430b464a2d36c196)

## Boas práticas para geometries [#](https://docs.decentraland.org/creator/3d-modeling/meshes/#best-practices-for-geometries)

* Preste atenção em quantas faces você adiciona aos seus modelos 3D, pois mais faces tornam sua renderização mais exigente. Veja [**limitações da scene**](https://docs.decentraland.org/creator/development-guide/scene-limitations/) para os limites impostos por uma scene.
* Certifique-se de que não haja hidden faces que não podem ser vistas, mas que aumentam a contagem de triangles.
* Para formas que devem ter lados arredondados, defina-as como *smooth* em vez de adicionar faces adicionais.
* Certifique-se de que as *normals* de todas as faces estejam voltadas para fora, em vez de para dentro. Se houver faces no seu modelo que parecem não estar lá quando você o renderiza, essa é provavelmente a causa.
* Faça bake da rotação e da escala das suas meshes, para que suas bounding boxes não se estendam desnecessariamente.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.decentraland.org/creator/content-creator-pt/modelacao-e-animacoes-3d/meshes.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
