Materiales

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

Materiales

Los materiales se pueden aplicar a entidades que usan formas primitivas (cubo, esfera, plano, etc.) añadiendo un Material componente. Este componente tiene varios campos que te permiten configurar las propiedades del material, añadir una textura, etc.

glTF los modelos incluyen sus propios materiales que se importan implícitamente en una escena junto con el modelo. Para modificar o anular estos materiales, usa el GltfNodeModifiers componente. Ver Modificar materiales glTF para más detalles.

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

Hay diferentes tipos de materiales compatibles:

  • PBR (Physically Based Rendering): El tipo de material más común en Decentraland. Soporta colores lisos o texturas, y diferentes propiedades como metallic, emissive, transparency, etc. Lee más sobre PBRarrow-up-right.

  • Materiales básicos: No responden a luces y sombras, lo que los hace ideales para mostrar imágenes tipo billboard.

Usa el Scene Editor en Creator Hub

La forma más fácil de dar a una entidad un Material es usar el Scene Editor. Puedes añadir un Material componente a tu entidad y luego configurar todos los campos disponibles en la UI del Scene Editor. Ver Add Componentsarrow-up-right.

Agregar un material

El siguiente ejemplo crea un material PBR y establece algunos de sus campos para darle un color rojo y propiedades metálicas. Este material se añade a una entidad que también tiene una forma de caja, por lo que coloreará la caja con este material.

//Create entity and assign shape
const meshEntity = engine.addEntity()
Transform.create(meshEntity, {
	position: Vector3.create(4, 1, 4),
})
MeshRenderer.setBox(meshEntity)

//Create material and configure its fields
Material.setPbrMaterial(meshEntity, {
	albedoColor: Color4.Red(),
	metallic: 0.8,
	roughness: 0.1,
})

Para cambiar el material de una entidad que ya tiene un Material componente, 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.

circle-exclamation

Colores de material

Dale a un material un color liso. En un Material PBR, configuras el albedoColor campo. Los colores albedo responden a la luz y pueden incluir matices en ellos.

Los valores de color son del tipo Color4, compuesto por r, g y b valores (red, green, and blue). Cada uno de estos toma valores entre 0 y 1. Ajustando diferentes valores para estos, puedes componer cualquier color visible. Para negro, pon los tres a 0. Para blanco, ponlos todos a 1.

circle-exclamation

Vea tipos de colorarrow-up-right para más detalles sobre cómo configurar colores.

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

  • emissiveColor: El color emitido por el material.

  • reflectivityColor: AKA Specular Color en otra nomenclatura.

Para crear un material de color liso que no sea afectado por la luz y las sombras del entorno, crea un material básico en lugar de un material PBR.

Uso de texturas

Establece un archivo de imagen como textura en un material configurando el parámetro texture .

En el ejemplo anterior, la imagen para el material se ubica en un assets/materials carpeta, que se encuentra en el nivel raíz de la carpeta del proyecto de la escena.

circle-info

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

Al crear una textura, también puedes pasar parámetros adicionales:

  • filterMode: Determina cómo se estiran o comprimen los píxeles en la textura cuando se renderiza. Toma un valor del TextureFilterMode enum. Ver Escalado de texturas.

  • wrapMode: Determina cómo se repite una textura sobre un objeto. Toma un valor del TextureWrapMode enum. Ver Envoltorio de texturas.

Para crear una textura que no sea afectada por la luz y las sombras del entorno, crea un material básico en lugar de un material PBR.

Texturas desde una URL externa

Puedes apuntar la textura de tu material a una URL externa en lugar de a una ruta interna del proyecto de la escena.

La URL debe comenzar con https, http Las URLs http no son compatibles. El sitio donde se aloja la imagen también debe tener CORS policies (Cross Origin Resource Sharing)arrow-up-right que permitan acceder a ella externamente.

Envoltorio de textura

Puedes establecer cómo se alinea una textura con una superficie. Por defecto, la textura se estira para ocupar la superficie una sola vez, pero puedes escalarla y desplazarla.

Los siguientes campos están disponibles en todas las texturas:

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

  • tiling: Escala la textura. El valor por defecto es el Vector2 [1, 1], que hace que la imagen se repita una vez cubriendo toda la superficie.

  • TextureWrapMode: Determina qué sucede si el tiling de la imagen no cubre toda la superficie. Esta propiedad toma sus valores del TextureWrapMode enum, que permite los siguientes valores:

    • TextureWrapMode.TWM_CLAMP: La textura se muestra solo una vez en el tamaño especificado. El resto de la superficie del mesh queda transparente. El valor de tiling se ignora.

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

    • TextureWrapMode.TWM_MIRROR: Como en wrap, la textura se repite tantas veces como quepa, pero la orientación de esas repeticiones está en espejo.

circle-exclamation

Usa esta característica para cubrir una superficie grande con un patrón en mosaico. Por ejemplo, repite la siguiente imagen:




En el ejemplo siguiente, la textura usa un mirror modo de envoltura, y cada repetición de la textura ocupa solo 1/4 de la superficie. Esto significa que veremos 4 copias de la imagen, en espejo entre sí en ambos ejes.

Tween de texturas

Haz que una textura se desplace suavemente usando un Tween componente, configurado con el TextureMove modo. El tween cambia gradualmente el valor de las offset o el tiling propiedades de una textura durante un periodo de tiempo, de manera suave y optimizada.

circle-exclamation

Usa la Tween componente con la setTextureMove función para mover la textura entre dos posiciones.

El tween de textura toma la siguiente información:

  • entity: La entidad cuya textura se moverá

  • start: Un Vector2 para la posición inicial

  • end: Un Vector2 para la posición final

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

Este otro parámetro opcional también está disponible:

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

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

El ejemplo anterior ejecuta un tween que dura 1 segundo y mueve la textura 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 tween continuo de textura toma la siguiente información:

  • entity: La entidad cuya textura se moverá

  • direction: Un Vector2 para el movimiento

  • Cambia la velocidad a la que se reproduce una animación cambiando la propiedad: Cuántas unidades por segundo se moverá la entidad

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

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

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

Secuencias de tween complejas

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

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

Texturas en varias capas

Puedes usar varios archivos de imagen como capas para componer texturas más realistas, por ejemplo incluyendo una bumpTexture y una emissiveTexture.

El bumpTexture puede simular bultos y arrugas en una superficie, modificando cómo se comportan las normales de la superficie en cada píxel.



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

Establecer UVs

Otra alternativa para cambiar la escala o alineación de una textura es configurar las propiedades uv en el componente MeshRenderer componentarrow-up-right.

Configuras las coordenadas u y v en la imagen 2D de la textura para que correspondan a los vértices de la forma. Cuantos más vértices tenga la entidad, más uv coordenadas necesitan definirse en la textura; por ejemplo, un plano necesita tener 8 uv puntos definidos, 4 para cada una de sus dos caras.

El siguiente ejemplo incluye una función que simplifica la configuración de uvs. La función setUVs definida aquí recibe un número de filas y columnas como parámetros y establece los uvs para que la imagen de la textura se repita un número específico de veces.

Para establecer los UVs para una box mesh shape, the same structure applies. Each of the 6 faces of the cube takes 4 pairs of coordinates, one for each corner. All of these 48 values are listed as a single array.

circle-exclamation

Escalado de texturas

Cuando las texturas se estiran o encogen a un tamaño diferente del de la imagen de textura original, esto a veces puede crear artefactos. En un entorno 3D, los efectos de perspectiva causan esto de forma natural. Existen varios texture filteringarrow-up-right algoritmos que existen para compensar esto de diferentes maneras.

El Material object uses the bilinear algorithm by default, but it lets you configure it to use the nearest neighbor o trilinear algorithms instead by setting the samplingMode property of the texture. This takes a value from the TextureFilterMode enum:

  • TextureFilterMode.TFM_POINT: Usa un algoritmo de "nearest neighbor". Esta configuración es ideal para gráficos estilo pixel art, ya que los contornos se mantendrán marcados de forma nítida cuando la textura se vea ampliada en pantalla en lugar de difuminarse.

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

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

Materiales sin iluminación

La mayoría de las veces querrás que los materiales en tu escena se vean afectados por las condiciones de iluminación, incluidas las sombras y los cambios de matiz según las diferentes horas del día. Pero en otros casos podrías querer mostrar los colores en su estado puro. Esto es útil al reproducir videos, o también para marcadores abstractos que necesitan destacar, diseñados para señalar pistas al jugador.

Para crear un material sin iluminación, usa Material.setBasicMaterial. Los materiales básicos no tienen todas las mismas propiedades que los materiales PBR, solo tienen lo esencial:

  • diffuseColor: Color4 para el color

  • texture: Texture

  • alphaTexture: Textura separada para la capa de transparencia

  • alphaTest: Umbral para lograr transparencia basado en el color de la textura

  • castShadows: Si es false, no se proyectan sombras sobre otras entidades en la escena.

Retratos de avatar

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



Puedes obtener el retrato de cualquier jugador de Decentraland, incluso si no están conectados actualmente, e incluso si no tienen un NAME reclamado en Decentraland.

Las siguientes propiedades son compatibles dentro del objeto que pasas como argumento:

  • userId: ID del usuario cuyo perfil deseas mostrar

  • filterMode: Determina cómo se estiran o comprimen los píxeles en la textura cuando se renderiza. Toma un valor del TextureFilterMode enum. Ver Escalado de texturas.

  • wrapMode: Determina cómo se repite una textura sobre un objeto. Toma un valor del TextureWrapMode enum. Ver Envoltorio de texturas.

Materiales transparentes

Para hacer un material con un color liso transparente, simplemente define el color como un Color4, y establece el cuarto valor a algo entre 0 y 1. Cuanto más cerca de 1, más opaco será.

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.



El transparencyMode puede tener los siguientes valores:

  • 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 basados en el valor 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 afinar el umbral usado para determinar si cada píxel es transparente o no. Establece la propiedad alphaTest entre 0 y 1 . Por defecto su valor es 0.5.

Al usar un unlit material, puedes añadir un alphaTexture para hacer solo ciertas regiones del material transparentes, basadas en una textura.

circle-exclamation


Esto puede usarse de maneras muy interesantes junto con videos. Ver reproducción de videoarrow-up-right.

Reproducción de video

Para transmitir video desde una URL a un material, o reproducir un video desde un archivo almacenado en la escena, ver reproducción de videoarrow-up-right.

El video se usa como una textura en un material; puedes configurar 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 asistentes que la simplifiquen, se ve así:

Así es como el protocolo base interpreta los componentes Materials. 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 box type admite un uvs campo.

Los valores compatibles para $case son los siguientes:

  • texture

  • avatarTexture

Dependiendo del valor de $case, es válido definir el objeto para la forma correspondiente, pasando las propiedades relevantes.

Para añadir un Material componente a una entidad que potencialmente ya tiene una instancia de este componente, usa Material.createOrReplace(). Las funciones auxiliares como MeshRenderer.setPbrMaterial() se encargan de sobrescribir instancias existentes del componente, pero ejecutar Material.create() en una entidad que ya tiene este componente devuelve un error.

Modificar materiales glTF

Usa la GltfNodeModifiers componente para modificar los materiales de un glTF modelo. Este componente te permite anular los materiales de un glTF modelo con tus propios materiales. Puedes usar cualquiera de las propiedades del Material componente, incluidas texture, video texture, unlit materials, etc.

Hay dos formas de usar el GltfNodeModifiers componente:

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

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

Modificar 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.

El GltfNodeModifiers El componente tiene las siguientes propiedades:

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

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

    • material: El material a usar.

El path property es una cadena que representa la ruta al nodo en el glTF modelo 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 de vértice.

circle-info

💡 Consejo: Puedes usar la Babylon Sandbox apparrow-up-right para inspeccionar el glTF modelo y encontrar la ruta al nodo que quieres modificar.

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

El material property es un objeto que representa el material a usar. Debe escribirse usando la advanced syntax para materiales, como se muestra en el ejemplo anterior. No se pueden usar aquí funciones auxiliares como Material.setPbrMaterial() can't be used here.

Modificar 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.

A 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.

Quitar sombras de un modelo glTF

Para quitar sombras de un glTF modelo, puedes establecer el castShadows a false más cercano en el GltfNodeModifiers object. 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.

Última actualización