# Meshes

Los modelos 3D tienen una *malla* compuesta de *caras triangulares*. Estas caras se encuentran entre sí en *aristas* (las líneas a lo largo de las cuales se tocan) y *vértices* (los puntos donde se unen sus esquinas).

## 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/90011a101977b5d76e1b7e5aa5db8b73105f33ac)

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

![](/files/7a4b230e8f428a243c6411df4051296e03a94706)

{% hint style="info" %}
**📔 Nota**: En el antiguo cliente web de Decentraland, por razones de rendimiento, si alguna parte de un modelo 3D estaba fuera de los límites, incluso si solo era 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 vértices perfectamente dentro del área de la scene, pero que tiene grandes bounding boxes que están en su mayoría 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 que un modelo 3D sea más útil 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 las meshes, de modo que las bounding boxes no se extiendan más allá de las meshes que envuelven.

![](/files/4636dadd0138382a5da2912534daa331a24d6ede)

*En Blender puedes hacerlo seleccionando los objetos, presionando Ctrl+A y luego Apply “All transforms”.*

Por ejemplo, ten cuidado al rotar una sub-mesh cerca del borde de tu modelo. Como las bounding boxes son cubos, incluso si la mesh es redonda, las esquinas de su bounding box podrían terminar sobresaliendo después de rotarla 45°.

![](/files/9ae3ee9a9686ce174973f00571a8f7885d4a87d4)

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 necesitan tener.

## Limitaciones de triángulos

Debido a que Decentraland es un open world lleno de diferentes scenes y objetos que se descargan sobre la marcha (en el mismo espacio 3D), es importante optimizar nuestras meshes para tener un buen rendimiento mientras se juega. 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.

* **Triángulos:** n x 10000 Cantidad total de triángulos de todos los modelos de la scene.
* **Altura:** log2(n+1) x 20 Altura en metros.
* **Tamaño del archivo:** 15 MB por parcel - 300 MB máx. Tamaño total de los archivos subidos al content server. Incluye modelos 3D y audio. No incluye archivos que no se suben, como paquetes de node.js.
* **Tamaño máximo por 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 revisa 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 recuento de polígonos** Un consejo valioso es llevar siempre un control del polycount de tus modelos. Para hacerlo en Blender, necesitas activar las estadísticas en el panel de overlays del viewport.

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

## Meshes en escenas grandes

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

* **Modularidad:** Divide las meshes grandes en partes más pequeñas y modulares. Por ejemplo, en lugar de tener una sola mesh para todo un edificio, el edificio podría dividirse en meshes separadas 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 considerarse para el renderizado. También mejorará el uso de memoria, porque una mesh puede reutilizarse varias veces para el mismo objeto en diferentes ubicaciones (para lograr esto necesitarás referenciar la misma mesh en la definición de tu scene de SDK7 o usar instances en lugar de objetos duplicados al exportar la scene desde Blender).
* **Bounding Volume**: Asegúrate de que el bounding volume de cada objeto encaje lo más ajustadamente posible. El espacio sobrante en el bounding volume puede hacer que los objetos se rendericen cuando no son visibles.

![](/files/e82c0632652335b06f8eb85d86bcf1bd9b2bf7ed)

### ¿Qué es Frustrum 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:

![](/files/b8df4dbd01a259b4ac73b04d0f4a2b1cc1f84746)

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

![](/files/373f1b71205b31468adfba965e37eb5a6c8d28d5)

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

## Instanciar 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 se duplica un objeto, se crea un nuevo objeto con un conjunto de datos completamente independiente, incluyendo toda su geometría, materials y animations. Esto significa que cualquier cambio hecho en el objeto original no se reflejará en el objeto duplicado, y viceversa.

Por otro lado, cuando un objeto se instancia, cualquier cambio hecho en el objeto 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, instanciar puede ser mucho más eficiente que duplicar, especialmente cuando se trabaja con scenes complejas o grandes cantidades de objetos. Esto se debe a que instanciar usa menos memoria que duplicar, ya que no crea nuevos datos para cada instance. Además, instanciar puede permitir que Blender optimice el proceso de renderizado tratando todas las instances como un solo objeto, en lugar de renderizar cada duplicado por separado.

En general, instanciar 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 se trabaja con escenas grandes y complejas.

![](/files/0c1edb216ad44f1a80e717bff6fe418ed8b22522)

En algunos casos, al duplicar objetos como árboles, plantas y postes de luz, instanciar puede mejorar significativamente el rendimiento en comparación con duplicarlos. Por ejemplo, esta scene tiene catorce postes de luz, todos son exactamente iguales. Sabemos que cada poste de luz tiene dos texturas diferentes, una para el poste y otra para la luz. Así que en este caso tendremos dos draw calls, uno por textura.

![](/files/6c89543ead560b4f002d0c98acffb813d00625f3)

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

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

### Duplicar objetos

| Menú:         | Object ‣ Duplicate Objects |
| ------------- | -------------------------- |
| Tecla rápida: | Shift-D                    |

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

![](/files/5bcf371e20d654096731b1ad81115ea569df731c)

### Instanciar objetos

| Panel:        | Toolbar ‣ Tools ‣ Edit ‣ Duplicate Linked |
| ------------- | ----------------------------------------- |
| Menú:         | Object ‣ Duplicate Linked                 |
| Tecla rápida: | 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 modificarán todas las copias vinculadas. 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/2fba038a51bbdf7af7241a250c824c552e3286a7)

*Cuando exportamos estos modelos, seguiremos teniendo el mismo número de draw calls (28). Sin embargo, ten en cuenta que ahora solo tenemos una mesh, lo que reduce significativamente el uso de disco (41 kb).*

![](/files/cf04b6d0225b2f4894d021a9b849e834934bd055)

*Para mantener todo organizado puedes simplemente instanciar collections en tu scene, de esta manera puedes controlar todas las instances desde una sola carpeta y fuente.*

## 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 objeto se relaciona.

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

* Usa nombres significativos para tus meshes **Ejemplos:** 🟢 **Prefiere** nombres - `Teatro`, `Tranvía` 🔴 **Evita** nombres - `Sin título.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 modificador muy conocido que puede usarse para reducir la cantidad de tris de tu mesh mientras se mantiene la estructura superficial del modelo. Aunque es una herramienta muy poderosa para optimizar modelos, ten en cuenta que una vez que el modelo es decimated, la topología puede verse afectada, causando una mala topología (porque rompe la geometría en piezas impredecibles). Por otro lado, la decimation convertirá los quads de tu mesh en triángulos, lo que dificulta modificarla después de usarla. En ese sentido **la decimation puede ser útil para modelos estáticos, pero no se prefiere para modelos animados.**

![](/files/5068935448b6a51a6a7712d17ca013fd1856dcf7) ![](/files/75a1f46c0d70e2e0a863e134276578bd342ee03e)

Otra forma de optimizar tus meshes usando decimation es decimar el modelo y luego hacer una retopology adecuada. De esta manera puedes asegurar un resultado más predecible y una topología 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 usada para crear modelos simétricos reflejando la 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, al hacer UV Unwrapping (porque solo necesitarás desempaquetar una parte del modelo y el resto compartirá las mismas UV coordinates) y también optimiza tus textures evitando desperdiciar resolución de textura en partes que esencialmente están reflejadas.

![](/files/77569f3a91afae6a8dfd2f5f239ae37454b2eb8c)

### Batch Rename

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 ve a *Edit* y luego en *Batch Rename*.

![](/files/deb94a0f0e8b4d9fa798a3ad9e6528bc5ba6a7fe)

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

![](/files/ffb6d19ad217c7a005550a64316af1ebe739d41a) ![](/files/6e66fdfccecdefa3202abe2bd46f4f73c05ef79b)

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

* Ten en cuenta cuántas caras agregas a tus modelos 3D, ya que más caras hacen que su renderizado sea más exigente. Mira [**limitaciones de la scene**](https://docs.decentraland.org/creator/development-guide/scene-limitations/) para conocer los límites impuestos por una scene.
* Asegúrate de que no haya caras ocultas que no se puedan ver pero que sumen al recuento de triángulos.
* Para las formas que deben tener lados redondeados, configúralas para que sean *suaves* en lugar de añadir caras adicionales.
* Asegúrate de que las *normals* de todas las caras estén orientadas hacia afuera en lugar de hacia adentro. Si hay caras en tu modelo que parecen no estar allí cuando lo renderizas, probablemente esta sea la causa.
* Hornea la rotación y la escala de tus meshes, para que sus bounding boxes no se extiendan innecesariamente.


---

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