¿Eres Normal? |
El último capítulo, cubrimos algunas cosas de los objetos avanzados, como IndexedFaceSets, Extrusions, y ElevationGrids. Bueno, son todos bastante impresionantes, pero podemos hacer muchas cosas más con ellas. Estos nodos geométricos te permiten especificar normales, colores, y otros parámetros para disponer de distintos modos la apariencia de estos objetos. Voy a explicar ahora algo acerca de todo esto, y a enseñarte cómo puede aplicarse.
Normales
Vale, lo primero es lo primero. Un normal es un vector asociado a una cara,
que por regla general permanece perpendicular a ella apuntando hacia fuera
desde la cara visible. Las normales son usadas en visores VRML para cálculos
de iluminación.
En el diagrama superior, las normales de cada cara están dibujadas
en azul. Apuntan hacia fuera, perpendicularmente a cada faceta.
Todo esto está muy bien, pero ¿A tí qué te importa? Despues de todo, no estás aquí para recibir un curso de progemación de gráficos tridimensionales. Bien, como mencionaba, el navegador usará las normales para cálculos de iluminación. Dependiendo de la dirección que tome la normal, el navegador sobreará la cara de manera diferente. Si dos caras tienen un ángulo entre ellas menor a una cantidad determinada, el navegador suavizará la unión entre ellas, dando a la esquina la apariencia de una curva. Si el ángulo es mayor que eta cantidad, el navegador sombreará esta unión de manera afilada, dando una apariencia de facetas. Este ángulo es creaseAngle, que es un campo que aparece en las Extrusions, ElevationGrids, y IndexedFaceSets. Usándolo, puedes cambiar la apariencia de tus objetos drásticamente, haciéndolos suaves o afilados, dependiendo de su valor.
Echa un ojo a este ejemplo y a su código para ver cómo creaseAngle afecta la apariencia de los objetos. El de la izquierda tiene un creaseAngle de 0.5, (su valor por defecto), dándole una apariencia facetada. El del centro, tiene un creaseAngle de 2, dando una apariencia más suave en las junturas, y más afilada en la base. El de la derecha tiene un creaseAngle de tres, sombreando suavemente todas las junturas. No olvides que el creaseAngle, como todos los ángulos usados en VRML, está especificado en radianes, no en grados.
Bien, de vuelta a las normales. El navegador generará las normales por defecto para todos los tipos de nodo, incluidos los objetos avanzados. Sin embargo, estos objetos avanzados tienen un campo normal, que contiene un nodo Normal . Esto te permite especificar las normales explicitamente, y así puedes crear tus propios efectos de luz. Estas normales pueden ser especificadas tanto por vértice como por cara, usando el campo normalPerVertex. Si este campo está a TRUE, las normales se especifican por cada vértice. Si está a FALSE, son especificadas por cada cara.Si no especificas normales, el navegador lo hará él sólo asignándoles sus valores por defecto. Es la mejor solución la amyoría de las veces. Realmente sólo usas normales cuando tratas de conseguir un efecto particular. Especificar tus propias normales significará ocupar un gran espacio en el archivo, que retardará la descarga del mismo, así que úsalas lo mínimo, sólo cuando sea absolutamente necesario.
Fale. Eso fue la teoría. Ahora vamos a la práctica. Dejando aparte los campos creaseAngle y normalPerVertex, que ya hemos cubierto, todavía nos quedan unos cuantos nodos y campos por ver. Comenzaremos con el nodo Normal. Este tipo de nodo contiene un conjunto de normales, que sólo se usa en el campo normal de un nodo.
Normal { exposedField MFVec3f vector [] }
Este nodo sólo tiene un campo: vector. Contiene un conjunto de valores MFVec3f, que son los vectores de las normales para cada cara. Este ejemplo (código) muestra el efecto de aplicar normales por cara y por vértice. El objeto de la izquierda permanece inafectado. El objeto del centro tiene sus normales aplicadas por cara, cambiando el modo en que es iluminada cada cara. El de la derecha del todo tiene sus normales aplicadas por vértice. En este caso, para dar una apariencia compleja y curvada a un objeto simple y afilado. Por ejemplo, puedes hacer a un objeto cúbico tan suave como un cilindro con las normales adecuadas.
Los nodos de geometría contienen además el campo ccw, que especifica si los vertices de una cara se especifican en el sentido de las agujas del reloj. Esto afecta a la dirección de las normales establecidas por defecto, que se usan para cálculos de visibilidad. Si observas directamente una cara con vértices en el orden contrario a las agujas del reloj, la normal apuntará hacia ti. En cambio, si lo haces en el sentido de las agujas del reloj, apuntará hacia el otro lado, con lo que la cara no será visible. Disponer los valores de este campo incorrectamente, puede crear efectos muy interesantes, como objetos a los que les falta algún pedazo.el campo ccw está a TRUE por defecto. Este ejemplo, con su código , demuestra el efecto del campo ccw. El objeto de la izquierda tiene su ccw a TRUE, el otro lo tiene a FALSE, de modo que lo que se muestra es el interior del objeto.
El próximo campo que debemos considerar es normalIndex. Contiene una lista de números de caras o vértices, dependiendo de lo que hayamos puesto en el campo normalPerVertex. La primera cara o vértice especificada en el campo coordIndex/coord será la número 0, hasta el número total de caras o vértices menos 1. El campo normalIndex especifica qué normales se corresponden con qué vértices o caras. De esta manera, no tienes por qué especificar las normales en el mismo orden en que estén dispuestos estos. En cambio, si dejas este campo en blanco, las normales serán aplicadas en este orden.
Los nodos Extrusion y IndexedFaceSet tienen además el campo convex. Si lo dejamos en TRUE, el navegador no se preocupará por objetos overlapping. Por defecto su valor será FALSE, lo que es más seguro. Cambialo sólo si estás convencido de que el objeto va a ser completamemte convexo.
Colores
Exactamente de la misma manera que las normales, podemos aplicar diferentes colores por cara o por vértice. Esto puede hacerse con el campo color, que contiene un nodo Color, de la misma manera que el campo normals. Existe además un campo colorIndex y otro colorPerVertex , que hacen lo mismo que sus equivalentes en el campo normals. Este ejemplo (código) muestra como queda un objeto con colores especificados por vértice. El ejemplo es un cubo de colores RGB. La sintaxis del nodo Color se muestra abajo.
Color { exposedField MFColor color [] }
Intacto
Bien, ya habido suficientes ejemplos para este capítulo, de modo que no voy a hacer otro para su final. Podría combinarlos todos, pero no conseguiríamos nada nuevo, así que no voy a hacerlo. Sólo diré que en el próximo capítulo cubriré la luz, y explicaré cómo añadir luces a tus escenas, y detallaré un poco más sobre la manera en que el VRML realiza cálculos de luz y cómo interactuan con los materiales de tus objetos. Oh, y la primera persona que adivinó porqué esta sección se llama 'Intacto' (Intact en el original, sin género)
fue Hank Zill. ¡Si alguien más lo logra, ganará mi eterno respeto!