Ja hem vist una introducció als materials en el mòdul Primitives i Materials I. Allí hem vist com tractar amb el color bàsic dels objectes, és a dir el color difús. Ara veurem altres propietats de color i de textura que espoden definir els els objectes en VRML.
El node Material té dos fields per tal de controlar les característiques de brillantor d'un material. Aquests fields són field specularColor i field shininess. El primer, defineix el color que presenta l'objecte en reflectir especularment la llum. El segon determina com de definit o borros és el reflex especular.
Vejam un exemple on apareixen quatre esferes cadascuna amb uns paràmetres diferents.
|
Exemple1: Definició de quatre materials especulars.
Shape { # Objecte de referencia amb material mat.
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 centre del conjunt), no té definit un material especular per a servir de referència a les altres.
NOTA: En el moment d'escriure el tutorial (01/97) el Cosmo Player ignora el field shininess i li dóna un
valor per defecte quan detecte que el field specularColor és diferent de [0 0 0].
Quan es vol definir un material per emular que emet llum, com per exemple un fluorescent, es pot utilitzar el field
emissiveColor. Amb aquest field es pot definir el color que emet el material, sense necessitat que hi hagi una font de
llum que l'il.lumini.
|
Exemple2: Definició de materials auto-il.luminats.
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
}
}
}
}
|
NOTA: El Cosmo Player no ho implementa gaire bé. L'efecte queda molt esmorteït.
La transparència és una altra propietat a poder modificar mitjançant un field de material. El field
transparency ens permet donar el grau de transparència del material en el rang [0 1].
|
Exemple3: Definició de materials transparents.
Transform { # Objecte de fons per a 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 texturat d'objectes no es fa mitjançant el node Material dins l'aparença, si no que s'utilitza un altre field del node Appearance: el field texture. En aquest field s'hi poden inserir tres nodes possibles: node ImageTexture, node MovieTexture o node PixelTexture. Aquí només veurem el primer.
En aquest node es defineix l'URL (és a dir, l'adreça) de la imatge que ha de servir com a textura.
L'especificació del VRML2.0 diu que els formats estàndards són el JPEG i el PNG, però recomana que
també s'accepti el GIF incloent transparència. Vejam un exemple:
|
Exemple4: Aplicació d'una textura a un cub.
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 cub de l'esquerra (el primer que definim), tan sols té el field texture definit. Això fa que el cub no sigui il.luminat per cap de les fonts de llum de l'entorn i resta amb els colors originals de la textura. En canvi, el de la dreta, també té definit el field appearance amb un color difús.Això fa que si sigui il.luminat per les fonts de llum de l'entorn. Proveu d'apagar el headlight des del menú d'opcions i vegeu la diferència entre l'un i l'altre.
El següent exemple mostra com queda aplicada la textura sobra cada una de les primitives:
|
Exemple5: Aplicació d'una textura a les primitives.
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
}
}
|
Per tal de poder variar la mida i col.locació de la textura sobre l'objecte,
es pot fer servir en field textureTransform de l'aparença.
En aquest field, cal utilitzar el node
TextureTransform que permet escalar, rotar i traslladar la textura.
|
Exemple6: Modificació d'una textura en un cub.
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
}
}
}
|
Cal tenir molt en compte que el que estem fent és escalant, rotant i traslladant les coordenades de textura i no la textura en si mateixa, per tant un escalat de [2 2] no l'amplia al doble, si no que la redueix a la meitat (i per tant es repeteix), i una rotacio de PI/2 no rota la textura PI/2, si no -PI/2, etc.
A continuació podeu veure un exemple amb una textura GIF amb transparència. Això és útil per
texturar polígons amb imatges d'objectes complexes de fer amb geometria, com per exemple arbres (ho veurem més en
davant al mòdul Billboarding).
|
Exemple7: Cub amb textura GIF amb transparència.
Transform { # Fons 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"
}
}
}
|
Exercicis proposats:
|