> For the complete documentation index, see [llms.txt](https://docs.decentraland.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.decentraland.org/creator/content-creator-pt/modelacao-3d-e-animacoes/meshes.md).

# Meshes

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

Os modelos 3D têm um *mesh* composto por *faces triangulares*. Essas faces se encontram nas *edges* (as linhas ao longo das quais elas se tocam) e nos *vertices* (os pontos onde seus cantos se unem).

{% hint style="info" %}
**💡 Dica**: Instale o [plugin Decentraland Tools Blender](https://extensions.blender.org/add-ons/decentraland-tools/). Inclui várias funções úteis para o ajudar a editar e exportar modelos 3D, wearables e Emotes.
{% endhint %}

## Limitações de espaço

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

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-c9f4c9448f2fb3c7a2d85a4dd16f31814b0878bf%2Fcut-train.png?alt=media\&token=af46a450-fbd9-481f-9a28-87b7cc78925f)

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

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-a44ea3779c9fc579f367e0cbefb2b4218369eab9%2Ftrain-out-of-bounds.png?alt=media\&token=b9cc5fff-1980-4980-8cc3-626784d656fd)

{% hint style="info" %}
**📔 Observação**: No cliente Web antigo do Decentraland, por razões 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 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 model que tenha todos os seus vertices perfeitamente dentro da área da scene, mas que tenha bounding boxes grandes, na maior parte 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 model que estiverem dentro dos seus parcels serão renderizadas corretamente, e você poderá publicar sua scene.

Todo 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 model mais do que o necessário.

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

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-3188e3d33635429246de0f2d7f8f810483135233%2F07-apply-rotations.gif?alt=media\&token=9de03c16-3b43-4483-a974-4787f251d38f)

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

Por exemplo, tenha cuidado ao girar um sub-mesh perto da borda do seu model. Como as bounding boxes são cubos, mesmo que o mesh seja redondo, os cantos da sua bounding box podem acabar ficando para fora depois de girá-lo 45°.

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-38697f7d74f05eee44d500f06cb076936d1c0eac%2F10-apply-rotation.png?alt=media\&token=95db55ad-6d4e-4a0c-a7f4-ff9a94a133f3)

Recomendamos fazer bake da rotação e da escala de cada mesh no model, 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 Decentraland é um open world cheio de diferentes scenes e objects que são baixados dinamicamente (no mesmo espaço 3D), é importante otimizar nossos meshes para ter um bom desempenho enquanto jogamos. Nesse sentido, há algumas limitações da scene que sempre precisamos ter em mente quando o assunto é meshes:

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

* **Triangles:** n x 10000 Quantidade total de triângulos para todos os models na scene.
* **Altura:** 330 metros, independentemente do número de parcels.
* **Tamanho do arquivo:** 15 MB por parcel - 300 MB no máximo. Tamanho total dos arquivos enviados ao 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.](https://docs.decentraland.org/creator/development-guide/scene-limitations/)

{% hint style="warning" %}
**🔥Dica de otimização🔥: Adicionar contagem de polígonos** Uma dica valiosa é sempre acompanhar a contagem de polígonos dos seus models. Para fazer isso no Blender, você precisa ativar as estatísticas no painel de overlays do viewport.

<img src="https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-b1595d1e8b5529e0d12e99de25246215f1bdc900%2F41-stats.gif?alt=media" alt="" data-size="original">
{% endhint %}

## Meshes em cenas 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 um único mesh para um prédio inteiro, o prédio poderia ser dividido em meshes separados para cada parede, piso e seção do prédio. Isso permite que o frustum culling do Unity funcione de forma mais eficiente, já que apenas as partes visíveis precisam ser consideradas para renderização. Isso também melhorará o uso de memória, porque um mesh pode ser reusado várias vezes para o mesmo objeto em diferentes locais (para conseguir isso, você precisará referenciar o mesmo mesh na definição da sua scene SDK7 ou usar instances em vez de objetos duplicados ao exportar a scene do Blender).
* **Volume delimitador**: Garanta que o volume delimitador de cada objeto se encaixe da forma mais justa possível. Espaço extra no volume delimitador pode fazer com que objetos sejam renderizados quando não estiverem visíveis.

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-dce0bc9b716ee8b44c7b8daf0d7b9b4e76bdeaa7%2F40-modularity.png?alt=media\&token=9b4d8e51-ab22-481b-9a3e-9f686f15bfc1)

### 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:

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-1330fc3816764d5c82d75f6381929f0321bf0412%2F18-frustum-culling.png?alt=media\&token=cb7c171f-db28-4478-ba15-0c041bcf84d9)

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

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-c33a68dba5eb29a0f36573d3dd2c4e8b73addd0f%2F19-frustum-culling-2.gif?alt=media\&token=59b22e24-14af-4a3e-86a1-18817a19196d)

*O frustum culling normal renderiza apenas os 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 que o objeto original.

Quando um objeto é duplicado, ele cria um novo objeto com um conjunto completamente independente de dados, 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 instâncias, e vice-versa. Isso acontece porque todas as instâncias compartilham os mesmos dados subjacentes.

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

No geral, instanciar 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.

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-cc521f833d170857bee4aa12fec1d9f645c46446%2F20-duplicate-objects.png?alt=media\&token=f10a541b-7ba1-47ba-b2dc-c3cfcf0f8e79)

Em alguns casos, ao duplicar objetos como árvores, plantas e postes de luz, instanciar pode melhorar significativamente a performance em comparação com duplicá-los. 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, neste caso, teremos dois draw calls, um por texture.

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-717d26a8b05990d9e19f7b3becaac8122de944a3%2F21-duplicate-objects-2.png?alt=media\&token=1b277f98-7fbc-46d7-ae3f-c6779907b4cd)

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

Vamos analisar quais são os prós e os 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, ele terá 2 draw calls por objeto, 2 \* 14 = 28 draw calls, e um uso total de disco de 320 KB.

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-36c86406e9de1a3c1029ab6a77bcbced976f77b7%2F22-duplicate-objects-3.png?alt=media\&token=fea4df0e-8338-499c-9b74-6ec379b0f941)

### Instanciando 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 em Edit Mode, todas as cópias vinculadas serão modificadas. As propriedades de Transform ainda permanecem como cópias, não links, então você ainda pode rotacionar, escalar e mover livremente sem afetar as outras cópias.

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-e20a046d7790b5e3f03dce96a9d14e050257cfb5%2F23-instancing.png?alt=media\&token=f7f36a81-55ad-498f-9e91-b9431f80c773)

*Ao exportar esses models, ainda teremos o mesmo número de draw calls (28). No entanto, observe que agora temos apenas um mesh, o que reduz significativamente o uso de disco (41 KB).*

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-99e3bbd682033748343d03febe334f602aba3bcb%2F24-instancing-2.png?alt=media\&token=feb60e01-7e54-4f85-bac1-beae639a5295)

*Para manter as coisas organizadas, você pode simplesmente instanciar collections na sua scene; dessa forma, você consegue controlar todas as instâncias a partir de uma única pasta e fonte.*

{% hint style="info" %}
**💡 Dica**: A mesma lógica se aplica no lado do SDK. Quatorze entities que todas apontam para o mesmo `GltfContainer` arquivo *.glb* se comportam como instâncias: o arquivo é baixado uma vez, convertido uma vez, e seus meshes e textures ficam na memória uma vez, não importa quantas entities o usem. Dividir o mesmo conteúdo em catorze *.glb* arquivos quase idênticos é o equivalente a duplicar, e isso custa catorze downloads e catorze cópias na memória.
{% endhint %}

### Mesclar objetos

| Menu:   | Object ‣ Join |
| ------- | ------------- |
| Atalho: | Ctrl-J        |

Isso junta os objetos selecionados em um único objeto com um único mesh. Isso funciona em Object Mode, mescla tudo no último objeto selecionado, e exige que todos os objetos selecionados sejam do mesmo tipo. Os materiais são mantidos e mesclados, então nossos catorze postes de luz deixam de ser catorze objetos renderizáveis e se tornam um só, e o engine os desenha com 2 draw calls em vez de 28 — um por material, uma vez. *active* Esta é a única das três opções que realmente reduz draw calls, e vale deixar claro por quê: o engine do Decentraland constrói sua scene em runtime a partir de conteúdo transmitido, então ele não pode agrupar ou fazer batch de objetos repetidos para você da mesma forma que um engine pode fazer com conteúdo que foi pré-compilado. Se você precisar de menos draw calls, a mesclagem precisa acontecer no Blender.

Essa redução não é de graça. Mesclar abre mão de várias coisas ao mesmo tempo:

O uso de disco volta a subir.

* **O mesh mesclado armazena a geometria dos catorze postes, então você perde a economia que a instancing proporcionava.** O frustum culling vira tudo ou nada.
* **Um objeto mesclado é desenhado por completo sempre que qualquer parte dele está na tela. Catorze postes espalhados ao longo de uma rua quase sempre terão um poste visível, então você acaba desenhando os catorze o tempo todo — o que pode facilmente custar mais do que os draw calls economizados.** As partes deixam de ser endereçáveis individualmente.
* **Você não pode mais mover, animar, clicar ou ocultar um único poste, porque sobra apenas um objeto.** Use a mesclagem de forma restrita: para muitos pequenos props que são sempre vistos juntos em um único lugar, nunca interagem com nada e somente depois de você confirmar que o número de objetos é o que realmente está prejudicando a performance. Para todo o resto, instanciar é a melhor opção padrão.

: Exportar catorze objetos separados para um único

{% hint style="warning" %}
**📔 Observação**arquivo é *.glb* mesclar. O engine ainda vê catorze objetos e ainda emite 28 draw calls. Apenas juntar os meshes altera a contagem. **não** Mesclagem de meshes
{% endhint %}

## Nomeação de meshes

Use nomes significativos para seus 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`, que podemos chamar de `PascalSnake_case`. As regras básicas aí são: uma nova palavra ou uma palavra depois de um separador (`_`) começa com **letra maiúscula.**

* Use nomes significativos para seus meshes **Exemplos:** 🟢 **Prefere** dos nomes - `Teatro`, `Bonde` 🔴 **Evita** dos nomes - `Sem título.008`, `primitiva(1)`, `Cylinder.091`, `_sphere-AB`
* Use sublinhado `_` como separador para trazer mais contexto ao nome. Coloque as coisas mais comuns primeiro e os detalhes no final. **Exemplos:** 🟢 **Prefere** dos nomes - `EstátuaFonte`, `ParedePrincipalDoTeatro`, `RodaEsquerdaDoBonde` 🔴 **Evita** dos nomes - `Norte_ParedePrincipal_Teatro`, `Bonde_DianteiraEsquerda_Roda`

Se houver mais de um objeto com o mesmo nome, adicione um número após a palavra: `EstátuaFonte01, EstátuaFonte02, 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 pagas, para citar algumas:

### Decimate

Este é um modifier muito conhecido que pode ser usado para reduzir a quantidade de tris do seu mesh, mantendo a estrutura da superfície do model. Embora seja uma ferramenta muito poderosa para otimizar models, leve em conta que, uma vez que o model é decimado, a topologia pode ser afetada, causando uma topologia ruim (porque ele divide a geometria em pedaços imprevisíveis). Por outro lado, a decimização converterá os quads do seu mesh em triângulos, tornando difícil modificá-lo depois de usado. Nesse sentido, **a decimização pode ser útil para models estáticos, mas não é a preferida para models animados.**

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-fa7269059815d6b0687b7b6c29ec632463318861%2F42-decimate-01.png?alt=media\&token=18606f4e-ddca-442e-9e29-b9af8fbef561) ![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-8ae651d7fd4bd8a23c60469f60cc8a572c2ad714%2F43-decimate-02.png?alt=media\&token=1ba84648-dff1-4cce-b2ad-85325ba7db2a)

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

Alguns addons de retopologia 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 models simétricos espelhando uma metade de um objeto em qualquer direção (X, Y, Z). É uma ótima ferramenta quando você tem models simétricos porque reduz o tempo de modelagem 3D, faz UV Unwrapping (porque você precisará fazer unwrap apenas de uma parte do model e o restante compartilhará as mesmas coordenadas UV) e também otimiza suas textures, evitando desperdiçar resolução de textura em partes que são essencialmente espelhadas.

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-c6259ae5fe095f0e4a22d7af8f8a84f7adfc98c1%2F44-mirror-modifier.png?alt=media\&token=8aaabb9b-c158-440e-b61a-1777e411d509)

### Renomeação em lote

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

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-c02ecaff9c6765f3b0dcf164a506c4b39d015e9a%2F45-batch-rename.png?alt=media\&token=64658f91-f1af-462b-8bcb-340bd8026870)

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

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-6a91a4b355df03a163ec1cb3570753eedd05fc8f%2F47-batch-rename-methods.png?alt=media\&token=841e0544-8ae3-432d-aabe-2ac2be84cd0c) ![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-a6c301bd731a96d8813c4120ee554490e480f874%2F46-batch-rename-types.png?alt=media\&token=1f18300b-8a5b-47b5-915a-c4f9fa14057c)

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

* Tenha cuidado com a quantidade de faces que você adiciona aos seus 3D models, pois mais faces tornam sua renderização mais exigente. Veja [**limitações da scene**](https://docs.decentraland.org/creator/development-guide/scene-limitations/) pelos limites impostos por uma scene.
* Certifique-se de que não existam faces ocultas que não podem ser vistas, mas que aumentam a contagem de triângulos.
* Para formas que devam ter lados arredondados, defina-as para serem *smooth* em vez de adicionar faces adicionais.
* Certifique-se de que os *normals* de todas as faces estejam voltados para fora e não para dentro. Se houver faces no seu model que pareçam não existir quando você o renderiza, essa é provavelmente a causa.
* Faça o bake da rotação e da escala dos seus meshes, para que suas bounding boxes não se estendam desnecessariamente.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

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

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

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

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
