Meshes

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

Los modelos 3D tienen un mesh compuesto por triángulos faces. Estas caras 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).

Limitaciones de espacio

Todos los modelos 3D de tu escena deben caber dentro de los límites de sus parcelas. Si alguna parte de tus modelos se extiende más allá de estos límites al ejecutar una vista previa, esas partes que se extiendan serán recortadas y no se renderizarán.



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


circle-info

📔 Nota: En el cliente web antiguo de Decentraland, por razones de rendimiento, si alguna parte de un modelo 3D estaba fuera de los límites, incluso si solo era la caja delimitadora, entonces todo el modelo no se renderizaba. A partir del cliente de escritorio de Decentraland 2.0, solo las partes de un modelo que están fuera de los límites se recortan. Las partes del modelo que están dentro de la escena se renderizan.

Bounding Boxes

Si tienes un modelo cuyos vértices están ordenadamente dentro del área de la escena, pero que tiene cajas delimitadoras grandes que están mayormente vacías y se extienden más allá de los límites de la escena, el modelo entero se marcará como fuera de los límites de la escena en Creator Hub. Las partes del modelo que estén dentro de tus parcelas se renderizarán correctamente y se te permitirá publicar tu escena.

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

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



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

Por ejemplo, ten cuidado al rotar un sub-mesh cerca del borde de tu modelo. Dado que las cajas delimitadoras son cubos, incluso si el mesh es redondo, las esquinas de su caja delimitadora podrían terminar sobresaliendo después de rotarlo 45°.



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

Limitaciones de triángulos

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

n representa el número de parcelas que ocupa una escena.

  • Triángulos: n x 10000 Cantidad total de triángulos para todos los modelos en la escena.

  • Altura: log2(n+1) x 20 Altura en metros.

  • Tamaño de archivo: 15 MB por parcela - 300 MB máx Tamaño total de los archivos subidos al servidor de contenido. Incluye modelos 3D y audio. No incluye archivos que no se suben, como paquetes node.js.

  • Tamaño máximo de archivo 50 MB por archivo Ningún archivo individual de ningún tipo en la escena puede exceder los 50 MB, sin importar cuántas parcelas tenga la escena.

Para más información consulta todas las limitaciones de la escena aquí.arrow-up-right

circle-exclamation

Meshes en escenas grandes

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

  • Modularidad: Descompón meshes grandes en partes más pequeñas y modulares. Por ejemplo, en lugar de tener un único 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 más eficazmente, ya que solo las partes visibles necesitan considerarse para el renderizado. También mejorará la huella de memoria, porque un mesh puede reutilizarse varias veces para el mismo objeto en diferentes ubicaciones (para lograr esto necesitarás referenciar el mismo mesh en la definición de tu escena SDK7 o usar instancias en lugar de objetos duplicados al exportar la escena desde Blender).

  • Volumen delimitador: Asegúrate de que el volumen delimitador de cada objeto se ajuste lo más ajustadamente posible. El espacio extra en el volumen delimitador puede causar que los objetos se rendericen cuando no son visibles.



¿Qué es el Frustum Culling?

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



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



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

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

Por otro lado, cuando un objeto se instancia, cualquier cambio realizado en el 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, instanciar puede ser mucho más eficiente que duplicar, especialmente cuando se trabaja con escenas 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 instancia. Además, instanciar puede permitir que Blender optimice el proceso de renderizado tratando todas las instancias 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 escena de Decentraland, especialmente cuando se trabaja con escenas grandes y complejas.



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



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

Analicemos cuáles son los pros y los contras de cada procedimiento.

Duplicar objetos

Menú:
Object ‣ Duplicate Objects

Atajo:

Shift-D

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



Instanciar 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, todas las copias vinculadas se modifican. Las propiedades de transformación siguen siendo copias, no enlaces, por lo que aún puedes rotar, escalar y mover libremente sin afectar a las otras copias.



Cuando exportamos estos modelos, todavía tendremos el mismo número de draw calls (28). Sin embargo, nota que ahora solo tenemos un mesh, lo que reduce significativamente el uso en disco (41 kb).



Para mantener las cosas organizadas puedes simplemente instanciar colecciones en tu escena; de esta manera puedes controlar todas las instancias desde una sola carpeta y fuente.

Nombrado 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 el nombrado de assets usa una mezcla de PascalCase y snake_case, que podemos llamar PascalSnake_case. Las reglas básicas son: nueva palabra o 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 las cosas más comunes primero y los específicos 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 gratuitas y otras de pago, por nombrar algunas:

Decimate

Este es un modificador bien conocido que puede usarse para reducir la cantidad de tris de tu mesh mientras se mantiene la estructura de la superficie del modelo. Si bien esta es una herramienta muy poderosa para optimizar modelos, ten en cuenta que una vez que el modelo se decima la topología puede verse afectada causando una mala topología (porque rompe la geometría en piezas impredecibles). Por otro lado, la decimación convertirá los quads de tu mesh en triángulos, lo que dificulta modificarlo después de su uso. En ese sentido la decimación puede ser útil para modelos estáticos pero no es preferida para modelos animados.




Otra forma de optimizar tus meshes usando decimación es decimar el modelo y luego hacer una retopología adecuada. De esta manera puedes asegurar un resultado más predecible y una topología limpia.

Algunos addons de retopología que pueden ser útiles son (algunos de ellos 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 al reflejar 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 el UV Unwrapping (porque solo necesitarás desplegar una parte del modelo y el resto compartirá las mismas coordenadas UV) y también optimiza tus texturas evitando desperdiciar resolución de textura en partes que son esencialmente reflejadas.



Renombrado por lotes

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



Selecciona los objetos cuyo nombre quieres cambiar y simplemente reemplaza el nombre de objeto por defecto por el nuevo. Esta herramienta proporciona diferentes métodos y tipos de assets para renombrar, por lo que es muy flexible para cambiar los nombres también de meshes, animaciones, huesos, etc.




Mejores prácticas para geometrías #arrow-up-right

  • Ten en cuenta cuántas caras añades a tus modelos 3D, ya que más caras hacen que su renderizado sea más exigente. Ver limitaciones de la escenaarrow-up-right para los límites impuestos por una escena.

  • Asegúrate de que no haya caras ocultas que no se puedan ver pero que sumen al conteo de triángulos.

  • Para formas que deberían tener lados redondeados, configúralas como smooth en lugar de añadir caras adicionales.

  • Asegúrate de que las normals de todas las caras apunten hacia afuera en lugar de hacia adentro. Si hay caras en tu modelo que parecen no estar cuando lo renderizas, esta es muy probablemente la causa.

  • Hornea la rotación y la escala de tus meshes, para que sus cajas delimitadoras no se extiendan innecesariamente.

Última actualización