> 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-es/modelado-y-animaciones-3d/meshes.md).

# Meshes

Aprende qué propiedades de mesh de sombrero son compatibles en los modelos 3D importados a Decentraland.

Los modelos 3D tienen una *mesh* compuesta de *faces*. Estas faces se encuentran entre sí en *edges* (las líneas a lo largo de las cuales se tocan) y *vertices* (los puntos donde se unen sus esquinas).

{% hint style="info" %}
**💡 Consejo**: Instala el [plugin Decentraland Tools para Blender](https://extensions.blender.org/add-ons/decentraland-tools/). Incluye varias funciones útiles para ayudarte a editar y exportar modelos 3D, wearables y emotes.
{% endhint %}

## Limitaciones de espacio

Todos los modelos 3D en tu scene deben caber dentro de los límites de sus parcels. Si cualquier parte de tus modelos se extiende más allá de estos límites al ejecutar un preview, estas partes que sobresalen se recortarán y no se renderizarán.

![](https://1216664193-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)

En el editor de Creator Hub, verás el modelo teñido de rojo y su bounding box marcada en rojo.

![](https://1216664193-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" %}
**📔 Nota**: En el antiguo cliente web de Decentraland, por razones de rendimiento, si cualquier parte de un modelo 3D quedaba fuera de los límites, incluso solo la bounding box, entonces no se renderizaba el modelo completo. A partir del cliente de escritorio de Decentraland 2.0, solo se recortan las partes de un modelo que están fuera de los límites. Las partes del modelo que están dentro de la scene se renderizan.
{% endhint %}

## Bounding Boxes

Si tienes un modelo que tiene todos sus vertices cuidadosamente dentro del área de la scene, pero que tiene bounding boxes grandes, mayormente vacías, que se extienden más allá de los límites de la scene, el modelo completo será marcado como fuera de los límites de la scene en Creator Hub. Las partes del modelo que están dentro de tus parcels se renderizarán correctamente, y se te permitirá publicar tu scene.

Cada mesh tiene una bounding box que rodea los límites de la forma. Para hacer que un modelo 3D sea más usable dentro de Decentraland, asegúrate de que sus bounding boxes no se extiendan más allá del modelo más de lo necesario.

Para evitar este problema, puedes limpiar tus modelos 3D para restablecer las posiciones y rotaciones de los meshes de modo que las bounding boxes no se extiendan más allá de los meshes que envuelven.

![](https://1216664193-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)

*En Blender puedes hacer eso seleccionando los objetos, pulsando Ctrl+A y luego Apply 'All transforms'.*

Por ejemplo, ten cuidado al rotar un sub-mesh cerca del borde de tu modelo. Como las bounding boxes son cubos, aunque el mesh sea redondo, las esquinas de su bounding box podrían terminar sobresaliendo después de rotarlo 45°.

![](https://1216664193-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 hornear la rotación y la escala de cada mesh en el modelo, para asegurarte de que no haya bounding boxes no deseadas que se extiendan más allá del tamaño que necesitan tener.

## Limitaciones de triángulos

Como Decentraland es un mundo abierto lleno de diferentes scenes y objetos que se descargan sobre la marcha (en el mismo espacio 3D), es importante optimizar nuestros meshes para tener un buen rendimiento mientras jugamos. En ese sentido, hay algunas limitaciones de scene que siempre debemos tener en cuenta cuando se trata de meshes:

> n representa el número de parcels que ocupa una scene.

* **Triangles:** n x 10000 Cantidad total de triangles para todos los modelos de la scene.
* **Height:** 330 metros, independientemente del número de parcels.
* **Tamaño del archivo:** 15 MB por parcel - 300 MB máximo Tamaño total de los files subidos al content server. Incluye modelos 3D y audio. No incluye files que no se suben, como paquetes de node.js.
* **Tamaño máximo de archivo 50 MB por archivo** Ningún archivo individual de ningún tipo en la scene puede superar los 50 MB, sin importar cuántos parcels tenga la scene.

Para más información consulta todas las limitaciones de la scene [aquí.](https://docs.decentraland.org/creator/development-guide/scene-limitations/)

{% hint style="warning" %}
**🔥Consejo de optimización🔥: Añadir Polygon Count** Un consejo valioso es llevar siempre un control del polycount de tus modelos. Para hacerlo en blender necesitas activar statistics en el panel de viewport overlays.

<img src="https://1216664193-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 en escenas grandes

Al crear meshes, debemos tener en cuenta estas 2 buenas prácticas:

* **Modularity:** Divide los meshes grandes en partes más pequeñas y modulares. Por ejemplo, en lugar de tener un solo mesh para todo un edificio, el edificio podría dividirse en meshes separados para cada pared, piso y sección del edificio. Esto permite que el frustum culling de Unity funcione de manera más efectiva, ya que solo las partes visibles necesitan ser consideradas para el rendering. También mejorará la huella de memoria, porque un mesh puede reutilizarse varias veces para el mismo objeto en distintas ubicaciones (para lograr esto necesitarás referenciar el mismo mesh en la definición de tu scene SDK7 o usar instances en lugar de objetos duplicados al exportar la scene desde Blender).
* **Volumen delimitador**: Asegúrate de que el bounding volume de cada objeto se ajuste lo más posible. El espacio sobrante en el bounding volume puede hacer que los objetos se rendericen cuando no son visibles.

![](https://1216664193-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)

### ¿Qué es Frustum Culling?

Frustum Culling es una técnica de optimización que desactiva los renderers (meshes) de los objetos que están fuera del área de visión de la cámara. Mira estos 2 ejemplos:

![](https://1216664193-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)

*Un nivel interior tipo laberinto. Esta vista normal de la scene muestra todos los Game Objects visibles.*

![](https://1216664193-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)

*El frustum culling regular solo renderiza los objetos dentro de la vista de la cámara. Esto es automático y siempre ocurre.*

## Instancing de objetos vs duplicar objetos

En Blender, duplicar un objeto crea una copia completamente separada del objeto, mientras que instanciar un objeto crea un duplicado que comparte los mismos datos que el objeto original.

Cuando un objeto se duplica, crea un nuevo object con un conjunto de datos completamente independiente, incluyendo toda su geometry, Materials y animations. Esto significa que cualquier cambio realizado al objeto original no se reflejará en el objeto duplicado, y viceversa.

Por otro lado, cuando un objeto se instancia, cualquier cambio realizado al objeto original se reflejará en todas sus instancias, y viceversa. Esto se debe a que todas las instancias comparten los mismos datos subyacentes.

En términos de rendimiento, instancing puede ser mucho más eficiente que duplicating, especialmente cuando se trabaja con scenes complejas o grandes cantidades de objects. Esto se debe a que instancing usa menos memory que duplicating, ya que no crea nuevos datos para cada instancia. Además, instancing puede permitir que Blender optimice el proceso de rendering al tratar todas las instancias como un solo object, en lugar de renderizar cada duplicado por separado.

En general, instancing puede ser una herramienta poderosa para mejorar el rendimiento y la eficiencia del workflow en Blender y en tu Decentraland Scene, especialmente cuando trabajas con scenes grandes y complejas.

![](https://1216664193-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)

En algunos casos, al duplicar objects como árboles, plants y light posts, instancing puede mejorar significativamente el rendimiento en comparación con duplicarlos. Por ejemplo, esta scene tiene catorce light posts, todos exactamente iguales. Sabemos que cada light post tiene dos textures diferentes, una para el poste y otra para la luz. Así que en este caso tendremos dos draw calls, una por texture.

![](https://1216664193-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)

En Blender, cuando estás en la etapa de clonar y posicionar elementos en el espacio, tienes tres opciones. Duplicar, instanciar o fusionar objects.

Analicemos cuáles son las ventajas y desventajas de cada procedimiento.

### Objetos duplicados

| Menú:  | Object ‣ Duplicate Objects |
| ------ | -------------------------- |
| Atajo: | Shift-D                    |

Esto creará una copia visualmente idéntica del objeto seleccionado, pero será tratada como un objeto diferente. Así que al exportar tendrá 2 draw calls por object, 2 \* 14 = 28 draw calls, y un uso total de disco de 320kb.

![](https://1216664193-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)

### Instancing de objetos

| Panel: | Toolbar ‣ Tools ‣ Edit ‣ Duplicate Linked |
| ------ | ----------------------------------------- |
| Menú:  | Object ‣ Duplicate Linked                 |
| Atajo: | Alt-D                                     |

Esto creará un nuevo objeto con todos sus datos vinculados al objeto original. Si modificas uno de los objetos vinculados en Edit Mode, se modifican todas las copias vinculadas. Las propiedades de Transform siguen siendo copias, no vínculos, así que aún puedes rotar, escalar y mover libremente sin afectar a las otras copias.

![](https://1216664193-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)

*Cuando exportamos estos modelos, seguiremos teniendo la misma cantidad de draw calls (28). Sin embargo, nota que ahora solo tenemos un mesh, lo que reduce significativamente el uso de disco (41 kb).*

![](https://1216664193-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 mantener las cosas organizadas, puedes simplemente instanciar collections en tu scene; de esta manera puedes controlar todas las instancias desde una sola carpeta y origen.*

{% hint style="info" %}
**💡 Consejo**: La misma lógica se aplica del lado del SDK. Catorce entities que apuntan todas sus `GltfContainer` al mismo *.glb* archivo se comportan como instancias: el archivo se descarga una vez, se convierte una vez y sus meshes y textures se mantienen en memoria una sola vez, sin importar cuántas entities lo usen. Dividir el mismo contenido en catorce *.glb* archivos casi idénticos es el equivalente de duplicar, y te cuesta catorce descargas y catorce copias en memoria.
{% endhint %}

### Unir objetos

| Menú:  | Object ‣ Join |
| ------ | ------------- |
| Atajo: | Ctrl-J        |

Esto une los objetos seleccionados en un solo objeto con un solo mesh. Funciona en Object Mode, fusiona todo en el último *active* objeto seleccionado, y requiere que todos los objetos seleccionados sean del mismo tipo. Los Materials se conservan y se fusionan, así que nuestros catorce postes de luz dejan de ser catorce objetos renderizables y se convierten en uno, y el engine los dibuja con 2 draw calls en lugar de 28 — uno por Material, una vez.

Esta es la única de las tres opciones que realmente reduce los draw calls, y vale la pena dejar claro por qué: el engine de Decentraland construye tu scene en runtime a partir de content en streaming, así que no puede agrupar ni hacer batch de objetos repetidos por ti como sí puede hacerlo un engine con content que fue baked de antemano. Si necesitas menos draw calls, la unión tiene que hacerse en Blender.

Esa reducción no es gratis. La fusión renuncia a varias cosas a la vez:

* **El uso de disco vuelve a subir.** El mesh fusionado almacena la geometría de los catorce postes, así que pierdes el ahorro que te daba el instancing.
* **El frustum culling se vuelve todo o nada.** Un objeto fusionado se dibuja completo cada vez que cualquier parte de él está en pantalla. Catorce postes distribuidos a lo largo de una calle casi siempre tendrán un poste visible, así que terminas dibujando los catorce todo el tiempo — lo que puede costar fácilmente más que los draw calls que ahorraste.
* **Las partes dejan de poder direccionarse individualmente.** Ya no puedes mover, animar, hacer click ni ocultar un solo poste, porque solo queda un objeto.

Usa la fusión con moderación: para muchos props pequeños que siempre se ven juntos en un mismo lugar, con los que nunca se interactúa, y solo después de haber confirmado que el número de objects es lo que realmente perjudica el rendimiento. Para todo lo demás, instancing es la mejor opción por defecto.

{% hint style="warning" %}
**📔 Nota**: Exportar catorce objetos separados a un solo *.glb* archivo es **no** fusionar. El engine sigue viendo catorce objects y sigue emitiendo 28 draw calls. Solo unir los meshes cambia el conteo.
{% endhint %}

## Nomenclatura de meshes

Usa nombres significativos para tus meshes. El nombre debería dar contexto de dónde se usa el asset o a qué parte del objeto se refiere.

Para nombrar assets usa una mezcla de `PascalCase` y `snake_case`, al que podemos llamar `PascalSnake_case`. Las reglas básicas allí son: una palabra nueva o una palabra después de un separador (`_`) comienza con **letra mayúscula.**

* Usa nombres significativos para tus meshes **Ejemplos:** 🟢 **Prefiere** nombres - `Theater`, `Tram` 🔴 **Evita** nombres - `Untitiled.008`, `primitive(1)`, `Cylinder.091`, `_sphere-AB`
* Usa guion bajo `_` como separador para aportar más contexto al nombre. Pon primero las cosas más comunes y los detalles al final. **Ejemplos:** 🟢 **Prefiere** nombres - `FountainStatue`, `TheaterMainWall`, `TramWheelLeft` 🔴 **Evita** nombres - `North_MainWall_Theater`, `Tram_LeftFront_Wheel`

Si hay más de un objeto con el mismo nombre, añade un número después de la palabra: `FountainStatue01, FountainStatue02, etc.`

## Herramientas para crear modelos

Hay muchos addons y herramientas externas que facilitan el trabajo al crear assets para hacer el pipeline más rápido y eficiente; algunas son gratis y otras de pago, por nombrar algunas:

### Decimate

Este es un modifier muy conocido que puede usarse para reducir la cantidad de tris de tu mesh mientras mantienes la estructura de la superficie del modelo. Aunque es una herramienta muy potente para optimizar modelos, ten en cuenta que una vez que el modelo se ha decimated, la topology puede verse afectada, causando una mala topology (porque rompe la geometry en piezas impredecibles). Por otro lado, la decimation convertirá los quads de tu mesh en triangles, haciendo difícil modificarlo después de usarlo. En ese sentido **la decimation puede ser útil para modelos estáticos, pero no es la preferida para modelos animados.**

![](https://1216664193-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://1216664193-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)

Otra forma de optimizar tus meshes usando decimation es decimar el modelo y luego hacer una retopology adecuada. Así puedes asegurar un resultado más predecible y una topology limpia.

Algunos addons de retopology que pueden ser útiles son (algunos son de pago):

* **Simplygon:** <https://www.simplygon.com/>
* **Speedretopo:** <https://blendermarket.com/products/speedretopo?ref=2>
* **Retopoflow:** <https://blendermarket.com/products/retopoflow>

### Mirror Modifier

El Mirror Modifier en Blender es una herramienta utilizada para crear modelos simétricos espejando una mitad de un objeto en cualquier dirección (X,Y,Z). Es una gran herramienta cuando tienes modelos simétricos porque reduce el tiempo de modelado 3D, de hacer UV Unwrapping (porque solo necesitarás hacer unwrap de una parte del modelo y el resto compartirá las mismas coordenadas UV) y también optimiza tus textures evitando desperdiciar resolución de textura en partes que son esencialmente espejadas.

![](https://1216664193-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)

### Renombrado por lotes

Una herramienta muy útil para cambiar convenciones de nombres de una forma sencilla es usar el Batch Rename que Blender tiene integrado en su toolkit. Para acceder a él ve a *Edit* y luego *Renombrado por lotes*.

![](https://1216664193-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)

Selecciona los objetos a los que quieras cambiar el nombre y simplemente reemplaza el nombre de objeto predeterminado por el nuevo. Esta herramienta ofrece diferentes métodos y tipos de asset para renombrar, así que es muy flexible para cambiar los nombres también de meshes, animations, bones, etc.

![](https://1216664193-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://1216664193-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)

## Buenas prácticas para geometrías [#](https://docs.decentraland.org/creator/3d-modeling/meshes/#best-practices-for-geometries)

* Ten en cuenta cuántas faces añades a tus modelos 3D, ya que más faces hacen que su renderizado sea más exigente. Consulta [**limitaciones de la escena**](https://docs.decentraland.org/creator/development-guide/scene-limitations/) las limitaciones impuestas por una scene.
* Asegúrate de que no haya faces ocultas que no puedan verse pero que sí aumenten el conteo de triangles.
* Para formas que deban tener lados redondeados, configúralas para que sean *smooth* en lugar de añadir faces adicionales.
* Asegúrate de que las *normals* de todas las faces estén orientadas hacia afuera en lugar de hacia adentro. Si hay faces en tu modelo que parecen no estar allí cuando lo renderizas, esta es muy probablemente la causa.
* Hornea la rotación y la escala de tus meshes, para que sus bounding boxes no se extiendan innecesariamente hacia afuera.


---

# 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-es/modelado-y-animaciones-3d/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.
