VRML
VRML (sigla del inglés Virtual Reality Modeling Language. "Lenguaje para Modelado de Realidad Virtual") - formato de archivo normalizado que tiene como objetivo la representación de escenas u objetos interactivos tridimensionales; diseñado particularmente para su empleo en la web. Se usa por medio de comandos en inglés, los cuales agregan y determinan las características
El lenguaje VRML posibilita la descripción de una escena compuesta por objetos 3D a partir de prototipos basados en formas geométricas básicas o de estructuras en las que se especifican los vértices y las aristas de cada polígono tridimensional y el color de su superficie. VRML permite también definir objetos 3D multimedia, a los cuales se puede asociar un enlace de manera que el usuario pueda acceder a una página web, imágenes, vídeos u otro fichero VRML de Internet cada vez que haga click en el componente gráfico en cuestión.
El Consorcio Web3D fue creado para desarrollar este formato. Su primera especificación fue publicada en 1995; la versión actual funcionalmente completa es la VRML 97 (ISO/IEC DIS 14772-1)
#VRML V2.0 utf8
Cabecera:
La cabecera de todo
fichero VRML es siempre la misma:
donde VRML V2.0 indica el estándar
empleado y utf8 autoriza el uso de caracteres internacionales.
Es importante resaltar
que no debe existir ningún espacio en blanco entre el símbolo
"#" y la palabra "VRML".
En VRML un comentario
se escribe en una sola línea, la cual comienza con el símbolo
#. Se pueden tener tantas líneas de comentarios como se desee.
Un nodo es la estructura
mínima indivisible de un fichero VRML y tiene como misión
la de definir las características de un objeto o bien las relaciones
entre distintos objetos. La mayoría de los nodos pueden repetirse
tantas veces como sea necesario en una escena, salvo una serie de nodos
especiales como los que definen la niebla o la panorámica del mundo
virtual que aparecen un sola vez.
Por otra parte,
no todos los nodos afectan al aspecto visual del mundo. Por ejemplo, existen
nodos que actúan como sensores que detectan acciones del usuario
e informan de ellas a otros objetos y otros que se encargan de modelar
los sonidos.
Los nodos a su vez
contienen campos que describen propiedades. Todo campo tiene un
tipo determinado y no se puede inicializar con valores de otro tipo. De
este modo, cada tipo de nodo tiene una serie de valores predeterminados
para todos sus campos, de forma que cuando lo utilicemos en una escena
sólo debemos indicar aquellos campos que se quieran modificar.
Los campos pueden
ser simples o campos que indiquen a vectores u otros nodos.
FIGURAS PRIMITIVAS
Las formas (Shapes) son los elementos que nos permiten visualizar los objetos en los mundos VRML. La sintaxis del nodo Shape es la siguiente:
- Shape{ appearance ... geometry ... }
El campo appearance especifica las propiedades en cuanto a textura, material, etc del objeto que se describe en el campo geometry.
Hablamos de formas primitivas cuando Shape utiliza nodos geométricos primitivos para construir una figura. Los nodos geométricos primitivos son los siguientes:
Nodo primitivo Box:
Sintaxis:
Sintaxis:
- Box{ size anchura altura profundidad }
Ejemplo:
- Box{ size 2.0 0.5 3.0 }
Las dimensiones que se manejan en VRML son dimensiones abstractas pero lo normal es suponer que la unidad de medida es el metro. De esta forma, en el ejemplo anterior estaríamos definiendo una caja de 2 metros de ancho, 0.5 metros de alto y 3 metros de profundidad.
Nodo primitivo Cone:
Sintaxis:
- Cone{ height altura bottomRadius radio_de_la_base bottom valor_lógico side valor_lógico }
Mediante los campos bottom y side se indica si se desea dibujar la base y la superfice lateral respectivamente. Por defecto estos campos toman el valor TRUE, lo cual indica que se dibuja el cono completo.
Ejemplo:
- Cone{ height 3.0 bottomRadius .75 }
Nodo primitivo Cylinder:
Sintaxis:
Sintaxis:
- Cylinder{ height altura radius radio bottom valor_lógico side valor_lógico top valor_lógico }
Mediante los campos bottom, side y top se indica si se desea dibujar la base inferior,la superfice lateral y la base superior del cilindro. Por defecto estos campos toman el valor TRUE, lo cual indica que se dibuja el cilindro completo.
Ejemplo:
- Cylinder{ height 2.0 radius 1.5 }
Nodo primitivo Sphere:
Sintaxis:
Sintaxis:
- Sphere{ radius radio }
Ejemplo:
- Sphere{ radius 1.0 }
NODO TEXT
Como en cualquier procesador de textos, se nos permitirá indicar el tipo de fuente, su estilo, su tamaño, el espaciado entre caracteres, justificación de los parrafos, etc.
Sintaxis:
Text {
string ["linea_texto 1",
"linea_texto 2",
.
.
.
"linea_texto N",]
fontStyle FontStyle {
family "Nombre_Fuente",
style "Estilo_Fuente",
size Tamaño_Fuente
spacing espaciado_entre_caracteres
justify "justificación_del_texto"
}
}
Como se puede apreciar el nodo Text posee dos campos:
string:
Aquí se introduce el texto que se desea visualizar.
fontStyle:
Este segundo campo es opcional, de forma que si se omite, el texto tendrá el estilo de la fuente por defecto.
Siempre que aparezca este campo tomará como valor el nodo llamado FontStyle.
Ejemplo:
- Text { string ["Esta es la primera fila de texto", "esta es la segunda fila", "etc."] fontStyle FontStyle { family "SERIF", style "BOLD", size 1.0 spacing 1.0 justify "BEGIN" } }
AGRUPACION DE NODOS
podemos agrupar los nodos para conseguir formas más complejas.
Nodo Group:
El nodo Group permite unir un conjunto de nodos de forma que actúen como una entidad única, pero sin efectuar ninguna transformación en ellos. La principal característica de este tipo de grupo es que los objetos son creados todos en el mismo punto (en el centro del escenario de realidad virtual).
El nodo Group permite unir un conjunto de nodos de forma que actúen como una entidad única, pero sin efectuar ninguna transformación en ellos. La principal característica de este tipo de grupo es que los objetos son creados todos en el mismo punto (en el centro del escenario de realidad virtual).
Sintaxis:
- Group { children [ ... ] }
El campo children contiene la lista de los objetos que se quieren agrupar, representados por sus nodos Shape respectivos:
Ejemplo:
- Group { children [ Shape { ... }, Shape { ... }, ... ] }
Ejemplo:
- #VRML V2.0 utf8 #Ejemplo de agrupación de una caja y un cono Group { children [ #Aquí empieza la caja: Shape { appearance Appearance { material Material { } } geometry Box { size 2.0 0.5 3.0 } }, #Aquí empieza el cono: Shape { appearance Appearance { material Material { } } geometry Cone { height 3.0 bottomRadius 0.75 } } ] }
Nodo Transform:
Por defecto todos los objetos (Shapes) se construyen en el centro del escenario virtual. El nodo transform nos va a permitir evitar esto, indicando la posición, orientación y tamaño de los diferentes objetos que va a crear.
Sintaxis:
Transform{
translation Eje_X Eje_Y Eje_Z
rotation Eje_X Eje_Y Eje_Z Ángulo
scale Eje_X Eje_Y Eje_Z
children[...]
}
Cada grupo creado mediante el nodo Transform va a poseer su propio sistema de coordenadas, cuyos atributos se determinan a través de los campos translation,rotation y scale, los cuales son optativos.
El campo translation permite indicar la posición del origen del nuevo sistema de coordenadas perteneciente al grupo dentro del sistema de coordenadas de nodo que lo engloba (nodo padre). A través del siguiente ejemplo esta idea quedará más clara:
Ejemplo:
- Transform{ # Ejes: X Y Z translation 2.0 0.0 0.0 children [...] }
El campo rotation nos permite girar el sistema de coordenadas del grupo alrededor de uno de los ejes del sistema de coordenadas del nodo padre. Para ello, además de indicar sobre que eje se desea realizar el giro, se ha de hacer referencia al grado de inclinación de dicho giro (en radianes).
Ejemplo:
Ejemplo:
- Transform{ # Ejes: X Y Z Ángulo rotation 0.0 0.0 1.0 0.52 children [...] }
A través del campo scale podemos aumentar o reducir el tamaño de los ejes del sistema de coordenadas del grupo utilizando factores de escala que toman como referencia los ejes de coordenadas del sistema del nodo padre. De esta forma aumentamos o disminuimos el tamaño de los objetos que se crean.
Ejemplo:
- Transform{ # Ejes: X Y Z scale 0.5 0.5 0.5 children [...] }
EL COLOR EN LOS OBJETOS
Anteriormente se ha comentado que el nodo Shape contenía dos campos, appearance y geometry, de los cuales el segundo indicaba el tipo de objeto a representar y del que se ha hablado ya ampliamente. Sin embargo la misión del campo appearance apenas se ha comentado, por lo que procederemos a analizarla con más detalle en este punto.
El campo appearance va a permitir seleccionar el color y la textura del objeto que va a ser representado dentro del escenario virtual. Este campo toma como valor un nodo de tipo Appearance, el cual a su vez, posee un campo denominado material que toma como valor un nodo de tipo Material.
El nodo Material es el que controla las propiedades del color (selección del color, del brillo, del grado de transparencia, etc.) que se van a dar al objeto.
Los colores que se le dan a los objetos son colores RGB, es decir, vienen dados por tres valores en coma flotante, cada uno de los cuales representa uno de los colores primarios (Red, Green, Blue ) [ Rojo,Verde y Azul]. El valor 0.0 representa la ausencia de color y el 1.0 la máxima intensidad.
Muchos programas de dibujo darán un valor para cada color RGB en un formato 256x256x256. Para poder utilizar estos colores en VRML es preciso convertirlos, dividiendo cada valor por 256 y colocando el resultado en su campo correspondiente dentro del nodo Material.
Nodo Material:
Con este nodo vamos a determinar el color y grado de transparecia de los objetos.
Sintaxis:
Con este nodo vamos a determinar el color y grado de transparecia de los objetos.
Sintaxis:
- Shape{
appearance Appearance{
material Material{
diffuseColor color_RGB
emissiveColor color_RGB
specularColor color_RGB
ambientIntensity valor
transparency valor
shininess valor
}
}
geometry ... }
diffuseColor: El campo diffuseColor representa lo que la mayoría de los usuarios llamarían como el color del objeto.
emissiveColor:
El campo emissiveColor se utiliza para fijar el color del brillo del objeto, cuando dicho objeto necesite ser visible en la oscuridad. De esta forma se consigue un efecto en donde la figura representada parece iluminada desde el interior mediante una luz de un determinado color.
La configuración por defecto de este campo es el negro, ya que la mayoría de los objetos normalmente no brillan.
emissiveColor:
El campo emissiveColor se utiliza para fijar el color del brillo del objeto, cuando dicho objeto necesite ser visible en la oscuridad. De esta forma se consigue un efecto en donde la figura representada parece iluminada desde el interior mediante una luz de un determinado color.
La configuración por defecto de este campo es el negro, ya que la mayoría de los objetos normalmente no brillan.
specularColor: El campo specularColor es un parámetro avanzado que permite indicar qué color de luz refleja el objeto. Por ejemplo, una cama roja no refleja un color rojo, pero una olla rojiza si puede reflejar su color.
ambientIntensity:
Este campo es otro parámetro avanzado que indica la cantidad de luz ambiental (producida por los diferentes focos de luz del escenario virtual) es reflejada por el objeto.
Toma valores en coma flotante entre 0.0 y 1.0.
shininess: El campo shininess controlan el brillo de un objeto. Toma valores en coma flotante entre 0.0 y 1.0.
transparency:
El campo transparency indica el nivel de transparencia del objeto. Toma valores en coma flotante entre 0.0 y 1.0, siendo el 1.0 el nivel máximo de transparencia (objeto invisible) y el 0.0 el nivel mínimo (objeto totalmente opaco).
El valor por defecto es el 0.0.
OBJETOS ALMACENADOS EN OTROS FICHEROS
Para facilitar el diseño de mundos virtuales habrá ocasiones en las que convendrá almacenar cada objeto en su propio fichero. De este modo, si por ejemplo se deseara modelar una habitación, los diferentes elementos que van a aparecer dentro de ella: paredes, puertas, mesas, sillas, etc, son objetos independientes entre si pero que se engloban dentro de un mismo espacio y, que además, pueden aparecer varias veces en el diseño de todo mundo virtual. Es por ello por lo que sería de interés crear un fichero donde almacenar el objeto mesa ("mesa.wrl"), otro fichero para el objeto silla ("silla.wrl"), etc.
En el fichero "comedor.wrl" se realizan llamadas tanto al fichero que contiene la silla como al que contiene la mesa.
En el fichero "comedor.wrl" se realizan llamadas tanto al fichero que contiene la silla como al que contiene la mesa.
Nodo Inline:
El nodo Inline va a permitir crear un grupo en donde los hijos, almacenados en distintos ficheros VRML, son recuperados indicando su dirección URL.
Sintaxis:
- Inline{ url"dirección_url" }
Ejemplo:
- ... Inline{ url"mesa.wrl" }, ... Transform{ translation ... children [ Inline{url"silla.wrl"} ] }
FORMAS COMPLEJAS
Se ha visto en temas anteriores como mediante la superposición y unión de diferentes nodos geométricos básicos es posible construir objetos más complejos. Sin embargo, si la única manera de generar formas complejas fuese ésta, la construcción de mundos virtuales será bastante ardua. Es por ello por lo que aparecen una serie de nuevos nodos, los cuales, además de facilitar el diseño (al tener más control sobre ellos y al ser más flexibles), generan mundos VRML de una forma más eficiente.
Lo más recomendable a la hora de diseñar un objeto es describir su geometría en dos pasos aislados:
Especificación de las coordenadas:
En este paso se ha de indicar mediante el nodo Coordinate la posición de los puntos que se van a utilizar para construir el objeto. Estos puntos no son visibles en el escenario virtual.
Nodo Coordinate:
Sintaxis:
- Coordinate {
- point [Eje_x Eje_Y Eje_Z,
- Eje_x Eje_Y Eje_Z, ...
- Eje_x Eje_Y Eje_Z ] }
El campo point puede poseer varios puntos, cuyas coordenadas están separadas por comas.
Ejemplo:
- Coordinate {
- point [ 12.0 11.0 17.1,
- 20.5 13.8 5.3,
- 14.0 6.1 22.9 ] }
Creación de la forma geométrica:
Una vez definidos los puntos que forman el esqueleto del objeto, se han de conectar. Existen tres maneras de unir estos puntos, cada una de las cuales está asociada a un nodo diferente:
Nodo PointSet:
Representa un conjunto de puntos situados en las coordenadas índicadas dentro del sistema de coordenadas del nodo padre.
Representa un conjunto de puntos situados en las coordenadas índicadas dentro del sistema de coordenadas del nodo padre.
Sintaxis:
- PointSet {
- coord Coordinate {
- point [ . . . ] }
- color Color {
- color [ . . . ] } }
El campo coord toma como valor un nodo de tipo Coordinate, el cual define los puntos que se desean representar.
El campo color sirve para definir el color de cada uno de los puntos. Este campo toma como valor un nodo Color, que a su vez contiene un campo de tipo color de nuevo. Este último campo describe una lista de colores RGB, de forma que el primer color corresponde al primer punto descrito por el nodo Coordinate del campo coord ; el segundo color corresponde al segundo punto y así sucesivamente.
Ejemplo:
- PointSet {
- coord Coordinate {
- point [
- 12.0 11.0 17.1, #1º punto
- 20.5 13.8 5.3, #2º punto
- 14.0 6.1 22.9 #3º punto
- ] }
- color Color {
- color [
- 1.0 0.0 0.0, # 1º punto rojo
- 0.0 1.0 1.0, # 2º punto verde
- 1.0 1.0 0.0 # 3º punto amarillo
- ]
- }
- }
Si se incluyese este código, tal como está, en un documento VRML, no podríamos ver ninguno de estos puntos, ya que como se ha visto anteriormente, para crear un objeto visibleShape.
se debe utilizar el nodo
se debe utilizar el nodo
Obsérvese que se ha prescindido del campo appearance del nodo Shape ya que no es necesario, pues los puntos no van a tener la apariencia por defecto, sino la que se determina en el campo color.
Ejemplo:
- #VRML V2.0 utf8
- #Ejemplo de un grupo de tres puntos con colores
- Shape {
- geometry PointSet {
- coord Coordinate {
- point [
- 12.0 11.0 17.1, #1º punto
- 20.5 13.8 5.3, #2º punto
- 14.0 6.1 22.9 #3º punto
- ]
- }
- color Color {
- color [
- 1.0 0.0 0.0, # 1º punto rojo
- 0.0 1.0 1.0, # 2º punto verde
- 1.0 1.0 0.0 # 3º punto amarillo
- ]
- }
- }
- }
Nodo IndexedLineSet:
Permite unir los diferentes puntos especificados en su campo coord mediante líneas poligonales.
Sintaxis:
- IndexedLineSet{
- coord Coordinate {
- point [ . . . ] }
- coordIndex [...]
- colorPerVertex valor_lógico
- color Color {
- color [ . . . ] }
- colorIndex [...] }
El campo coord toma como valor un nodo de tipo Coordinate, el cual define los puntos que sirven como esqueleto de la figura.
El campo coordIndex se utiliza para especificar entre qué puntos se han de trazar las líneas. Una línea puede ser trazada utilizando más de dos puntos, de forma que se dibuja una línea entre el primer y el segundo punto, otra entre el segundo y el tercer punto, y así sucesivamente.Un índice con valor -1 indica que ha finalizado la línea actual y que comienza la siguiente.
Para indicar el primer punto definido en el nodo Coordinate se utiliza el 0, para el segundo el 1 y así sucesivamente.
El campo colorPerVertex indica como se han de aplicar los colores sobre las líneas
.
.
Nodo IndexedFaceSet:
Permite unir los diferentes puntos especificados en su campo coord mediante caras poligonales.
Sintaxis:
- IndexedFaceSet{
- coord Coordinate {
- point [ . . . ] }
- coordIndex [...]
- colorPerVertex valor_lógico
- color Color {
- color [ . . . ] }
- colorIndex [...] }
El campo coord toma como valor un nodo de tipo Coordinate, el cual define los puntos que sirven como esqueleto de la figura.
Utiliza los índices de su campo coorIndex para especificar las caras poligonales. Un índice con valor -1 indica que ha finalizado la cara actual y comienza la siguiente.
El campo colorPerVertex indica como se han de aplicar los colores.
REJILLAS
Este nodo crea una cuadrícula rectangular con alturas variables, lo que la hace especialmente útil para modelar el terreno y para la creación de otras superficies en el espacio.
Sintaxis:
- ElevationGrid{
- xDimension número_de_columnas(Eje_X)
- xSpacing valor_real
- zDimension número_de_filas(Eje_Z)
- zSpacing valor_real
- height [altura1, altura2,...,altura(numcolum x numfilas)]
- color Color[...]
- colorPerVertext }
Los campos xDimension y zDimension especifican el número de puntos de la cuadrícula en las direcciones X y Z, definiendo una superficie que contiene un número de rectángulos igual a (xDimension-1)*(zDimension-1).
Los campos xSpacing y zSpacing determinan la distancia entre los puntos de la cuadrícula en el eje X y en el eje Z respectivamente.
El campo height consiste en una ordenación de valores escalares que representan la altura de cada vértice sobre la cuadrícula. Los valores se almacenan de modo que la fila 0 es la primera, la fila 1 la segunda, etc. Dentro de cada fila, los valores de altura se almacenan de modo que la columna 0 es la primera, la 1 la segunda, etc.
El campo colorPerVertex indica como se han de aplicar los colores:
colorPerVertex | Acción |
FALSE | Los colores se aplican sobre las cuadrículas de la rejilla. Se han de definir en el nodo Colors al menos ((xDimension-1)*(zDimension-1)) colores. |
TRUE | Los colores se aplican sobre los vértices de la rejilla.Se han de definir en el nodo Colors al menos (xDimension*zDimension) colores. |
TEXTURAS
La textura es la posibilidad que tenemos de envolver un objeto con una imágen determinada que se encuentra almacenada en un fichero, al cual accedemos mediante su URL. Los tipos de imagen que soporta VRML son:
-JPEG
-GIF
-PNG
Nodo ImageTexture:
Sintaxis:
- ImageTexture{
- url [ "direccion_URL.formato de imagen" ]
- valor_lógico }
UTILIZACION DE FONDO
La utilización de fondos en el mundo virtual, nos permite dotarlos de un cielo y de un suelo, añadiendo realismo de esta forma a la escena que se pretende crear. Estos fondos se van a caracterizar porque siempre le van a dar al visitante la sensación de que se encuentran a una gran distancia.
Por otra parte, su coste es menor que el uso de geometrías. Se distinguen dos tipos de fondos:
Nodo Background: Incorpora un plano de suelo sombreado, texturas y cielo escénico. Sólo se emplea el primer nodo Background que se encuentre, debiéndose especificar en el archivo principal.
Sintaxis:
- Backgroud{
- groundAngle [ ]
- groundColor [ ]
- skyAngle [ ]
- skyColor [ ]
- backUrl "dirección_URL"
- bottomURL "dirección_URL"
- frontUrl "dirección_URL"
- leftUrl "dirección_URL"
- rightUrl "dirección_URL"
- topUrl "dirección_URL"
- }
Todos estos campos no se utilizan simultaneamente, sino que su uso dependerá del tipo de fondo que se desee crear.
Backdrop
Sintaxis:
- Backgroud{
- groundAngle [ ]
- groundColor [ ]
- skyAngle [ ]
- skyColor [ ] }
Ejemplo:
- Backgroud{
- groundAngle [.785] # color_RGB1,color_RGB2 groundColor [ .14 .28 0,.09 .11 0 ]
- skyAngle [.785 ] # color_RGB1,color_RGB2 skyColor [.02 0 .26, .02 0 .65 ] }
El fondo de tipo Backdrop se construye mediante una esfera incompleta (el suelo) inmersa dentro de otra esfera completa (el cielo), en donde el visitante se situa en el centro de ambas. Estas esferas tienen un radio infinito.
El campo skyColor determina el color del cielo en los distintos ángulos de la esfera que lo contiene.El primer valor de este campo determina el color del cielo en los 0.0 radianes de la esfera, es decir, el color que tiene el cielo en el lugar donde se une con el suelo.
El campo skyAngle es utilizado para indicar los ángulos (en radianes) en los que un nuevo color debe aparecer. El campo skyColor debe poseer N+1 colores si en skyAngle se han definido N ángulos, ya que el ángulo 0.0 (que es el que se corresponde con el cielo del horizonte) no se incluye en este último.
Los campos groundColor y groundAngle, son equivalentes a skyColor y skyAngle
respectivamente, pero referidos a la esfera que representa el suelo.
respectivamente, pero referidos a la esfera que representa el suelo.
Si se especifica más de un color, se interpolará el color del suelo entre los colores de 0 a 90 grados en el horizonte (plano X-Z). De forma similar se interpretan los colores del cielo, de 90 a 180 grados en la vertical (plano X-Y).
Panorama
Sintaxis:
- Backgroud{
- backUrl "dirección_URL"
- bottomURL "dirección_URL"
- frontUrl "dirección_URL"
- leftUrl "dirección_URL"
- rightUrl "dirección_URL"
- topUrl "dirección_URL" }
Ejemplo:
- Backgroud{
- backUrl "ba_image.jpg"
- bottomURL "bo_image.jpg"
- frontUrl "f_image.jpg"
- leftUrl "l_image.jpg"
- rightUrl "r_image.jpg"
- topUrl "t_image.jpg" }
Gráficamente podríamos obtener lo siguiente:
TRANSPORTAR DE UN FICHERO A OTRO
Nodo Anchor:
El nodo Anchor crea un grupo especial ya que seleccionando cualquier objeto perteneciente a dicho grupo se salta hacia otro lugar del escenario virtual o hacia otro mundo virtual almacenado en un fichero VRML (al cual accedemos a través de su dirección URL). Cualquier objeto o grupo de objetos se puede convertir en un enlace.
Estos enlaces son los equivalentes en el mundo tridimensional a los enlaces existentes en las páginas Web realizadas mediante HTML.
Además, todo nodo Anchor posee un campo denominado description en el que mediante una cadena de texto se describe brevemente el objeto.
Sintaxis:
- Anchor{
url"dirección_URL"
description "descripción_del_enlace"
children[...] }
Nodo Viewpoint:
Este nodo especifica una posición del usuario y configura el modo de visualización. Podemos pensar que cada nodo Viewpoint es una cámara dentro de nuestro mundo.
Viewpoint {
position x y z
orientation v1 v2 v3 0
fieldOfView angulo
description "Cadena de caracteres"
}
---position: toma por parámetro un punto x y z. Esta será la colocación de la cámara dentro del sistema de coordenadas en el que se encuentre Viewpoint.
---orientation: Determina la dirección en la que mira la cámara. Toma un vector v1 v2 v3 como parámetro.
---fieldOfView: Determina el ángulo de visión de la cámara. Toma por valor el ángulo de visión (angulo). El máximo ángulo es Pi.
---description: Da una descripción de texto del nodo. Los navegadores de VRML incluyen un menú donde escoger cuál de las cámaras disponibles queremos escoger, descrito por la "Cadena de caracteres" que introduzcamos como parámetro.
Ejemplo:
Viewpoint {
position 7.5 0 25
orientation 1 0 0 0
fieldOfView 0.39
description "Entrada"
}