Componentes de forma

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

Las escenas tridimensionales en Decentraland se basan en el Entity-Componentarrow-up-right modelo, donde todo en una escena es una entity, y cada entidad puede incluir components que moldean sus características y funcionalidad.

La forma renderizada de una entidad está determinada por qué componente utiliza.



Usa el Scene Editor en Creator Hub

La forma más fácil de darle forma a una entidad es usar el Scene Editor. Puedes agregar un Mesh Renderer component para proporcionar una forma primitiva, o un GLTF component para referenciar un modelo 3D desde un archivo. Ver Add Componentsarrow-up-right.

Formas primitivas

Varias formas básicas, a menudo llamadas primitives, pueden añadirse a una entidad dándole a la entidad un MeshRenderer component.

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 adicional opcional, para mapear la alineación de la textura. Ver materialsarrow-up-right para más detalles.

  • plano:

    Usa MeshRenderer.setPlane(), pasando la entidad. Pasa uvs como un campo adicional opcional, para mapear la alineación de la textura. Ver materialsarrow-up-right 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 ya sea radiusTop o radiusBottom a 0 para crear 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 materiales. Para darle un color o una textura, debes asignar un material componentarrow-up-right a la misma entidad.

Para hacer que una primitiva sea clicable, o para evitar que los jugadores la atraviesen, debes darle a la entidad un collider vía un MeshColliderarrow-up-right component.

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

circle-exclamation

Modelos 3D

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

Para añadir un modelo externo a una escena, añade un GltfContainer component a una entidad y configura su src al camino del archivo glTF que contiene el modelo.

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

circle-info

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

Los modelos glTF pueden incluir sus propias texturas, materiales, colisionadores y animaciones incrustadas. Ver Modelos 3Darrow-up-right para más información sobre esto. Para sobrescribir los materiales de un modelo, usa el GltfNodeModifiersarrow-up-right component. Ver Modify glTF materialsarrow-up-right para más detalles.

Para evitar que los jugadores atraviesen un modelo 3D, o para hacer que un modelo sea clicable, debes tener un colliderarrow-up-right, que puede estar incrustado en el modelo o proporcionado vía un MeshCollider component.

Ten en cuenta que todos los modelos, sus shaders y sus texturas deben estar dentro de los parámetros de las scene limitationsarrow-up-right.

circle-exclamation

Pre carga de un modelo 3D

En algunos casos, un modelo 3D personalizado se añade a la escena pero no se usa inmediatamente. Por ejemplo, un modelo de silla personalizado puede cargarse solo cuando el jugador interactúa con otro objeto. En este escenario, la primera interacción podría tomar algo de tiempo hasta que termine de descargarse y cargarse el modelo.

Para evitar esto, usa el AssetLoad.create método para asegurar que el activo se descargue antes de que sea necesario.

Para más información, consulta la documentación de Pre Load Resourcesarrow-up-right .

Bibliotecas gratuitas de modelos 3D

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

Para ayudarte a empezar, a continuación hay una lista de bibliotecas que tienen contenido gratuito o relativamente económico:

circle-exclamation

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

Optimizar modelos 3D

Para asegurar que los modelos 3D en tu escena se carguen más rápido y ocupen menos memoria, sigue estas mejores prácticas:

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

  • Si tienes múltiples modelos que comparten las mismas texturas, exporta tus modelos con texturas en un archivo separado. De esa manera varios modelos pueden referirse a un único archivo de textura que solo necesita cargarse una vez.

  • Si tu escena tiene entidades que aparecen y desaparecen, podría ser una buena idea agrupar estas entidades y mantenerlas bajo tierra, o con una escala de 0. Esto les ayudará a aparecer más rápido; la contrapartida es que ocuparán memoria cuando no estén en uso. Ver entities and componentsarrow-up-right

Estirar una forma

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

Hacer invisible

Puedes hacer una entidad invisible dándole a la entidad un VisibilityComponent, con su visible propiedad configurada a false.

El VisibilityComponent funciona igual para entidades con formas primitivas y con GLTFContainer components.

Si una entidad es invisible, su collider puede bloquear el camino de un jugador y/o impedir hacer clic en entidades que están detrás de ella, dependiendo de las capas de colisión asignadas al collider.

Propagar visibilidad

Puedes usar el propagateToChildren campo en el VisibilityComponent para aplicar una configuración a cada hijo en el árbol de hijos de la entidad. Si propagateToChildren está configurado a trueestas configuraciones afectan a todos los hijos en todos los niveles hacia abajo. Esto puede ahorrarte mucho trabajo tedioso marcando cada entidad hija como invisible o visible también.

circle-exclamation

Estado de carga

Si un modelo 3D es bastante grande, puede tardar un tiempo notable en renderizarse; este tiempo puede variar dependiendo del hardware del jugador 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 teleportar al jugador a una plataforma en el cielo, primero necesitas asegurarte de que la plataforma esté completamente renderizada antes de mover al jugador allí, o de lo contrario el jugador podría caer a través de la plataforma.

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

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

El siguiente ejemplo usa un sistema para comprobar periódicamente el estado de carga del modelo 3D de una entidad. Si el estado es LoadingState.FINISHED, quizá quieras ejecutar lógica personalizada allí y finalizar la ejecución del sistema.

Sintaxis avanzada

La sintaxis completa para crear un MeshRenderer component, sin ningún ayudante para simplificarla, se ve así:

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

El $case el campo te permite especificar uno de los tipos permitidos. Cada tipo admite un conjunto diferente de parámetros. En el ejemplo anterior, el caja type 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 las propiedades relevantes.

Para añadir un MeshRenderer component a una entidad que potencialmente ya tiene una instancia de este componente, usa MeshRenderer.createOrReplace(). Las funciones auxiliares como MeshRenderer.setBox() manejan 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