Ya hemos visto una introducción a los materiales en el módulo Primitivas y Materiales I. Allí hemos visto como tratar con el color básico de los objetos, es decir el color difuso. Ahora veremos otras propiedades de color y de textura que se pueden definir en los objetos en VRML.
El node Material tiene dos fields para poder controlar las características de brillantez de un material. Estos fields son field specularColor y field shininess. El primero define el color que presenta un objeto al reflejar especularmente la luz. El segundo determina que tan definido o borroso es el reflejo especular.
Veamos un ejemplo donde aparecen cuatro esferas cada una con unos parámetros
diferentes:
|
Ejemplo1: Definición
de cuatro materiales especulares.
Shape { # Objeto de referencía con material mate.
geometry Sphere { radius 1.5 }
appearance Appearance {
material Material {
diffuseColor 0.5 0.5 0.5
}
}
}
Transform {
translation -2 2 0
children Shape {
geometry Sphere { radius 1.5 }
appearance Appearance {
material Material {
diffuseColor 0.5 0.5 0.5
specularColor 1 0 0
shininess 0
}
}
}
}
Transform {
translation 2 2 0
children Shape {
geometry Sphere { radius 1.5 }
appearance Appearance {
material Material {
diffuseColor 0.5 0.5 0.5
specularColor 1 0 0
shininess 0.05
}
}
}
}
Transform {
translation -2 -2 0
children Shape {
geometry Sphere { radius 1.5 }
appearance Appearance {
material Material {
diffuseColor 0.5 0.5 0.5
specularColor 1 0 0
shininess 0.3
}
}
}
}
Transform {
translation 2 -2 0
children Shape {
geometry Sphere { radius 1.5 }
appearance Appearance {
material Material {
diffuseColor 0.5 0.5 0.5
specularColor 1 0 0
shininess 1
}
}
}
}
|
La primera esfera (la que queda al centro del conjunto), no tiene definido un material especular para tener una referencia respecto a los otros.
Cuando se desea definir un material para emular que emite luz, como por ejemplo
un fluorescente, se puede utilizar el field emissiveColor. Con
este field se puede definir el color que emite el material sin
necesidad de que haya una fuente de luz que ilumine.
|
Ejemplo2: Definición
de materiales autoiluminados.
Transform {
translation -1.5 0 0
children Shape {
geometry Cylinder { radius 0.2 height 8 }
appearance Appearance {
material Material {
diffuseColor 0.5 0.5 0.5
}
}
}
}
Transform {
translation -0.5 0 0
children Shape {
geometry Cylinder { radius 0.2 height 8 }
appearance Appearance {
material Material {
diffuseColor 0.5 0.5 0.5
emissiveColor 1 1 1
}
}
}
}
Transform {
translation 0.5 0 0
children Shape {
geometry Cylinder { radius 0.2 height 8 }
appearance Appearance {
material Material {
diffuseColor 0.5 0.5 0.5
emissiveColor 1 1 0
}
}
}
}
Transform {
translation 1.5 0 0
children Shape {
geometry Cylinder { radius 0.2 height 8 }
appearance Appearance {
material Material {
diffuseColor 0.5 0.5 0.5
emissiveColor 0.6 1 1
}
}
}
}
|
La transparencia es otra propiedad a poder modificar mediante un field
de material. El field transparency nos permite dar el grado de
transparencia del material en el rango [0 1].
|
Ejemplo3: Definición
de materiales transparentes.
Transform { # Objeto de fondo para referencia
translation 0 0 -2
children Shape {
geometry Box { size 10 10 0.5 }
appearance Appearance {
material Material {
diffuseColor 0 0 1
}
}
}
}
Transform {
translation -3.75 0 0
children Shape {
geometry Box { size 2 4 0.5 }
appearance Appearance {
material Material {
diffuseColor 0.5 0.5 0.5
transparency 0
}
}
}
}
Transform {
translation -1.25 0 0
children Shape {
geometry Box { size 2 4 0.5 }
appearance Appearance {
material Material {
diffuseColor 0.5 0.5 0.5
transparency 0.33
}
}
}
}
Transform {
translation 1.25 0 0
children Shape {
geometry Box { size 2 4 0.5 }
appearance Appearance {
material Material {
diffuseColor 0.5 0.5 0.5
transparency 0.66
}
}
}
}
Transform {
translation 3.75 0 0
children Shape {
geometry Box { size 2 4 0.5 }
appearance Appearance {
material Material {
diffuseColor 0.5 0.5 0.5
transparency 0.9
}
}
}
}
|
El texturado de objetos no se hace mediante el node Material dentro de la apariencia, sino que se utiliza otro field del node Appearance: el field texture. En este field se pueden insertar tres nodes posibles: node ImageTexture, node MovieTexture o node PixelTexture. Aquí tan solo veremos el primero.
En este node se define el URL (es decir, la dirección)
de la imagen que ha de servir como textura. La especificación del VRML97
dice que los formatos estándares son el JPEG y el PNG, pero recomienda
que también se acepte el GIF incluyendo transparencia . Veamos un ejemplo:
|
Ejemplo4: Aplicación
de una textura a un cubo.
Transform {
translation -2 0 0
children Shape {
geometry Box { size 3 3 3 }
appearance Appearance {
texture ImageTexture {
url "teapot.gif"
}
}
}
}
Transform {
translation 2 0 0
children Shape {
geometry Box { size 3 3 3 }
appearance Appearance {
material Material {
diffuseColor 1 1 1
}
texture ImageTexture {
url "teapot.gif"
}
}
}
}
|
El cubo de la izquierda (el primero que definimos), tan solo tiene el field texture definido. Esto causa que el cubo no sea iluminado por ninguna de las fuentes de luz del entorno y resta con los colores originales de la textura. En cambio, el de la derecha, también tiene definido el field appearance con un color difuso. Esto provoca que si sea iluminado por las fuentes de luz del entorno. Probad de apagar el headlight desde el menú de opciones y mirad la diferencia entre uno y otro.
El siguiente ejemplo muestra como queda aplicada la textura sobre cada una
de las primitivas:
|
Ejemplo5: Aplicación
de una textura a las primitivas.
DEF Textura Appearance {
material Material {
diffuseColor 1 1 1
}
texture ImageTexture {
url "teapot.gif"
}
}
Transform {
translation -2 2 0
children Shape {
geometry Box { size 3 3 3 }
appearance USE Textura
}
}
Transform {
translation 2 2 0
children Shape {
geometry Sphere { radius 1.5 }
appearance USE Textura
}
}
Transform {
translation -2 -2 0
children Shape {
geometry Cone { height 3 bottomRadius 1.5 }
appearance USE Textura
}
}
Transform {
translation 2 -2 0
children Shape {
geometry Cylinder { height 3 radius 1.5 }
appearance USE Textura
}
}
|
Para poder variar el tamaño y colocación de la textura sobre
el objeto, se puede usar el field textureTransform de aparencia.
En este field, se debe utilizar el node
TextureTransform que permite escalar, rotar y trasladar la textura.
|
Ejemplo6: Modificación
de una textura en un cubo.
Shape {
geometry Box { size 3 3 3 }
appearance Appearance {
material Material {
diffuseColor 1 1 1
}
texture ImageTexture {
url "teapot.gif"
}
textureTransform TextureTransform {
scale 2 2
rotation 1.5708 # PI/2
}
}
}
|
Debemos tener en cuenta que lo que estamos haciendo es escalando, rotando y trasladando las coordenadas de textura y no la textura en si misma, por lo tanto un escalado de [2 2] no la amplía al doble, sino que la reduce a la mitad (y por eso se repite), y una rotación de PI/2 no rota la textura PI/2, sino -PI/2, etc.
A continuación podeis ver un ejemplo con una textura GIF con transparencia
. Esto es útil para texturar polígonos con imágenes de
objetos los cuales serían complejos de modelar con geometría ,
como por ejemplo árboles (lo veremos más adelanteen el módulo
Billboarding).
|
Ejemplo7: Cubo con textura
GIF con transparencia .
Transform { # Fondo de referencia
translation 0 0 -5
children Shape {
geometry Box { size 10 10 0.2 }
appearance Appearance {
material Material {
diffuseColor 0.2 0.8 0.4
}
}
}
}
Shape {
geometry Box { size 4 2 4 }
appearance Appearance {
material Material {
diffuseColor 1 1 1
}
texture ImageTexture {
url "teapot2.gif"
}
}
}
|
Ejercicios propuestos:
|