Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Lnea de cabecera
Comentarios al cdigo
Nodos
Lnea de cabecera
Todo documento VRML debe comenzar necesariamente con la siguiente lnea:
#VRML V2.0 utf8
Comentarios al cdigo
En todos los lenguajes se utilizan comentarios al cdigo, no visibles en la
pantalla, que son muy tiles como recordatorio de lo que se ha hecho y que
facilitan los cambios futuros.
En este lenguaje los comentarios se escriben en una sola lnea que comienza
con el smbolo #. Ejemplo:
# Este es un comentario al cdigo
Nodos
Los nodos son bloques de informacin que definen las caractersticas de un
objeto concreto (su forma, su apariencia, etc.), o la relacin entre distintos
objetos. Sirven tambin para crear sonidos, el panorama de fondo, enlaces a
otros mundos o a pginas Web, etc.
Es decir, son las unidades bsicas que forman el mundo virtual, y pueden ser
afinadas hasta el detalle deseado.
Los nodos son los bloques de informacin bsicos con los que se construye un
mundo virtual. Vamos a ver la sintaxis de los nodos partiendo de los ms
sencillos, los nodos de geometra primitiva, o nodos primitivos, que son:
Box - caja
Cone - cono
Cylinder - cilindro
Sphere - esfera
Box
La estructura ms general de un nodo es:
Box { ... }
Se escribe el nombre del nodo, en este caso Box, seguido del smbolo
de apertura {
Box {
size 2 0.5 3
Cone
Veamos un ejemplo de este nodo, que define la geometra de un cono:
Cone {
}
height 3
bottomRadius 0.75
Cylinder
Ejemplo del nodo que define un cilindro:
Cylinder {
height 2
radius 1.5
}
Sphere
Ejemplo del nodo que define una esfera:
Sphere {
radius 1
}
Tiene un solo campo, radius (radio) pues es suficiente para definir con l una
esfera.
height 3
bottomRadius 0.75
Nombre {
campo1 x y z
campo2 x
...
}
Shape {
appearance ...
geometry ...
}
Shape {
geometry ...
}
Shape {
geometry Box {size 2 0.5 3}
}
Con esto hemos definido un objeto visible (aunque todava sin ningn atributo
de apariencia definido), que tiene la geometra de una caja de medidas 2x0.5x3
Hemos puesto el nodo Box en una sola lnea, pero conviene que lo pongamos
desarrollado en varias lneas, para irnos acostumbrando, pues es muy
importante que los smbolos { y } estn colocados en el orden que les
corresponde, y no olvidarse de ninguno de ellos:
Shape {
geometry Box {
size 2 0.5 3
}
}
appearance ...
Appearance {
material Material {
}
appearance Appearance {
material Material {
}
#Campo geometry:
geometry Box {
size 2 0.5 3
}
}
Se guarda como cap05_caja1.wrl
A la derecha se puede ver el resultado.
Como se puede apreciar en la figura (y an ms manipulndola con el visualizador), la
diferencia es notable. Ahora se distinguen perfectamente las caras de la caja, debido a que
tienen una iluminacin y textura adecuadas.
Siguiendo un proceso similar para el nodo primitivo Cone, visto en el captulo anterior, el
documento VRML para visualizarlo (tambin con la apariencia por defecto), sera el siguiente:
#Campo geometry:
geometry Cone {
height 3
bottomRadius 0.75
}
}
Como se puede observar, el campo appearance es idntico al caso anterior, slo cambia
el valor del campo geometry, que es el nodo Cone.
En los mundos virtuales ser a menudo necesario utilizar textos para guiar al visitante (en
forma de carteles, comentarios, paneles de control, etc.) Para ello existe un nodo especfico,
el nodo Text que, al igual que los nodos primitivos, ir incrustado en el nodo Shape, como se
ver ms adelante.
Los textos son siempre planos y no tienen espesor. Se puede determinar el tipo de fuente, su
estilo y tamao, etc.
Text {
string ...
fontStyle ...
}
Tiene, por tanto, dos campos:
string: (en ingls, fila). Su valor (los puntos suspensivos) es precisamente el texto que
se quiere poner.
fontStyle: su valor (los puntos suspensivos) es un subnodo llamado FontStyle (obsrvese una vez ms que el primero empieza por
minscula, por ser un campo, mientras que el segundo lo hace por mayscula, por ser
un nodo).
El campo fontStyle es opcional. Si se omite, el texto tendr el estilo de fuente por defecto.
Veamos cada campo por separado:
Nodo FontStyle
Veamos su estructura con un ejemplo:
FontStyle {
family "SERIF",
style "BOLD",
size 1
spacing 1
}
En este ejemplo, el nodo FontStyle tiene los siguientes campos:
style: Se puede escoger entre "BOLD" (negrita), "ITALIC" (cursiva), "BOTH" (ambas,
es decir, negrita y cursiva), o "NONE" (ninguna, es decir, ni negrita ni cursiva).
Existen ms campos que los que aparecen en este ejemplo, con los que se puede afinar an
ms la disposicin del texto:
justify: Determina la justificacin del texto. Puede ser "BEGIN" (al comienzo, es decir
a la izquierda), "MIDDLE" (en el medio, es decir, centrado) o "END" (al final, es decir,
a la derecha).
otros: que se omiten aqu, pues estn pensados para idiomas exticos, como el chino
(escritura en vertical), el rabe (escritura de derecha a izquierda), etc. Para la lista
completa, se puede consultar la RFC 1766
Text {
string ["Esta es la primera fila de texto",
"esta es la segunda fila",
"etc."]
fontStyle FontStyle {
family "SERIF",
style "BOLD",
size 1
spacing 1
}
}
Shape {
appearance ...
geometry ...
}
Vimos que los nodos primitivos se ponan como valor del campo geometry. Es lo mismo que
vamos a hacer ahora:
Shape {
appearance ...
geometry Text { ... }
}
Aqu est de una manera resumida. Para desarrollarlo completamente, hay que poner como
campo de appearance la apariencia por defecto, y lgicamente, el nodo Text completo.
Como se puede ver en la imagen, el texto se puede manipular como cualquier otro objeto
(girndolo, etc.), ya que, en realidad, es un elemento plano de espesor cero.
Las letras tienen el color por defecto, ya que se ha utilizado la apariencia por defecto. Pero se
puede hacer que tengan el color que se desee, segn veremos ms adelante.
Agrupacin de nodos
Hasta ahora hemos visto los objetos aisladamente. Veamos ahora cmo podemos agrupar un
conjunto de ellos para conseguir formas ms complejas. En los prximos tres captulos se van
a ver diferentes nodos que sirven para agrupar otros nodos:
Nodo Group
Existe el nodo Group que permite tratar a un conjunto de nodos como una entidad nica, pero
sin efectuar ninguna transformacin en ellos.
Su estructura general es la siguiente:
Group {
children [ ... ]
}
Tiene un campo llamado children (en ingls, nios o hijos), cuyo valor (los puntos
suspensivos) va entre corchetes [ y ], y que como veremos a continuacin, es la listade los
objetos que se quieren agrupar, representados por sus nodos Shape respectivos:
Group {
children [
Shape { ... },
Shape { ... },
...
]
}
Veamos un ejemplo: Vamos a agrupar los ejemplos de una caja y de un cono vistos
anteriormente:
{
{
{
{
Utilizar una lnea distinta para cada nodo, para cada campo y para cada valor de
cada campo.
No es que sea obligatorio, pues de hecho se podra escribir todo el cdigo en una sola
lnea, aunque esto no sera muy prctico e inducira a cometer errores.
Poner las lneas de comentario necesarias al mismo nivel que lo que se comenta.
As, en el ejemplo, el comentario "#Aqu empieza la caja:" se indenta dos veces, para
que est situado en el mismo nivel que el nodo Shape, que es el objeto del comentario.
Shape {
appearance Appearance {
material Material { }
}
geometry Cylinder {
height 2
radius 0.5
}
}
(Este es el cdigo de un cilindro con la apariencia por defecto, de 2 unidades de alto y una
base de radio 0.5)
Se puede definir, para el mbito de un documento VRML, que este tipo de cilindro tenga
un nombre arbitrario, por ejemplo ColumnaRepetida (o como se quiera, con tal de que
comience por mayscula), de la siguiente manera:
USE ColumnaRepetida
En el ejemplo anterior de la caja y el cono, lo que est repetido es el nodo Appearance. Vamos
a definirlo, en la primera ocasin que se utiliza con el nombre, por ejemplo, PorDefecto y en la
segunda vez utilizar slo el comando USE (se omiten las lneas de comentarios):
}
}
]
}
En este caso concreto, la simplificacin no ha sido muy grande (slo un par de lneas menos de
cdigo), pero ha servido para ilustrar el concepto.
Como se ha mencionado en el captulo anterior, por defecto, todos los objetos son creados en
el centro del escenario de realidad virtual.
Ahora vamos a ver cmo posicionarlos en otros puntos. Pero para ello, es necesario antes
comprender la nocin de los sistemas de coordenadas.
Un punto en el espacio est definido por su posicin con respecto al centro de coordenadas.En
el lenguaje VRML se adopta la convencin de que sea X la distancia que ese punto est
desplazado a la derecha o a la izquierda del centro, Y la distancia por encima o por debajo,
y Z la distancia hacia delante o hacia atrs. Se puede ver en la imagen de la derecha una
representacin tridimensional de los ejes de coordenadas. Pulsndola se carga el
escenario. (Se ha confeccionado utilizando cilindros muy finos, convenientemente girados para
representar los ejes)
Un mundo virtual tiene su sistema de coordenadas situado en el centro. Con el nodo Group,
visto en el captulo anterior, se consigue agrupar un conjunto de objetos, que son creados
haciendo coincidir su centro con el centro del sistema de coordenadas, como se puede apreciar
en la figura de la derecha. (Se ha superpuesto el conjunto de objetos a los ejes coordenados)
Con el nodo Transform, que vamos a ver a continuacin, se determina un nuevo sistema de
coordenadas para un grupo de objetos.
Este nuevo sistema de coordenadas sufre unas transformaciones: puede ser trasladado a un
punto determinado, puede ser girado un determinado ngulo, y puede tener
una escala (tamao relativo) distinta a la original.
El grupo de objetos especificados en el nodo sufrirn las mismas transformaciones, es decir,
sern trasladados, girados y variados de escala.
Transform {
translation . . .
rotation . . .
scale
...
children [ . . . ]
}
Como se puede ver, tiene tres campos con los que se determina su posible traslado, rotacin o
nueva escala, y un cuarto campo children, en donde se especifican cules son los objetos
agrupados que sufrirn esas transformaciones.
No tienen por qu estar los tres campos a la vez. Por tanto, para simplificar, vamos a ver cada
uno de ellos por separado.
Traslacin
Poniendo slo el campo translation, queda el nodo Transform de esta manera:
Transform {
translation 20 0 0
children [ . . . ]
}
Se ha puesto un valor al campo translation. El orden para el traslado de las coordenadas es X,
Y, Z. Por tanto, en este caso, hay una traslacin de 20 unidades hacia la derecha (si hubiera
sido hacia la izquierda se habra puesto -20.0)
Por supuesto que se podran haber variado las tres coordenadas, no slo la X como en este
caso.
Con respecto al campo children, se aplica lo dicho anteriormente, para el nodo Group.
Rotacin
Poniendo ahora slo el campo rotation, queda el nodo Transform de esta manera:
Transform {
rotation 1 0 0 1.57
children [ ... ]
}
Tal como se ha puesto el valor del campo rotation quiere decir lo siguiente: rotacin de 90
alrededor del eje X.
Explicacin: Las tres primeras cifras slo pueden tener el valor 0 1, y representan la
rotacin alrededor de cada eje, en este orden: X, Y, Z.
Es decir:
Transform {
translation 20 0 0
rotation 1 0 0 1.57
children [ ... ]
}
Variacin de la escala
Poniendo ahora en el nodo Transform slo el campo scale, para variar la escala de los objetos,
queda de la siguiente forma:
Transform {
scale 0.5 2 0.5
children [ ... ]
}
Los valores del campo scale representan las variaciones de las dimensiones con respecto a
los ejes X, Y , Z.
Por tanto, en el ejemplo que se ha puesto, se reducen las dimensiones en la direccin de las X
a la mitad (0.5), se duplican en la direccin del eje Y (2), y se reducen a la mitad en la direccin
del eje Z (0.5).
Si se hubiera variado la misma cantidad en los tres valores (por ejemplo, 0.5) se habra
mantenido las proporciones de la pieza.
Se puede ver en la figura de la derecha la pieza despus de sufrir los tres cambios.
Nodo Switch
Este nodo Switch (en ingls, bascular o conmutar) sirve para agrupar otros nodos, pero con
una diferencia: slo ser utilizado uno de los hijos agrupados.
Su estructura es la siguiente:
Switch {
whichChoice 0
choice [...]
choice [...]
choice [...]
}
Como se puede ver, este nodo tiene un campo whichChoice (en ingls, cul eleccin) cuyo
valor es un nmero que indica cal hijo choice es el elegido (0, 1, 2, etc.). Si este valor es -1,
entonces se indica que no est elegido ninguno.
Qu utilidad tiene este nodo? Un posible uso de este nodo es el de tener preparadas
diferentes versiones del nodo Shape, es decir, diferentes formas de un objeto. Bastar con
variar el valor de whichCoice para pasar rpidamente de una forma a otra.
Esta variacin se har utilizando los eventos, que es algo que se ver ms adelante.
Nodo Billboard
Este nodo Billboard (en ingls, cartel) sirve para agrupar otros nodos hijos. Todos los nodos
agrupados sern visibles (al contrario del anterior, en el que slo es visible uno de ellos).
La particularidad de este nodo es que crea un sistema de coordenadas para los nodos
agrupados que est siempre de cara al espectador.
Su estructura es la siguiente:
Billboard {
axisOfRotation 0 1 0
children [ . . . ]
}
Tiene un campo, axisOfRotation (eje de rotacin), cuyo valor es un grupo de tres cifras que
indican cul es eje alrededor del cual se efecta automticamente el giro para permanecer
siempre de cara. La convencin que se utiliza es la misma que la vista anteriormente para la
rotacin, excepto que en este caso no hace falta poner un cuarto valor para expresar el ngulo:
Formas complejas
Hasta ahora, para crear los distintos objetos que forman un escenario de realidad virtual, se
han utilizado exclusivamente las formas primitivas (caja, cono, cilindro y esfera).
Tal como se ha visto en los anteriormente, agrupando y modificando estas formas primitivas se
pueden conseguir otras formas ms complejas.
Pero esta tcnica tiene un lmite. Supongamos que se quiere representar un automvil, por
ejemplo. Con la sola utilizacin de las formas primitivas sera demasiado complicado de crear, y
se generaran ficheros VRML demasiado voluminosos.
Hay un mtodo ms eficaz para construir las formas complejas, que consiste en definir una
serie de puntos en el espacio y luego unirlos entre s para crear lneas osuperficies.
Nodo Coordinate
Este nodo sirve simplemente para definir una serie de puntos en el espacio tridimensional. En
s mismo no sirve para representarlos, sino que se utilizar dentro de otros nodos, como se va
a ver a continuacin.
La estructura de este nodo es la siguiente:
Coordinate {
point [
12 11 17.1,
20.5 13.8 5.3,
14 6.1 22.9
]
}
Como se puede ver, tiene un campo point, cuyo valor son grupos de tres cifras, separadas por
comas, englobadas entre corchetes [ y ].
Cada grupo de tres cifras representa un punto en el sistema de coordenas. En el ejemplo
estn definidos tres puntos, pero se pueden poner tantos como se quiera.
Este nodo se utiliza dentro de otros nodos, para conseguir cosas distintas:
PointSet {
coord Coordinate {
point [ . . . ]
}
}
Como se puede ver, tiene un campo coord cuyo valor es el nodo Coordinate visto
anteriormente.
Aplicando al ejemplo del nodo Coordinate, quedara de esta manera:
PointSet {
coord Coordinate {
point [
12 11 17.1,
20.5 13.8 5.3,
14 6.1 22.9
]
}
}
Si incluyramos este cdigo, tal como est, en un documento VRML, no podramos ver ninguno
de los puntos todava. La razn es que, como se vi anteriormente, para crear un objeto
visible se debe utilizar el nodo Shape.
Shape {
appearance ...
geometry ...
}
Con el campo appearance se define la apariencia del objeto (color, textura, etc.) y con el
campo geometry su forma.
Por tanto, es evidente que la inclusin del nodo PointSet deber hacerse en este ltimo
campo, ya que la geometra de este objeto es la de un grupo de puntos. De manera
resumida, quedar de esta manera:
Shape {
appearance ...
geometry PointSet { ... }
}
Desarrollando totalmente el ejemplo:
#VRML V2.0 utf8
#Ejemplo de un grupo de tres puntos
Shape {
appearance Appearance {
material Material { }
}
geometry PointSet {
coord Coordinate {
point [
12 11 17.1,
20.5 13.8 5.3,
14 6.1 22.9
]
}
}
}
Hasta ahora hemos considerado que el nodo PointSet tena un solo campo (coord), que sirve
para definir la posicin de los puntos. Pero puede tener tambin otro campo (color), que sirve
para definir el color de cada uno de los puntos.
Es decir, el nodo PointSet puede tener esta estructura (resumida):
PointSet {
coord Coordinate {
point [ . . . ]
}
color Color {
color [ . . . ]
}
}
Como se puede observar, el campo color tiene como valor el nodo Color, que a su vez tiene
como valor el campo color de nuevo.
Desarrollando totalmente el ejemplo:
Con este nodo se crean lneas, uniendo una serie de puntos determinados. Su estructura
resumida es la siguiente:
IndexedLineSet {
coord Coordinate {
point [ . . . ]
}
coordIndex [ . . . ]
}
Como se puede ver, tiene dos campos:
coord, cuyo valor es el nodo Coordinate, y que sirve para determinar las coordenadas
de los puntos aislados que se van a unir entre s para formar las lneas.
coordIndex, con este campo se define el orden con el que se unen los puntos entre s,
dnde empieza y acaba una lnea, etc., como vamos a ver a continuacin.
Veamos primero un ejemplo sencillo: tres puntos que se unen ordenadamente entre s, para
formar una lnea:
IndexedLineSet {
coord Coordinate {
point [
5 5 0, # este es el punto 0
15 9 0, # este es el punto 1
20 18 0 # este es el punto 2
]
}
coordIndex [
0, 1, 2, -1
]
}
En el campo coord se establecen las coordenadas de los tres puntos A cada coordenada se ha
aadido una lnea de comentario para indicar cul es la numeracin que le corresponde al
punto. Obsrvese que se comienza por 0 (y no por 1).
En el campo coordIndex se establece el orden en el que se unen los tres puntos. En este
caso la lnea empieza en el primero (el 0), sigue con el segundo (el 1) y acaba en el tercero (el
2). Con el valor -1 se indica que ah acaba la lnea.
Shape {
geometry IndexedLineSet { ... }
}
No se ha especificado ningn campo para su apariencia ni color, lo que se ver ms adelante.
Desarrollando el ejemplo, quedar de esta manera:
coordIndex [
0, 2, 1, -1
]
Se pueden crear simultneamente diversas lneas. Supongamos que en el campo point se
han especificado las coordenadas de 12 puntos (por tanto, del 0 al 11), y queremos crear dos
lneas, la primera con los 6 primeros puntos y la segunda con los 6 ltimos. El
campo coordIndex quedara de esta manera:
coordIndex [
0, 1, 2, 3, 4, 5, -1, #esta es una lnea
6, 7, 8, 9, 10, 11, -1 #esta es otra lnea
]
Para determinar el color de cada uno de los segmentos que compone la lnea, hay que hacer
uso de tres campos ms:
color
colorIndex
colorPerVertex
Con el campo color se especifican cuntos y qu colores se van a usar (en el caso de que
haya ms de una lnea).
Con el campo colorIndex se atribuye a cada una de las lneas existentes alguno de los colores
expresados en el campo anterior.
Con el campo colorPerVertex se especifica si los colores sern colores continuos, o un
gradiente entre dos colores.
Veamos una aplicacin en el ejemplo anterior: una nica lnea quebrada que une tres puntos,
se va a hacer que sea toda ella de color verde.
En este ejemplo slo hay una lnea con un nico color. En el ejercicio prctico se va ver un
caso de dos lneas con dos colores.
IndexedFaceSet {
coord Coordinate {
point [ . . . ]
}
coordIndex [ . . . ]
coord, cuyo valor es el nodo Coordinate, y que sirve para determinar las coordenadas
de los puntos aislados que se van a unir entre s para formar las caras.
coordIndex, con este campo se define el orden con el que se unen los puntos entre s
para formar las distintas caras, como vamos a ver a continuacin.
Veamos primero un ejemplo sencillo: tres puntos que se unen ordenadamente entre s para
formar una cara:
IndexedFaceSet {
coord Coordinate {
point [
5 5 0, # este es el punto 0
15 9 0, # este es el punto 1
20 18 0 # este es el punto 2
]
}
coordIndex [
0, 1, 2, -1
]
}
En el campo coord se establecen las coordenadas de los tres puntos. A cada coordenada se
ha aadido una lnea de comentario para indicar cul es la numeracin que le corresponde al
punto. Obsrvese que se comienza por 0 (y no por 1).
En el campo coordIndex se establece el orden en el que se unen los tres puntos que van a
formar la polilnea cerrada que va a formar la cara. Con el valor -1 se indica que ah acaba la
cara.
Shape {
geometry IndexedFaceSet { ... }
}
No se ha especificado ningn campo para su apariencia ni color, lo que se ver ms adelante.
Desarrollando el ejemplo, quedar de esta manera:
color
colorIndex
colorPerVertex
Con el campo color se especifican cuntos y qu colores se van a usar (en el caso de que
haya ms de una cara).
Con el campo colorIndex se atribuye a cada una de las caras existentes alguno de los colores
expresados en el campo anterior.
Con el campo colorPerVertex se especifica si los colores sern colores continuos, o un
gradiente entre dos colores.
Veamos una aplicacin en el ejemplo anterior: vamos a hacer que la cara tenga un color
verde.
A la derecha puede verse el resultado. Se han aadido unos ejes coordenados y modificado el
punto de vista inicial.
Si se manipula el escenario, se puede observar que la cara verde es visible slo por un lado, el
que est de frente.
ccw TRUE Es la opcin por defecto, por tanto no es obligatoria ponerlo. La cara visible
es la perpendicular a la parte positiva de los ejes coordenados.
ccw FALSE En este caso, la cara visible es la opuesta a la parte positiva de los ejes
coordenados
Si en el ejemplo anterior se aade el campo ccw FALSE. Para poder ver la cara verde hay que
girar 180 el escenario.
solid TRUE Es la opcin por defecto: slo una cara es visible (la determinada por el
campo ccw), y por tanto no es obligatorio ponerlo.
50,0,50
-50,0,50
-50,0,-50
50,0,-50
Vamos a aadir el campo solid FALSE. Pero si se carga el escenario, en principio no se ver
nada. Esto es debido a que el punto de vista por defecto est precisamente a nivel cero, es
decir, en el mismo suelo. Slo se ver el suelo si se hace girar todo el escenario.
Determinando un punto de vista inicial elevado sobre el suelo (se ver ms adelante cmo
conseguirlo), y superponiendo unos ejes coordenados, obtenemos el resultado que se puede
ver en la imagen de la derecha.
Obsrvese que al cargar el escenario, se "aterriza" sobre el suelo, y que se puede desplazar
por l, pero no se pueden efectuar movimientos de elevacin. Esto es debido, a que
automticamente se determina que existe gravedad en el mundo. Para poder flotar, hay que
pulsar el mando "Float", que inhabilita la gravedad.
Con este mtodo obtenemos un suelo del color que queramos, pero se pueden obtener suelos
que tengan una textura determinada (hierba, piedra, etc.), lo que se ver ms adelante.
Con el nodo IndexedFaceSet se crean suelos planos. En el siguiente captulo se ver cmo
crear suelos accidentados (terrenos con ditintas elevaciones, colinas, etc.).
ElevationGrid {
xDimension 6
xSpacing 4
zDimension 3
zSpacing 8
height [
0.25, 4, 7, 3, 1.5, 0.25,
1.5, 2.5, 1.5, 2.1, 1, 0,
0.3, 0.3, 0, -2.7, -1.5, -3.7
]
}
Observamos los siguientes campos (puede tener otros ms, como veremos):
xSpacing es la separacin de los puntos de la rejilla, en la direccin del eje X (en este
caso, 4)
zSpacing es la separacin de los puntos de la rejilla, en la direccin del eje Z (en este
caso, 8)
height es la altura de cada uno de los puntos de la rejilla. En este caso, la rejilla tiene
6x3=18 puntos, por lo tanto, hay que poner las 18 cotas de altura que correspondan a
cada punto.
Shape {
appearance ...
geometry ...
}
El nodo ElevationGrid ser el valor del campo geometry, quedando por tanto as (de manera
resumida):
Shape {
appearance ...
geometry ElevationGrid { ... }
}
Y desarrollando totalmente el ejemplo:
ccw TRUE Es la opcin por defecto, por tanto no es obligatoria ponerlo. La cara visible
es la perpendicular a la parte positiva de los ejes coordenados.
ccw FALSE En este caso, la cara visible es la opuesta a la parte positiva de los ejes
coordenados
Si en el ejemplo anterior se aade el campo ccw FALSE Para poder ver la superficie hay que
girar 180 el escenario.
solid TRUE Es la opcin por defecto: slo una cara es visible (la determinada por el
campo ccw), y por tanto no es obligatorio ponerlo.
Pero en este caso concreto, hay una manera de determinar el color de partes determinadas de
la superficie, como vamos a ver a continuacin.
En este caso, la rejilla est formada por dos hileras de 5 cuadrculas, es decir, en total 10
cuadrculas. Se puede determinar el color de la superficie generada sobre cada cuadrcula.
A continuacin est la representacin de la rejilla vista desde arriba. Adems, se ha escrito en
cada cuadrcula el color que se desea para la parte de la superficie que le corresponda y un
nmero (del 1 al 10), para sealar el orden de atribucin de colores.
Se ha escogido el color blanco para las zonas ms altas, el rojo para las intermedias, el verde
para las bajas y el azul para las ms bajas.
Hay que aadir dos campos al nodo ElevationGrid:
color que contiene el nodo Color, que a su vez contiene el campo color, en donde se
especifican los 10 colores atribuidos a cada cuadrcula.
colorPerVertex que puede ser TRUE, para colores en gradiente (no se estudiar este
caso). O puede ser FALSE, en cuyo caso los colores son continuos. Se aplicar esta
posibilidad.
]
}
colorPerVertex FALSE #colores continuos (no degradados)
solid FALSE #ambas caras visibles
}
}
A la derecha puede verse el resultado. Se han aadido unos ejes coordenados y modificado el
punto de vista inicial.
Extrusion {
crossSection [
1 0,
0 6.5,
.......
]
spine [
10 0 3,
15 1 5,
............
]
solid FALSE
}
Se pueden observar los campos:
spine, cuyo argumento es otra serie de puntos que definen la espina dorsal del objeto
extruido. Cada uno de estos puntos est definido por tres coordenadas, como no poda
ser menos, puesto que la espina dorsal es un recorrido en el espacio tridimensional.
solid, tiene dos opciones: TRUE (la opcin por defecto) con la que se ven slo un lado
de las caras. FALSE: se vern ambos lados.
crossSection [
10 10,
-10 10,
-10 -10,
10 -10,
10 10
]
Ahora falta por definir la espina dorsal. La espina dorsal define el recorrido que la seccin
transversal deber efectuar para crear le forma extruida.
Vamos a hacer que la seccin transversal comience en el punto (0,-10,0) y se mueva hasta el
punto (0,10,0).
En la siguiente figura se muestra el camino recorrido por la seccin transversal a lo de la espina
dorsal del cubo (en rojo):
spine [
0 -10 0,
0 10 0
]
beginCap FALSE
endCap FALSE
dar el resultado que se ve a la derecha.
crossSection [
-10 10,
-10 -10,
10 -10,
10 10
]
queda sin cerrar el polgono, con lo que el cubo extruido carece de la cara frontal, como se
puede ver en la imagen de la derecha.
Superficies de revolucin
crossSection [
5 0,
3.53 3.53,
0 5,
-3.53 3.53,
-5 0,
-3.53 -3.53,
0 -5,
3.53 -3.53,
50
]
Recurdese que en el campo crossSection los puntos se expresan con dos corrdenadas (x,z),
y que adems hay que repetir al final el primer punto, para cerrar la seccin transversal.
El campo spine es el siguiente:
spine [
10 0 0,
7.07 0 7.07,
0 0 10,
-7.07 0 7.07,
-10 0 0,
-7.07 0 -7.07,
0 0 -10,
7.07 0 -7.07,
10 0 0
]
En este caso, los puntos vienen expresados por tres coordenadas (x,y,z). Y tambin se repite
el ltimo para cerrar el toro
A la derecha puede verse el resultado.
Es evidente que los ocho puntos que se han utilizado para definir los dos crculos (el de la
seccin transversal y el de la espina dorsal) no son suficientes, pues ms que crculos son
octgonos.
scale [
1 1,
0.5 0.5
]
El argumento del campo scale es un par de parmetros (que varan de 0 a 1) y que
representan la variacin de las coordenadas x z. Hay que especificarlo por cada punto que
hay en la espina dorsal.
En el ejemplo anterior, quiere decir que en el primer punto de la espina dorsal, queremos que
permanezcan inalterables las medidas de las x (factor 1), as como de las z (factor 1). En
el segundo punto de la espina dorsal, en cambio, queremos que las x se reduzcan a la mitad
(factor 0.5), as como las z (factor 0.5). Se poda haber modificado slo uno, pasando en vez de
a un cuadrado menor, a un rectngulo.
A la derecha puede verse el resultado.
orientation [
0 1 0 0,
0 1 0 0.875
]
El argumento del campo orientation est formado por un grupo de 4 parmetros. Los tres
primeros indican el eje alrededor del cual se va a girar la seccin transversal. Y el cuarto
parmetro indica el ngulo girado, expresado en radianes (esto ya se vi para el
campo rotation). Esto hay que especificarlo por cada punto de la espina dorsal.
Material { }
pero puede tener diversos campos, con los que se determinan el color y grado de
transparencia. Los m importantes son:
Material {
diffuseColor ...
emissiveColor ...
transparency ...
}
Vemoslos separadamente:
Material {
diffuseColor 1 0 0
}
El campo diffuseColor determina el color externo (o difuso) del objeto, y tiene un valor
representado con tres nmeros, que se corresponden con el cdigo de colores.
Cdigo de colores
Un color se representa por un grupo de tres cifras. La primera cifra se refiere a la cantidad de
color rojo, la segunda a la cantidad de color verde y la tercera a la cantidad de color azul.
Las cifras pueden oscilar desde 0.0 (nada de ese color) hasta 1.0 (todo de ese color), pasando
por cualquier valor intermedio. Por tanto, en el ejemplo anterior se trata de un color rojo puro.
He aqu algunos ejemplos de colores:
Color
Rojo
Verde
Azul
Rojo
Verde
Azul
Blanco
Negro
Amarillo
Violeta
Marrn
0.5
0.2
Veamos una aplicacin de sto a un, donde tena la apariencia por defecto. Ahora va a tener un
color externo rojo:
Material {
emissiveColor 1 0 0
}
El campo emissiveColor determina el color interno (o emisivo) del objeto, para cuando se
quiere dar la impresin de que el objeto est iluminado por dentro con un color determinado (en
este caso tambin de color rojo).
Para que se puedan comparar, a la derecha estn representados dos conos, el de la izquierda
con un color externo (o difuso) en rojo, y el de la derecha con un color interno (o emisivo),
tambin en color rojo.
Un cuerpo puede tener ambos campos a la vez, y con colores distintos. Es decir, puede tener
un color difuso determinado y otro color emisivo distinto.
A la derecha hay una imagen con un tercer cono que tiene su color difuso rojo y adems su
color emisivo en azul.
Transparencia
Material {
transparency 0.5
}
El campo transparency determina el grado de transparencia del objeto. Su valor est
representado por un nico nmero, que puede variar desde 0.0 (objeto totalmenteopaco)
hasta 1.0 (objeto totalmente transparente, lo que de hecho le hace ser invisible), pasando por
cualquier valor intermedio.
Veamos un ejemplo: un objeto en forma de pared (una caja alta y delgada de dimensiones
2.5x2.5x0.3 de color amarillo y grado de transparencia de 0.5):
specularColor: define el color de los puntos brillantes de los objetos. Su valor son las
tres cifras correspondientes a las cantidades de rojo, verde y azul.
Hasta ahora, para definir un objeto visible se ha utilizado el nodo Shape de la siguiente forma:
Shape {
appearance Appearance {
material ...
}
geometry ...
}
en donde el nodo Appearance tiene un solo campo, material, con el que se definen el color y la
transparencia, segn se ha visto en el captulo anterior.
Pero en realidad puede tener tambin otros dos campos: texture y textureTransform, con los
que se define la textura de los objetos:
Shape {
appearance Appearance {
material ...
texture ...
textureTransform ...
}
geometry ...
}
Vamos a centrarnos en el segundo campo exclusivamente (texture):
Shape {
appearance Appearance {
texture ...
}
geometry ...
}
Qu es la textura?
La textura es la posibilidad que tenemos de envolver un objeto con:
una imagen creada por nosotros pixel a pixel, usando el campo PixelTexture
Se van a ver los dos primeros (ImageTexture y MovieTexture) en este captulo, y el tercero
(PixelTexture) en el captulo siguiente.
Shape {
appearance Appearance {
texture ImageTexture {
url ["monalisa.jpg"]
}
}
geometry ...
}
Como se puede ver, el nodo ImageTexture tiene el valor url ["monalisa.jpg"] (se supone que
la imagen est en el mismo directorio que el documento VRML. Si no fuera as, se pondra
entre comillas la ruta del fichero de imagen)
Aplicando esto a una caja de dimensiones 1.5x2.2x0.5:
Shape {
appearance Appearance {
texture ImageTexture {
url ["etiqueta.jpg"]
}
}
geometry ...
}
se reproducira la imagen de la etiqueta tambin en los fondos superior e inferior (como se ha
podido comprobar en el caso del cilindro con la imagen monalisa.jpg)
Nos interesa que en los fondos superior e inferior tenga la imagen de la derecha (fondo.jpg)
La operacin se hace de la siguiente manera:
Se define el cilindro con la imagen etiqueta.jpg, pero se anulan las superficies superior
e inferior:
Shape {
appearance Appearance {
texture ImageTexture {
url ["etiqueta.jpg"]
}
}
geometry Cylinder {
height 2
radius 0.6
top FALSE
bottom FALSE
}
}
Lo que anula las superficies superior e inferior son los comandos top FALSE y bottom
FALSE respectivamente.
Se define otro cilindro idntico con la imagen fondo.jpg, pero se anula la superficie lateral.
Shape {
appearance Appearance {
texture ImageTexture {
url ["fondo.jpg"]
}
}
geometry Cylinder {
height 2
radius 0.6
side FALSE
}
}
En este caso, lo que anula la superficie lateral es el comando side FALSE
Por medio del nodo Group se agrupan ambos cilindros, con lo que el resultado es
aparentemente un cilindro con imgenes distintas.
JPG ( JPEG)
GIF
PNG
Shape {
appearance Appearance {
texture MovieTexture {
url "mivideo.mpg"
speed 1
loop FALSE
}
}
geometry ...
}
Con el comando speed se controla la velocidad (1, velocidad normal, 2 doble velocidad, etc.).
Con valores negativos el video se ejecutara hacia atrs.
Con el comando loop se controla si el video funciona ininterrumpidamente (TRUE) o una sola
vez (FALSE).
volver