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

# Meshes

Los modelos 3D tienen una *mesh* compuesta de triangular *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 [Decentraland Tools Blender plugin](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 alguna parte de tus modelos se extiende más allá de estos límites al ejecutar una Preview, esas partes que sobresalen se recortarán y no se renderizarán.

![](/files/fd5eab55ccca8239eb0174c467ae589de9ecfb42)

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

![](/files/d1b81cc09d8e0ba810d9acf0d156942b10f36547)

{% hint style="info" %}
**📔 Nota**: En el antiguo cliente web de Decentraland, por razones de rendimiento, si alguna parte de un modelo 3D quedaba fuera de límites, incluso si solo era la bounding box, entonces no se renderizaba el modelo completo. Desde el cliente de escritorio de Decentraland 2.0, solo se recortan las partes de un modelo que están fuera de 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 perfectamente dentro del área de la scene, pero que tiene grandes bounding boxes que están mayormente vacías y se extienden más allá de los límites de la scene, el modelo completo se marcará 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.

![](/files/2771b33e2e0ce0ec7b123ecdb147317bbdee5a46)

*En Blender puedes hacerlo seleccionando los objects, presionando 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 sobresalir después de girarlo 45°.

![](/files/b6c2a6c56b7d690c2927ac9090aa8f3dc3174037)

Recomendamos que hornees la rotación y la escala de cada mesh del modelo, para asegurarte de que no haya bounding boxes no deseadas que se extiendan más allá del tamaño que deben tener.

## Limitaciones de triángulos

Como Decentraland es un open world lleno de diferentes scenes y objects que se descargan sobre la marcha (en el mismo espacio 3D), es importante optimizar nuestros meshes para tener un buen rendimiento mientras juegas. 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 models de la scene.
* **Height:** log2(n+1) x 20 Altura en metros.
* **File size:** 15 MB por parcel - 300 MB máx. Tamaño total de los files subidos al server de contenido. Incluye modelos 3D y audio. No incluye files que no se suben, como paquetes de node.js.
* **Tamaño máximo del file: 50 MB por file** Ningún file individual de ningún tipo en la scene puede superar los 50 MB, sin importar cuántas parcels tenga la scene.

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

{% hint style="warning" %}
**🔥Consejo de optimización🔥: Añadir recuento de polígonos** Un consejo valioso es llevar siempre el control del polycount de tus models. Para hacerlo en Blender necesitas activar las estadísticas en el panel de overlays del viewport.

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

## Meshes en escenas grandes

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

* **Modularidad:** 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 forma más eficaz, ya que solo es necesario considerar las partes visibles para el rendering. También mejorará la huella de memoria, porque un mesh puede reutilizarse varias veces para el mismo object en diferentes ubicaciones (para lograr esto tendrás que referenciar el mismo mesh en la definición de tu scene de SDK7 o usar instances en lugar de objects duplicados al exportar la scene desde Blender).
* **Volumen delimitador**: Asegúrate de que el volumen delimitador de cada object encaje lo más ajustado posible. El espacio extra en el volumen delimitador puede hacer que los objects se rendericen cuando no son visibles.

![](/files/c29cdd8519fb7ffc93ce76249f52b6a0a5c1822f)

### ¿Qué es Frustrum Culling?

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

![](/files/f6b1d0ce0c5e9b0f42b207f492e2450e5cbf5174)

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

![](/files/43576ee183deb6e7dc578824ef6c1f4d7a773d9a)

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

## Instancing Objects vs Duplicating Objects

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

Cuando se duplica un object, se crea un nuevo object con un conjunto de datos completamente independiente, incluida toda su geometría, materials y animations. Esto significa que cualquier cambio realizado en el object original no se reflejará en el object duplicado, y viceversa.

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

En términos de rendimiento, instancing puede ser mucho más eficiente que duplicar, especialmente cuando se trabaja con scenes complejas o una gran cantidad de objects. Esto se debe a que instancing usa menos memoria que duplicar, ya que no crea nuevos datos para cada instance. Además, instancing puede permitir que Blender optimice el proceso de rendering tratando todas las instances 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 flujo de trabajo en Blender y en tu Decentraland Scene, especialmente cuando trabajas con scenes grandes y complejas.

![](/files/caf8468d0c97666cc18f6398f08edc6df0e8bdc2)

En algunos casos, al duplicar objects como trees, plants y light posts, instancing puede mejorar significativamente el rendimiento en comparación con duplicarlos. Por ejemplo, esta scene tiene catorce light posts, todos son 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, uno por texture.

![](/files/90f8ef2c88ccf97d1479e5293e477b76b8a345f8)

En Blender, cuando estás en la etapa de clonar y posicionar elementos en el espacio, tienes tres opciones. Duplicate, Instance o Merge objects.

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

### Duplicar objetos

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

Esto creará una copia visualmente idéntica del object seleccionado, pero se tratarán como objects diferentes. Así que al exportarlo tendrá 2 draw calls por object, 2 \* 14 = 28 draw calls, y un uso total de disco de 320kb.

![](/files/4fd456f25b7f816d96225522f697cf8ca498d6ce)

### Instancing Objects

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

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

![](/files/2bda64aacef0844ef5d13c9ae65c42293d246c97)

*Cuando exportemos estos models, seguiremos teniendo el mismo número de draw calls (28). Sin embargo, observa que ahora solo tenemos un mesh, lo que reduce significativamente el uso de disco (41 kb).*

![](/files/6ffdb9669ea0d2f620a75b48b5850625e85362bf)

*Para mantener todo organizado, puedes instanciar collections en tu scene; así puedes controlar todas las instances desde una sola carpeta y fuente.*

{% hint style="info" %}
**💡 Consejo**: La misma lógica se aplica del lado del SDK. Catorce entities que apuntan todas a su `GltfContainer` al mismo *.glb* file se comportan como instances: el file 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 files casi idénticos *.glb* es el equivalente de duplicar, y te cuesta catorce descargas y catorce copias en memoria.
{% endhint %}

### Fusionar objetos

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

Esto une los objects seleccionados en un solo object con un solo mesh. Funciona en Object Mode, fusiona todo en el último *activo* object seleccionado y requiere que todos los objects seleccionados sean del mismo tipo. Los materials se conservan y se fusionan, así que nuestros catorce light posts dejan de ser catorce objects 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 contenido en streaming, así que no puede agrupar o batchar objects repetidos por ti, como sí puede hacerlo un engine con contenido que fue baked por adelantado. Si necesitas menos draw calls, la fusión tiene que ocurrir en Blender.

Esa reducción no es gratis. Fusionar implica renunciar a varias cosas a la vez:

* **El uso de disco vuelve a subir.** El mesh fusionado almacena la geometría de los catorce posts, así que pierdes el ahorro que te daba instancing.
* **El frustum culling se vuelve todo o nada.** Un object fusionado se dibuja completo siempre que cualquier parte de él esté en pantalla. Catorce posts distribuidos a lo largo de una calle casi siempre tendrán uno 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 tratarse de forma individual.** Ya no puedes mover, animar, hacer click ni ocultar un solo post, porque solo queda un object.

Usa la fusión de forma limitada: para muchos props pequeños que siempre se ven juntos en un mismo lugar, que nunca se interactúan, 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 objects separados a un solo *.glb* file es **no** fusionar. El engine sigue viendo catorce objects y sigue emitiendo 28 draw calls. Solo la unión de los meshes cambia el conteo.
{% endhint %}

## Nomenclatura de meshes

Usa nombres significativos para tus meshes. El nombre debe dar contexto de dónde se usa el asset o a qué parte del object se relaciona.

Para nombrar assets usa una mezcla de `PascalCase` y `snake_case`, a lo que podemos llamar `PascalSnake_case`. Las reglas básicas allí son: una nueva palabra 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 underscore `_` como separador para dar 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 object con el mismo nombre, añade un número después de la palabra: `FountainStatue01, FountainStatue02, etc.`

## Herramientas para crear models

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 mantiene la estructura de la superficie del model. Aunque es una herramienta muy potente para optimizar models, ten en cuenta que una vez que el model se decima, la topology puede verse afectada, causando una mala topology (porque rompe la geometría en piezas impredecibles). Por otra parte, la decimation convertirá los quads de tu mesh en triangles, lo que dificulta modificarlo después de usarlo. En ese sentido **la decimation puede ser útil para models estáticos, pero no se prefiere para models animados.**

![](/files/961e3e41b2f175bfae5bad06dbd6b2ce70234227) ![](/files/d6adffdf17e760422ebd6d972d7fde852f0f2bca)

Otra forma de optimizar tus meshes usando decimation es decimar el model y luego hacer una retopology adecuada. De esta forma 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 models simétricos reflejando una mitad de un object en cualquier dirección (X,Y,Z). Es una gran herramienta cuando tienes models simétricos porque reduce el tiempo de 3D modeling, doing UV Unwrapping (porque solo necesitarás desplegar una parte del model y el resto compartirá las mismas UV coordinates) y también optimiza tus textures evitando desperdiciar resolución de texture en partes que son esencialmente reflejadas.

![](/files/07e4e1f9490afe288d2d2fd8f2a959b7b7d53ade)

### Batch Rename

Una herramienta muy práctica para cambiar las convenciones de nombres de forma sencilla es usar Batch Rename, que Blender tiene integrado en su toolkit. Para acceder a ella ve a *Edit* y luego *Batch Rename*.

![](/files/1f98c835500897452d282c9f1cc61d1f73a0029e)

Selecciona los objects a los que quieres cambiarles el nombre y simplemente reemplaza el nombre de object predeterminado por el nuevo. Esta herramienta ofrece diferentes métodos y tipos de asset para renombrar, por lo que es muy flexible para cambiar nombres también de meshes, animations, bones, etc.

![](/files/7de1fe5950ca42996a56dcb9618661afa42d6206) ![](/files/7b4f42ec59846104cbf57c868a9aea3b2b8d8164)

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

* Ten presente cuántas faces añades a tus modelos 3D, ya que más faces hacen que su rendering sea más exigente. Consulta [**scene limitations**](https://docs.decentraland.org/creator/development-guide/scene-limitations/) para conocer los límites impuestos por una scene.
* Asegúrate de que no haya faces ocultas que no puedan verse pero que sumen al recuento de triangles.
* Para formas que deban tener lados redondeados, configúralas como *smooth* en lugar de añadir faces adicionales.
* Asegúrate de que las *normals* de todas las faces miren hacia afuera y no hacia adentro. Si hay faces en tu model que parecen no estar cuando lo renderizas, esa es probablemente la causa.
* Hornea la rotación y la escala de tus meshes, para que sus bounding boxes no se extiendan innecesariamente.


---

# 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 dynamically by asking a question.

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

```
GET https://docs.decentraland.org/creator/content-creator-es/modelado-3d-y-animaciones/meshes.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
