For the complete documentation index, see llms.txt. This page is also available as Markdown.

Shape Components

Aprende sobre los diferentes components que le dan a las entities su forma 3D y collision.

Las escenas tridimensionales en Decentraland se basan en el Entity-Component modelo, donde todo en una escena es una entity, y cada entity puede incluir components que dan forma a sus características y funcionalidad.

La forma renderizada de una entity está determinada por el component que usa.



Usa el Scene Editor en Creator Hub

La forma más fácil de darle una forma a una entity es usar el Scene Editor. Puedes añadir un Mesh Renderer component para proporcionar una forma primitiva, o un GLTF component para referenciar un modelo 3D desde un archivo. Ver Add Components.

Formas primitivas

Varias formas básicas, a menudo llamadas primitives, se pueden añadir a una entity dándole un MeshRenderer componente.

Las siguientes formas están disponibles. Varias formas incluyen campos adicionales opcionales, específicos para esa forma.

  • caja:

    Usa MeshRenderer.setBox(), pasando la entidad. Pasa uvs como un campo opcional adicional, para mapear la alineación de la textura. Ver materials para más detalles.

  • plano:

    Usa MeshRenderer.setPlane(), pasando la entidad. Pasa uvs como un campo opcional adicional, para mapear la alineación de la textura. Ver materials para más detalles.

  • esfera:

    Usa MeshRenderer.setSphere(), pasando la entidad.

  • cilindro:

    Usa MeshRenderer.setCylinder(), pasando la entidad. Pasa radiusTop y radiusBottom como campos opcionales adicionales para modificar el cilindro.

    CONSEJO: Establece cualquiera de los dos radiusTop o radiusBottom en 0 para hacer un cono.

El siguiente ejemplo crea un cubo:

El siguiente ejemplo crea un cilindro con un radiusTop de 0, lo que produce un cono:

Las formas primitivas no incluyen materials. Para darle un color o una texture, debes asignar un material component a la misma entity.

Para hacer que una primitive sea clickable, o para impedir que los players la atraviesen, debes darle a la entity un collider mediante un MeshCollider componente.

Para cambiar la forma de una entity que ya tiene un MeshRenderer componente, ejecuta MeshRenderer.setBox() o cualquiera de las otras funciones de ayuda y sobrescribirá la forma original. No es necesario eliminar el original MeshRenderer ni usar la sintaxis avanzada.

modelos 3D

Para formas más complejas, puedes construir un modelo 3D en una herramienta externa como Blender y luego importarlo en .glTF o .glb (binario .glTF). glTF (GL Transmission Format) es un proyecto abierto de Khronos que proporciona un formato común y extensible para assets 3D que es a la vez eficiente y altamente interoperable con las tecnologías web modernas.

Para añadir un modelo externo a una scene, añade un GltfContainer component a una entity y establece su src a la ruta del archivo glTF que contiene el modelo.

El src field es obligatorio, debes darle un valor al construir el component. En el ejemplo anterior, el modelo está ubicado en una carpeta models en el nivel raíz de la carpeta del proyecto de la scene.

💡 Consejo: Recomendamos mantener tus models separados en la assets/scene/models dentro de tu scene.

Los modelos glTF pueden incluir sus propias textures, materials, colliders y animations integradas. Ver modelos 3D para obtener más información sobre esto. Para sobrescribir los materials de un modelo, usa el GltfNodeModifiers component. Consulta Modificar materiales glTF para más detalles.

Para evitar que los players atraviesen un modelo 3D, o para hacer que un modelo sea clickable, debes tener un collider, que puede estar integrado en el modelo o proporcionado mediante un MeshCollider componente.

Ten en cuenta que todos los models, sus shaders y sus textures deben estar dentro de los parámetros del limitaciones de la scene.

Precarga de un modelo 3D

En algunos casos, se añade a la scene un modelo 3D personalizado, pero no se usa de inmediato. Por ejemplo, un modelo personalizado de silla puede cargarse solo cuando el player interactúa con otro objeto. En este escenario, la primera interacción puede tardar un poco hasta que termine de descargar y cargar el modelo.

Para evitar esto, usa el AssetLoad.create método para asegurar que el asset se descargue antes de que se necesite.

Para más información, consulta la documentación de Pre Load Resources .

Bibliotecas gratuitas de modelos 3D

En lugar de crear tus propios modelos 3D, también puedes descargarlos de varias bibliotecas gratuitas o de pago.

Para ayudarte a empezar, a continuación tienes una lista de bibliotecas con contenido gratuito o relativamente económico:

Ten en cuenta que en varios de estos sitios puedes elegir en qué formato descargar el modelo. Elige siempre el formato .glTF si está disponible. Si no está disponible, debes convertirlos a glTF antes de que puedas usarlos en una scene. Para ello, recomendamos importarlos a Blender y exportarlos como .glTF desde allí.

Optimizar modelos 3D

Para asegurarte de que los modelos 3D de tu scene carguen más rápido y ocupen menos memoria, sigue estas buenas prácticas:

  • Guarda tus models en formato .glb format, que es una versión más ligera de .gltf.

  • Si tienes varios models que comparten las mismas textures, exporta tus models con las textures en un archivo separado. De ese modo, varios models pueden referenciar un único archivo de texture que solo necesita cargarse una vez.

  • Si tu scene tiene entities que aparecen y desaparecen, puede ser una buena idea agrupar esas entities y mantenerlas bajo tierra, o con una escala de 0. Esto ayudará a que aparezcan más rápido; la desventaja es que ocuparán memoria cuando no estén en uso. Ver entities and components

Estirar una forma

Las formas primitivas y los modelos 3D tienen dimensiones predeterminadas que puedes modificar cambiando la escala en el Transform componente.

Hacer invisible

Puedes hacer que una entity sea invisible dándole a una entity un VisibilityComponent, con su propiedad visible establecida en false.

El VisibilityComponent funciona igual para entities con formas primitivas y con componentes GLTFContainer .

Si una entity es invisible, su collider puede bloquear el camino de un player y/o impedir hacer click en entities que estén detrás de ella, dependiendo de las collision layers asignadas al collider.

Propagar la visibilidad

Puedes usar el componente propagateToChildren campo en el VisibilityComponent para aplicar una configuración a cada child en el árbol de children de la entity. Si propagateToChildren se establece en true, estos ajustes afectan a todos los children en todos los niveles hacia abajo. Esto puede ahorrarte mucho trabajo tedioso al marcar cada child entity como invisible o visible también.

Estado de carga

Si un modelo 3D es bastante grande, puede tardar un tiempo notable en renderizarse; este tiempo puede variar según el hardware del player y muchos otros factores. A veces necesitas asegurarte de que un modelo haya terminado de cargarse antes de realizar otra acción. Por ejemplo, si quieres teletransportar al player a una plataforma en el cielo, primero debes asegurarte de que la plataforma esté completamente renderizada antes de mover al player allí, o de lo contrario el player podría caer a través de la plataforma.

Para comprobar si un modelo 3D ha terminado de renderizarse, revisa el component GltfContainerLoadingState . Este component está pensado para ser de solo lectura y existe en cualquier entity que también tenga un GltfContainercomponente.

Este component tiene una sola propiedad llamada currentState, que contiene un valor del LoadingState .

El siguiente ejemplo usa un system para comprobar periódicamente el estado de carga del modelo 3D de una entity. Si el estado es LoadingState.FINISHED, puede que quieras realizar lógica personalizada allí y finalizar la ejecución del system.

Sintaxis avanzada

La sintaxis completa para crear un MeshRenderer componente, sin usar ayudas para simplificarlo, se ve así:

Así es como el protocolo base interpreta los components de MeshRenderer. Las funciones de ayuda abstraen esto y exponen una sintaxis más amigable, pero detrás de escena generan esta sintaxis.

El $case campo te permite especificar uno de los tipos permitidos. Cada tipo admite un conjunto diferente de parámetros. En el ejemplo anterior, el caja tipo admite un uvs campo.

Los valores compatibles para $case son los siguientes:

  • caja

  • plano

  • esfera

  • cilindro

Dependiendo del valor de $case, es válido definir el objeto para la forma correspondiente, pasando cualquier propiedad relevante.

Para añadir un MeshRenderer componente a una entidad que potencialmente ya tiene una instancia de este componente, usa MeshRenderer.createOrReplace(). Las funciones auxiliares como MeshRenderer.setBox() gestionan la sobrescritura de instancias existentes del componente, pero ejecutar MeshRenderer.create() en una entidad que ya tiene este componente devuelve un error.

Última actualización