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

Materiales

Aprende cómo añadir materiales y texturas a entidades con formas primitivas.

Materiales

Los Materials pueden aplicarse a entities que usan formas primitivas (cube, sphere, plane, etc.) agregando un Material component. Este component tiene varios fields que te permiten configurar las properties del material, agregar una texture, etc.

glTF models incluyen sus propios materiales, que se importan implícitamente a una scene junto con el model. Para modificar o sobrescribir estos materials, usa GltfNodeModifiers component. Consulta Modificar materiales glTF para más detalles.

Al importar un modelo 3D con sus propios materials, ten en cuenta que no todos los shaders son compatibles con el engine de Decentraland. Solo se admiten materials estándar y materiales PBR (physically based rendering). Consulta consideraciones sobre modelos 3D externos para más detalles.

Hay diferentes tipos de materials compatibles:

  • PBR (Physically Based Rendering): El tipo de material más común en Decentraland. Admite colores planos o textures, y diferentes properties como metallic, emissive, transparency, etc. Lee más sobre PBR.

  • Materials básicos: no responden a las luces ni a las sombras, lo que los hace ideales para mostrar imágenes tipo billboard.

Usa el Scene Editor en Creator Hub

La forma más sencilla de darle a un entity un Material es usar el Scene Editor. Puedes agregar un Material component a tu entity y luego configurar todos los fields disponibles en la UI del Scene Editor. Consulta Add Components.

Agregar un material

El siguiente ejemplo crea un material PBR y configura algunos de sus fields para darle un color rojo y propiedades metálicas. Este material se agrega a un entity que también tiene una box shape, por lo que coloreará la box con este material.

//Crear entity y asignar shape
const meshEntity = engine.addEntity()
Transform.create(meshEntity, {
	position: Vector3.create(4, 1, 4),
})
MeshRenderer.setBox(meshEntity)

//Crear material y configurar sus fields
Material.setPbrMaterial(meshEntity, {
	albedoColor: Color4.Red(),
	metallic: 0.8,
	roughness: 0.1,
})

Para cambiar el material de un entity que ya tiene un Material component, ejecuta Material.setPbrMaterial() o cualquiera de las otras funciones auxiliares y sobrescribirá el material original. No es necesario eliminar el Material original ni usar la sintaxis avanzada.

Colores de Material

Dale a un material un color plano. En un Material PBR, estableces el albedoColor field. Los colores albedo responden a la luz y pueden incluir sombras.

Los valores de color son de tipo Color4, compuestos por r, g y b values (rojo, verde y azul). Cada uno de estos acepta valores entre 0 y 1. Al establecer diferentes values para estos, puedes componer cualquier color visible. Para negro, establece los tres en 0. Para blanco, establece todos en 1.

Consulta tipos de color para obtener más detalles sobre cómo establecer colores.

También puedes editar los siguientes fields en un Material PBR para ajustar mejor cómo se percibe su color:

  • emissiveColor: El color emitido por el material.

  • reflectivityColor: también conocido como Specular Color en otra nomenclatura.

Para crear un material de color plano que no se vea afectado por la luz y las sombras del entorno, crea un basic material en lugar de un material PBR.

Usando texturas

Configura un archivo de imagen como texture en un material estableciendo el texture parámetro.

En el ejemplo anterior, la imagen del material está ubicada en una carpeta assets/materials que se encuentra en el nivel raíz de la carpeta del proyecto de la scene.

💡 Consejo: Recomendamos guardar tus archivos de imagen de textura en algún lugar de la carpeta /assets dentro de tu scene.

Mientras creas una texture, también puedes pasar parámetros adicionales:

  • filterMode: Determina cómo se estiran o comprimen los píxeles de la texture al renderizarse. Toma un valor del TextureFilterMode enum. Consulta Escalado de texturas.

  • wrapMode: Determina cómo se repite una texture sobre un objecto. Toma un valor del TextureWrapMode enum. Consulta Envoltura de texturas.

Para crear una texture que no se vea afectada por la luz y las sombras del entorno, crea un basic material en lugar de un material PBR.

Texturas desde una URL externa

Puedes apuntar la texture de tu material a una URL externa en lugar de una ruta interna en el proyecto de la scene.

La URL debe comenzar con https, http las URLs no son compatibles.

Envoltura de texturas

Puedes definir cómo una texture se alinea con una surface. Por defecto, la texture se estira para ocupar la surface una vez, pero puedes escalarla y desplazarla.

Los siguientes fields están disponibles en todas las textures:

  • offset: Desplaza la texture para cambiar su alineación. El value es un Vector2, donde ambos ejes van de 0 a 1, siendo 1 el ancho o alto completo de la texture.

  • tiling: Escala la texture. El value por defecto es el Vector 2 [1, 1], lo que hace que la imagen se repita una vez cubriendo toda la surface.

  • TextureWrapMode: Determina qué ocurre si el tiling de la imagen no cubre toda la surface. Esta property toma sus values del TextureWrapMode enum, lo que permite los siguientes values:

    • TextureWrapMode.TWM_CLAMP: La texture solo se muestra una vez con el tamaño especificado. El resto de la surface de la mesh se deja transparente. El value de tiling se ignora.

    • TextureWrapMode.TWM_REPEAT: La texture se repite tantas veces como quepa en la mesh, usando el tamaño especificado.

    • TextureWrapMode.TWM_MIRROR: Igual que en wrap, la texture se repite tantas veces como quepa, pero la orientación de estas repeticiones se refleja.

Usa esta feature para cubrir una gran surface con un patrón repetido. Por ejemplo, repite la siguiente imagen:




En el siguiente ejemplo, la texture usa un mirror wrap mode, y cada repetición de la texture ocupa solo 1/4 de la surface. Esto significa que veremos 4 copias de la imagen, reflejadas entre sí en ambos ejes.

Tweens de texturas

Haz que una texture se deslice suavemente usando un Tween component, configurado con el modo TextureMove . El tween cambia gradualmente el value de las offset o la tiling properties de una texture durante un período de tiempo, de forma suave y optimizada.

Usa la Tween component con la función setTextureMove para mover la texture entre dos posiciones.

El texture tween toma la siguiente información:

  • entity: El entity al que mover la texture

  • inicio: Un Vector2 para la posición inicial

  • final: Un Vector2 para la posición final

  • duration: Cuántos milisegundos tarda en moverse entre las dos posiciones

También está disponible este otro parámetro opcional:

  • movementType: define si el movimiento será en el offset o la tiling field. Por defecto usa offset.

  • easingFunction: La curva para la tasa de cambio a lo largo del tiempo; el value por defecto es EasingFunction.EF_LINEAR. Otros values hacen que el cambio acelere y/o desacelere a diferentes ritmos.

El ejemplo anterior ejecuta un tween que dura 1 segundo y mueve la texture solo una vez. Para lograr un movimiento continuo, por ejemplo para simular la caída de una cascada, necesitas usar setTextureMoveContinuous.

El ejemplo anterior usa setTextureMoveContinuous, con una dirección de (0, 1), y una velocidad de 1 unidad por segundo.

El texture continuous tween toma la siguiente información:

  • entity: El entity al que mover la texture

  • direction: Un Vector2 para el movimiento

  • speed: Cuántas unidades por segundo se moverá el entity

También están disponibles estos otros parámetros opcionales:

  • movementType: define si el movimiento será en el field offset o en el field tiling. Por defecto usa offset.

  • duration: Cuántos milisegundos mantener el movimiento. Después de este tiempo, el movimiento se detendrá.

Secuencias complejas de tween

También puedes hacer que los movimientos de la texture sigan una secuencia compleja con tantos pasos como quieras. Usa el sequence field para listar tantos tweens como quieras; se ejecutarán secuencialmente después del primer tween descrito en Tween component.

Ten en cuenta que, al definir un tween dentro de un TweenSequence, necesitas usar el formato más detallado de Tween.Mode.TextureMove para definir el tween.

Texturas multicapa

Puedes usar varios archivos de imagen como layers para componer textures más realistas, por ejemplo incluyendo un bumpTexture y un emissiveTexture.

La bumpTexture puede simular relieves y arrugas en una surface, modificando cómo se comportan los normals de la surface en cada píxel.



La emissiveTexture puede acentuar el resplandor en ciertas partes de un material para lograr efectos muy interesantes.

Configurar UVs

Otra alternativa para cambiar la escala o la alineación de una texture es configurar las properties uv en el component MeshRenderer.

Estableces u y v coordinates en la imagen 2D de la texture para que correspondan a los vertices de la shape. Cuantos más vertices tenga el entity, más uv coordinates deberán definirse en la texture; por ejemplo, un plane necesita tener 8 uv points definidos, 4 para cada una de sus dos faces.

El siguiente ejemplo incluye una function que simplifica la configuración de uvs. La setUVs function definida aquí recibe un número de rows y cols como parámetros, y configura las uvs para que la imagen de la texture se repita un número específico de veces.

Para configurar los UVs de una box mesh shape, se aplica la misma estructura. Cada una de las 6 faces del cube toma 4 pares de coordinates, uno para cada esquina. Los 48 values se listan como un único array.

Escalado de texturas

Cuando las textures se estiran o se reducen a un tamaño diferente del de la imagen original de la texture, esto a veces puede crear artefactos. En un entorno 3D, los efectos de la perspectiva hacen que esto ocurra de forma natural. Existen varios algoritmos de filtrado de texturas que existen para compensarlo de diferentes maneras.

La Material object usa el bilinear algoritmo por defecto, pero te permite configurarlo para usar los algoritmos de vecino más cercano o trilineal en su lugar estableciendo la filterMode property de la texture. Esto toma un value del TextureFilterMode enum:

  • TextureFilterMode.TFM_POINT: Usa un algoritmo de "vecino más cercano". Esta configuración es ideal para gráficos de estilo pixel art, ya que los contornos se mantendrán nítidamente marcados cuando la texture se vea más grande en pantalla, en lugar de verse borrosa.

  • TextureFilterMode.TFM_BILINEAR: Usa un algoritmo bilinear para estimar el color de cada píxel.

  • TextureFilterMode.TFM_TRILINEAR: Usa un algoritmo trilineal para estimar el color de cada píxel.

Materials sin iluminación

La mayoría de las veces querrás que los materials de tu scene se vean afectados por las condiciones de iluminación, incluidas las sombras y los tintes producidos por los cambios de tono de las distintas horas del día. Pero en otros casos quizá quieras mostrar los colors en su estado puro. Esto es útil al reproducir videos, o también para marcadores abstractos que necesitan destacar y están pensados para señalar hints al player.

Para crear un material sin iluminación, usa Material.setBasicMaterial. Los basic materials no tienen todas las mismas properties que los materiales PBR; solo tienen las esenciales:

  • diffuseColor: Color4 para el color

  • texture: Texture

  • alphaTexture: texture separada para la layer de transparencia

  • alphaTest: umbral para lograr transparencia en función del color de la texture

  • castShadows: Si es false, no se proyectan sombras sobre otros entities de la scene.

Retratos de Avatar

Para mostrar una imagen en miniatura de cualquier player, usa Material.Texture.Avatar al establecer la texture de tu material, pasando la dirección de un player existente. Esto crea una texture a partir de una imagen de 256x256 del player, mostrando la cabeza y los hombros. El player se muestra usando el conjunto de wearables que el server actual registró por última vez.



Puedes obtener el retrato de cualquier player de Decentraland, incluso si no está conectado actualmente, e incluso si no tiene un Decentraland name reclamado.

Las siguientes properties son compatibles dentro del object que pasas como argumento:

  • userId: ID del user cuyo profile quieres mostrar

  • filterMode: Determina cómo se estiran o comprimen los píxeles de la texture al renderizarse. Toma un valor del TextureFilterMode enum. Consulta Escalado de texturas.

  • wrapMode: Determina cómo se repite una texture sobre un objecto. Toma un valor del TextureWrapMode enum. Consulta Envoltura de texturas.

Materials transparentes

Para hacer transparente un material con un color plano, simplemente define el color como un Color4y establece el 4.º value en algo entre 0 y 10 y 1. 1Cuanto más cerca esté de

Si un material usa una textura .png que incluye transparencia, será opaco por defecto, pero puedes activar su transparencia estableciendo el transparencyMode a MaterialTransparencyMode.MTM_ALPHA_BLEND.



La transparencyMode puede tener los siguientes values:

  • MaterialTransparencyMode.MTM_OPAQUE: Sin transparencia en absoluto

  • MaterialTransparencyMode.MTM_ALPHA_TEST: Cada píxel es completamente opaco o completamente transparente, según un umbral.

  • MaterialTransparencyMode.MTM_ALPHA_BLEND: Son posibles valores intermedios en función del value de cada píxel.

  • MaterialTransparencyMode.MTM_ALPHA_TEST_AND_ALPHA_BLEND: Usa una combinación de ambos métodos.

  • MaterialTransparencyMode.MTM_AUTO: Determina el método según la textura proporcionada.

Si estableces el transparencyMode a MaterialTransparencyMode.MTM_ALPHA_TEST, puedes ajustar finamente el umbral utilizado para determinar si cada píxel es transparente o no. Establece el alphaTest propiedad entre 0 y 1. Por defecto, su valor es 0.5.

Al usar un material sin iluminación, puedes añadir un alphaTexture para hacer que solo ciertas regiones del material sean transparentes, basándose en una textura.



Esto puede usarse de formas muy interesantes junto con videos. Consulta video en reproducción.

Video en reproducción

Para transmitir video desde una URL a un material, o reproducir un video desde un archivo almacenado en la scene, consulta video en reproducción.

El video se usa como una textura en un material, puedes establecer cualquiera de las otras propiedades de los materiales para alterar cómo se ve la pantalla de video.

Sintaxis avanzada

La sintaxis completa para crear un Materiales componente, sin ningún helper para simplificarlo, se ve así:

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

La $case campos te permiten especificar uno de los tipos permitidos. Cada tipo admite un conjunto distinto de parámetros. Hay dos niveles de $case aquí:

  • La material campo admite los valores pbr y unlit, para definir el tipo de material.

  • La tex campo dentro de una textura admite los siguientes valores, para definir el tipo de textura:

    • texture

    • avatarTexture

    • videoTexture

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

Para añadir un Material componente a una entidad que potencialmente ya tenga una instancia de este componente, usa Material.createOrReplace(). Las funciones helper como Material.setPbrMaterial() manejan la sobrescritura de instancias existentes del componente, pero ejecutar Material.create() en una entidad que ya tenga este componente devuelve un error.

Modificar materiales glTF

Usa la GltfNodeModifiers componente para modificar los materiales de un glTF modelo. Este componente te permite sobrescribir los materiales de un glTF modelo con tus propios materiales. Puedes usar cualquiera de las propiedades del Material componente, incluyendo textura, textura de video, materiales sin iluminación, etc.

Hay dos maneras de usar el GltfNodeModifiers componente:

  • Modifica el material de todo el modelo dejando el path propiedad como una cadena vacía.

  • Modifica el material de un nodo específico en el modelo (o varios nodos) estableciendo la path propiedad a la ruta al nodo.

Modifica el material de todo el modelo

El siguiente ejemplo muestra cómo modificar el material de un glTF modelo. En este caso, el material de todo el modelo se modifica para ser rojo.

La GltfNodeModifiers component tiene las siguientes propiedades:

  • modifiers: Un array de modificadores. Cada modificador tiene las siguientes propiedades:

    • path: La ruta al nodo en el modelo que se va a modificar.

    • material: El material a usar.

La path La propiedad es una cadena que representa la ruta al nodo en el glTF modelo que se va a modificar. Si quieres modificar el material de todo el modelo, puedes usar una cadena vacía. Si quieres modificar el material de un nodo específico, puedes usar la ruta al nodo. La ruta debe apuntar a un nodo mesh, no a un nodo vértice.

💡 Consejo: Puedes usar la aplicación Babylon Sandbox para inspeccionar el glTF modelo y encontrar la ruta al nodo que quieres modificar.

En algunos modelos, sin embargo, Babylon Sandbox puede listar rutas que pertenecen a vértices en lugar de meshes, lo cual no funcionará. Si intentas usar una ruta que no sea válida, la consola de la scene mostrará un mensaje de error que incluye la lista completa de rutas válidas en ese modelo.

La material La propiedad es un objeto que representa el material a usar. Debe escribirse usando la sintaxis avanzada para materials, como se muestra en el ejemplo anterior. Las funciones helper como Material.setPbrMaterial() no se pueden usar aquí.

Modifica el material de un nodo específico en el modelo

El siguiente ejemplo muestra cómo modificar el material de un nodo específico en el glTF modelo. En este caso, el material de la cabeza se modifica para usar una textura alternativa.

Un GltfNodeModifiers puede contener varios modificadores, cada uno modificando un nodo diferente en el modelo. El siguiente ejemplo muestra cómo modificar el material de la cabeza y el cuerpo de un glTF modelo.

Modificar campos de un material existente

El componente Material proporciona una interfaz simplificada para acceder y modificar las propiedades del componente Material. Elimina la necesidad de navegar por estructuras de unión profundamente anidadas (PBR vs Unlit, texture vs avatarTexture vs videoTexture), lo que hace que la manipulación de materiales sea más intuitiva y menos propensa a errores.

Los siguientes métodos permiten una manipulación sencilla del Material componente:

  • Material.getFlat(entity: Entity): ReadonlyFlatMaterial: Devuelve un objeto accesor de solo lectura FlatMaterial que proporciona acceso directo de lectura a las propiedades del material. Devolverá un error si la entidad no tiene un Material componente. Para evitar esto, se pueden usar los siguientes métodos como alternativa.

  • Material.getFlatOrNull(entity: Entity): ReadonlyFlatMaterial | null: Devuelve un objeto accesor de solo lectura o null, dependiendo de si la entidad tiene o no un Material component.

  • Material.getFlatMutable(entity: Entity): FlatMaterial: Devuelve un objeto accesor de lectura y escritura FlatMaterialobjeto que permite modificar sus propiedades. Lanzará un error si la entidad a la que se llama no tiene el Material component.

  • Material.getFlatMutableOrNull(entity: Entity): FlatMaterial | null: Devuelve un objeto accesor de lectura y escritura o null FlatMaterial objeto que permite modificar sus propiedades. En caso de que la entidad no tenga un componente Material, devolverá null.

Eliminar sombras de un modelo glTF

Para eliminar sombras de un glTF modelo, puedes establecer la castShadows propiedad a false en el GltfNodeModifiers objeto. Esto conserva el material original del modelo, pero evita que proyecte sombras. Esto es útil para modelos que no están pensados para proyectar sombras, como haces de luz.

💡 Consejo: Las texturas usadas en materiales también pueden aplicarse a efectos de partículas. Consulta Particle System para más detalles sobre el uso de texturas personalizadas y sprite sheets con partículas.

💡 Consejo: Para ejemplos prácticos de materiales, consulta la 52,-52-testing-gallery scene de prueba, que compara lado a lado combinaciones de PBR metallic/roughness/emissive/normal-map, 74,-8-gltfnodemodifier, que sobrescribe materiales PBR y unlit en nodos GLTF individuales, y 0,3-texture-movement, que anima el desplazamiento y el tiling de la textura.

Última actualización