UNIVERSIDAD CENTRAL DEL ECUADOR FACULTAD DE INGENIERA CIENCIAS FSICAS Y MATEMTICAS INGENIERA EN COMPUTACIN GRFICA
Nombre: Alarcn Ruiz Viviana
PROGRAMACIN AVANZADA I TEXTURAS EN JAVA 3D
El aspecto de los objetos en el mundo real depende de su textura. La textura de un objeto es la geometra relativamente fina de la superficie de un objeto. Hasta ahora los detalles de los objetos visuales los ha proporcionado la geometra. Los objetos visualmente ricos, como los rboles, pueden requerir mucha geometra que a cambio requiere mucha memoria y clculo de renderizacin. A cierto nivel de detalle, el rendimiento puede llegar a ser inaceptable. Qu es el Texturado? Representar la imagen del objeto en una superficie plana, es la idea bsica de texturado. Sin embargo, con el texturado, la geometra puede ser muy sencilla. El texturado, tambin llamado mapeo de textura, es una manera de aadir riqueza visual a una superficie sin la adicin de los detalles geomtricos finos. La riqueza visual la proporciona una imagen, tambin llamada textura, que da el aspecto del detalle superficial para el objeto visual. La imagen se mapea dentro de la geometra del objeto visual en el momento de la renderizacin. De ah el trmino mapeo de textura. Texturado Bsico El texturado de polgonos se consigue a travs de la creaccin del manejo de apariencia apropiado y cargando la imagen de la textura dentro de l, especificando la localizacin de la imagen de la textura en la geometra, y fijando los atributos de texturado. Sencilla Receta de Texturado Para hacer fcil el trabajo de especificacin de textura, seguimos los pasos de la siguiente receta. La receta solo subraya los pasos relacionados directamente con el texturado. Deberamos haber observado que la geometra y la apariencia se fijan en un objeto Shape3D que se agrega al escenario grfico. 1. Preparar las Imgenes de Texura 2. Cargar la Textura 3. Configurar la textura en el manejo Appearance 4. Especificar las TextureCoordinates del Geometry Texturado PasoStep 1: Preparar las Imgenes de Texturas Crear y corregir imgenes de textura es algo que normalmente se hace externamente a los programas de Java 3D.
Hay dos tareas esenciales en la preparacin de la imagen de textura: 1. asegurarnos de que las imgenes sean de dimensiones aceptables, y 2. asegurarnos de que las imgenes se graban en un formato que pueda ser ledo. Por supuesto se puede editar la imagen para alcanzar el color, la transparencia, y las caractersticas deseadas. Si una imagen no es de las dimensiones aceptables, debe ser modificada (escalada o recortada) para cumplir los requisitos de dimensin antes de que sea utilizada. En lo que concierne a los formatos, se puede utilizar cualquier formato siempre que proporcionemos un mtodos para cargarlo. Se cargan texturas usando la clase de utilidad TextureLoader. Un objeto TextureLoader carga JPEG, GIF, y otros formatos de fichero. Texturado Paso 2a: Cargar la Textura El siguiente paso es conseguir la imagen preparada en un objeto imagen. Las texturas se pueden cargar desde ficheros o URLs usando de mismo proceso bsico. Un ejemplo para cargar una textura en dos lneas de cdigo que utilizan un TextureLoader. El resultado de estas dos lneas es cargar la imagen del fichero [Link] en un objeto Image2DComponent que se pueda utilizar para crear el manojo de apariencia necesario para el paso 3. 1. TextureLoader loader = new TextureLoader("[Link]", this); 2. ImageComponent2D image = [Link](); Texturado Paso 2b: Crer el Manojo de Appearance Para ser utilizada como textura para un objeto visual, la imagen de textura cargada en el paso anterior se debe asignar como la textura de un objeto Texture, que entonces se utiliza en un manojo de apariencia referenciado por el objeto visual. Especficamente, un objeto Texture2D contiene la imagen de la textura. // Se carga la textura 1. TextureLoader loader = new TextureLoader("[Link]", this); 2. ImageComponent2D image = [Link](); 3. Texture2D texture = new Texture2D(); // La imagen entonces se asigna al objeto Texture2D 4. [Link](0, image); 5. Appearance appear = new Appearance(); //Luego el objeto Texture2D se agrega al objeto Appearance 6. [Link](texture); Texturado Paso 3: Especificar TextureCoordinates Adems de cargar la textura en un manojo de apariencia, el programador tambin especifica la colocacin de la textura en la geometra a travs de la especificacin de las coordenadas de textura. Las especificaciones de coordenadas de textura se hacen por cada vrtice de la geometra. Cada coordenada de textura especifica un punto de textura que se aplicar al vrtice. Con la especificacin de algunos puntos de la imagen que se aplicarn a los vrtices de la geometra, la imagen ser rotada, estirada, aplastada, y/o duplicada para hacer que quepa en la especificacin. TextureCoordinates se especifica en las dimensiones s (horizontal) y t (verticales) de la imagen de textura. Mtodo setTextureCoordinate de GeometryArray void setTextureCoordinate(int index, Point2f texCoord) Selecciona las coordenadas de textura asociadas con el vrtice del ndice especificado para este objeto.
Se crea un solo plano usando un objeto de geometra QuadArray. // Se establece las cuatro esquinas de un cuadrngulo en 3-espacios. 1. QuadArray plane = new QuadArray(4, [Link] 2. | GeometryArray.TEXTURE_COORDINATE_2); 3. Point3f p = new Point3f(); 4. [Link](-1.0f, 1.0f, 0.0f); 5. [Link](0, p); 6. [Link](-1.0f, -1.0f, 0.0f); 7. [Link](1, p); 8. [Link]( 1.0f, -1.0f, 0.0f); 9. [Link](2, p); 10. [Link]( 1.0f, 1.0f, 0.0f); 11. [Link](3, p); // Establecen la localizacin de la textura en la geometra. Se crea un plano de 2 metros en una cara y pone la imagen de la textura en la orientacin normal (hacia arriba, no invertido) a lo largo de la cara del plano. 13. Point2f q = new Point2f(); 14. [Link](0.0f, 1.0f); 15. [Link](0, q); 16. [Link](0.0f, 0.0f); 17. [Link](1, q); 18. [Link](1.0f, 0.0f); 19. [Link](2, q); 20. [Link](1.0f, 1.0f); 21. [Link](3, q);
La Clase NewTextureLoader la clase TextureLoader elimina la necesidad de un componente observador de imagen. En su lugar se utiliza un solo mtodo para especificar un observador de imagen para todas las aplicaciones futuras del cargador de textura. Los constructores de NewTextureLoader son iguales a los de TextureLoader excepto en que ninguno requiere un componente observador de imagen. Algunas Opciones de Texturado Hay mucho ms en el texturado que slo especificar las coordenadas de textura para los vrtices de la geometra. Por ejemplo, el objeto Texture2D se puede configurar para diversos modos de lmites y filtros de mapeo. Texture2D, la clase usada en los ejemplos anteriores, es una extensin de Texture. Algunas de las opciones bsicas para el texturado se implementan en esta clase. Puesto que Texture es una clase abstracta, sus configuraciones se harn a travs de un objeto Texture2D o Texture3d. Las configuraciones son el modo de lmites, filtros, y el formato de la textura. Modo de Lmites: Envolver o Abrazar La configuracin del modo de lmites determina lo que ocurre cuando el mapeo tiene lugar si las coordenadas de textura van ms all del rango 0 a 1 del espacio de la imagen. Las opciones son envolver la imagen, o abrazar la imagen. Envolver, significa repetir la imagen segn sea necesario, es el valor por defecto. Abrazar utiliza el color del borde de la imagen en cualquier lugar fuera del rango 0 a 1.
Especificacin de Filtrado En el clculo de las coordenadas de textura para cada pixel, raramente hay una correspondencia del pixel directamente a un slo texel. Normalmente un pixel es del tamao de varios texels o ms pequeo que un texel. En el primer caso se utiliza un filtro de ampliacin para asociar varios texels a un pixel. En el segundo caso se utiliza un filtro de reduccin para asociar el texel o los texels a un pixel. Hay opciones para manejar cada uno de estos casos. El filtro de ampliacin especifica qu hacer cuando un pixel es ms pequeo que un texel. En este caso la textura ser ampliada como si se aplicara sobre la geometra. Cada texel aparecer como varios pixels y es posibles que la imagen resultante exhiba el "texelization" donde se veran los texels individuales para la renderizacin. Las opciones para el filtro de ampliacin son hacer el punto de muestreo, que es seleccionar el texel ms cercano y utilizar su color, o interpolarlo entre texels vecinos. Texture3d Como el nombre implica, un objeto Texture3d contiene una imagen tridimensional de la textura. Puede ser que pensemos en l como un volumen de color. La clase Texture3d es una extensin de Texture, as que todas las caractersticas de la clase Texture se aplican a Texture3d. La nica caracterstica que Texture3d tiene y que Texture2D no tiene, es una especificacin para el modo de lmite de la tercera dimensin, o la dimensin r. Texturado de Geomtricos Primitivos Una forma para simplificar el proceso de presentar una textura es utilizar un primitivo geomtrico. Se puede utilizar una bandera para asignar automticamente las coordenadas de textura al crear primitivos geomtricos. Se muestra el uso de un constructor para una esfera primitiva con la generacin de coordenadas. 1. [Link](new Sphere(1.0f, Primitive.GENERATE_TEXTURE_COORDS, appear)); Atributos de Textura El componente TextureAttributes permite la personalizacin posterior del texturado. Las configuraciones de los atributos de textura incluyen el modo de textura, color de mezcla, modo de correccin de perspectiva, y una correspondencia del mapeo de la textura. Los valores por defecto para estas configuraciones son REPLACE, black, FASTEST, y NONE, respectivamente. Adems, el mtodo setEnable permite activar y desactivar el mapeo de la textura. Una ventaja de tener controladas las caractersticas del texturado por un componente diferente del nodo es la capacidad de compartir una textura entre objetos visuales pero an as poder personalizarla para cada objeto visual. TextureAttributes. Los objeto TextureAttributes se aaden al escenario grfico como miembros de una manejo de apariencia. El mtodo setTextureAttributes de Appearance se muestra en el siguiente bloque de referencia. Mtodo setTextureAttributes de la Clase Appearance void setTextureAttributes(TextureAttributes textureAttributes) Selecciona el objeto textureAttributes en un objeto appearance. Modo de Textura Para apreciar el rol del modo de textura debemos entender la secuencia de las operaciones implicadas en la determinacin del color de un pixel. Indicado brevemente, primero se calcula el color de la no-textura de un pixel, y luego se aplica la textura. El color de no-textura lo determina el color de la geometra por vrtice, ColoringAttributes, o la combinacin de las caractersticas materiales y las condiciones de iluminacin. Como hay varias formas de
determinar el color de la no-textura, hay varias maneras posibles de combinar el color de la no-textura y el color de la textura. La configuracin del modo de textura es un factor importante en la determinacin de cmo afecta el valor del texel (color y/o alpha) a los valores del color y del alpha del pixel de la no-textura. La operacin de texturado real depende de la combinacin del formato de la textura y del modo de textura. El modo de textura por defecto es REPLACE, las otras opciones son BLEND, DECAL, y MODULATE. Blend En el modo BLEND, el color de la textura se mezcla con el color de la no-textura. El color de la textura determina la cantidad del color de la no-textura a utilizar. La transparencia que resulta es la combinacin de la transparencia de la textura y del material. Este modo determinado de la textura tiene la flexibilidad agregada de incluir opcionalmente un color de mezcla. Decal En el modo DECAL, el color de la textura se aplica como etiqueta encima del color de la no-textura. La transparencia de la textura determina la cantidad de color material a utilizar. La transparencia del pixel se deja sin cambios. Esto es totalmente igual que aplicar una etiqueta a un objeto del mundo real. El formato de textura debe ser RGB o RGBA para el modo de textura de DECAL. Modulate En el modo MODULATE el color de la textura se combina con el color de la no-textura. La transparencia que resulta es la combinacin de la transparencia de la textura y del material. Puesto que el color que resulta depende de la notextura y de los colores de la textura, este modo es til en la aplicacin de la misma textura a una gran variedad de objetos visuales sin hacer que todos parezcan iguales. Este modo se utiliza a menudo en escenas de iluminacin. Replace En el modo REPLACE la textura proporciona el color y la transparencia para el pixel, no haciendo caso del resto de los colores excepto del color specular (si se permite la iluminacin). ste es el modo de textura por defecto incluso cuando no hay componente TextureAttributes en el manojo de apariencia. Textura con Color de Mezcla El color de mezcla se utiliza en texturado slo cuando el modo de textura es BLEND. El color del pixel resultante es una combinacin del color del texel y del color de mezcla. Con el color de mezcla se puede aplicar la misma textura con diferentes sombras a diferentes objetos visuales. El color de mezcla se expresa como un valor RGBA. El color de mezcla por defecto es (0,0,0,0) negro con un alpha de 0. Modo de Correccin de Perspectiva El mapeo de textura ocurre en el espacio de la imagen. Por esta razn los planos texturados pueden parecer incorrectos cuando se ven desde un lateral. Es decir, parecen incorrectos a menos que se haga una correccin de la perspectiva. En Java 3D la correccin de la perspectiva se hace siempre. La nica opcin es cmo hacer esta correccin de la perspectiva. Las dos opciones son FASTEST y NICEST. Obviamente, el dilema es la velocidad clsica contra la calidad de la imagen. Para esta opcin, la configuracin del valor por defecto es NICEST.
Transformacin del Mapeo de Textura Dentro del componente Attributes de una textura se puede especificar un objeto Transform3d para alterar la funcin de mapeo de la textura. Esta correspondencia de transformacin del mapeo de textura se puede utilizar para mover una textura sobre un objeto visual en tiempo de ejecucin. La transformacin traslada, rota, y escala las coordenadas de textura (s, t, r) antes de que los texels sean seleccionados desde la imagen de textura. Una traslaccin en la transformacin de la textura desplazara la textura a travs del objeto visual. Se puede utilizar una transformacin de rotacin para reorientar la textura en un objeto visual. Se pueden utilizar una transformacin de escala para repetir la textura a travs de un objeto visual. Constructores de la Clase TextureAttributes TextureAttributes() Construye un objeto TextureAttributes con estos valores por defecto: texture mode : REPLACE transform : null, blend color : black (0,0,0,0) perspective correction: NICEST TextureAttributes(int textureMode, Transform3d transform, Color4f textureBlendColor, int perspCorrectionMode) Construye un objeto TextureAttributes con los valores especificados. Constantes de la Clase TextureAttributes Estas constantes se usan en los constructores y mtodos para seleccionar los modos de textura y de correccin de la perspectiva. Constantes de Modo de Textura BLEND Mezcla el color de mezcla con el color del objeto. DECAL Aplica el color de la textura al objeto como una etiqueta. MODULATE Modula el color del objeto con el color de la textura. REPLACE Reemplaza el color del objeto con el color de la textura. Constantes del Modo de Correccin de Perspectiva FASTEST Usa el mtodo ms rpido disponible para la correcin de perspectiva del mapeo de textura. NICEST Usa el mejor mtodo (de mayor calidad) disponible para la correcin de perspectiva del mapeo de textura. Mtodos de la Clase TextureAttributes void getTextureBlendColor(Color4f textureBlendColor) Obtiene el color de mezcla de la textura para este objeto appearance. void getTextureTransform(Transform3d transform) Recupera una copia del objeto transformation de la textura. void setPerspectiveCorrectionMode(int mode) Selecciona el modo de correccin de la perspectiva a usar para la interpolacin de coordenadas de color y/o textura Sumario de capacidades de la Clase TextureAttributes ALLOW_BLEND_COLOR_READ | WRITE Permite leer (escribir) el color de mezcla de la textura ALLOW_MODE_READ | WRITE Permite leer (escribir) los modos de textura y de correcin de perspectiva. ALLOW_TRANSFORM_READ | WRITE Permite leer (escribir) el objeto transform de la textura.
Generacin Automtica de Coordenadas de Textura TexCoordGeneration (generacin de coordenadas de textura). Siempre que un objeto se cargue desde un fichero o sea creado en el cdigo del programa, se puede utilizar un objeto TexCoordGeneration para asignar coordenadas de textura. TexCoordGeneration es una clase del corazn del API Java 3D usada para generar coordenadas de textura. Para generar automticamente coordenadas de textura. Formato de Generacin de Textura Se especifica si las coordenadas de textura sern generadas para una textura de dos o tres dimensiones. Las selecciones posibles son TEXTURE_COORDINATE_2 y TEXTURE_COORDINATE_3 que generan coordenadas de textura 2D (S y T) y coordenadas de textura 3D (S, T, y R), respectivamente. Modo de Generacin de Textura Hay dos aproximaciones bsicas para la generacin de textura: proyeccin lineal y mapeo esfrico: Proyeccin Lineal Con la proyeccin lineal, las coordenadas de textura se especifican con planos. Para las coordenadas de textura de dos dimensiones (s,t), se utilizan dos planos. La distancia desde un vrtice a un plano es la coordenada de textura en una dimensin; la distancia desde el otro plano a un vrtice es la coordenada de textura en la otra dimensin. Para las texturas tridimensionales, se utilizan tres planos. Los tres parmetros planos posibles se nombran planeS, planeT, y planeR, donde el nombre corresponde a la dimensin para la cual se utiliza. Cada plano se especifica como 4-tuple (ecuacin plana). Los primeros tres valores son el vector normal superficial para el plano. El cuarto valor especifica la distancia desde el origen al plano a lo largo de un vector paralelo al vector normal superficial del plano. Mapeo Esfrico Si un objeto brillante est en el centro de una habitacin real, probablemente reflejara la imagen de muchos de los otros objetos de la habitacin. Las reflexiones dependeran de la forma del objeto y de la orientacin de las cosas en la habitacin. El modo de generacin de las coordenadas del mapeo esfrico est diseado para asignar coordenadas de textura para aproximar las reflexiones de otros objetos sobre el objeto visual como sucedera para el objeto brillante en el mundo real del ejemplo. Cuando se usa un objeto TexCoordGeneration en el modo de mapeo esfrico el clculo de las coordenadas de textura se basa en las superficies normales y en la direccin de la vista. Cmo usar un Objeto TexCoordGeneration Para usar un objeto TexCoordGeneration, lo seleccionamos como un componente del manojo de apariencia del objeto visual a texturar. La Figura 7-18 muestra el diagrama de una manojo de apariencia con un objeto TexCoordGeneration junto con un objeto Texture y otro objeto TextureAttributes. Mtodo setTexCoordGeneration de la Clase Appearance void setTexCoordGeneration(TexCoordGeneration texCoordGeneration) Selecciona el objeto texCoordGeneration al objeto especificado.
API TexCoordGeneration Los siguientes bloques de referencia listan los constructores, constantes, mtodos y capacidades de los objetos de la clase TexCoordGeneration. Sumario de Constructores de la Clase TexCoordGeneration El objeto TexCoordGeneration contiene todos los parmetros necesarios para generar coordenadas de textura. Est incluido como parte de un objeto Appearance. TexCoordGeneration() Construye un objeto TexCoordGeneration usando los valores por defecto para todas las edades. TexCoordGeneration(int genMode, int format) Construye un objeto TexCoordGeneration con genMode y format especificados. TexCoordGeneration(int genMode, int format, Vector4f planeS) TexCoordGeneration(int genMode, int format, Vector4f planeS, Vector4f planeT) TexCoordGeneration(int genMode, int format, Vector4f planeS, Vector4f planeT, Vector4f planeR) Construyen un objeto TexCoordGeneration con genMode, format, y las ecuaciones de los planos especificados. Sumario de Campos de la Clase TexCoordGeneration Constantes de Modo de Generacin EYE_LINEAL Genera coordenadas de textura como una funcin lineal en coordenadas de ojo (por defecto). OBJECT_LINEAL Genera coordenadas de textura como una funcin lineal en coordenadas del objeto . SPHERE_MAP Genera coordenadas de textura usando un mapeo de reflexin esfrica en coordenadas de ojo. Constantes de Formato TEXTURE_COORDINATE_2 Genera coordenadas de textura 2D (S y T) (por defecto) TEXTURE_COORDINATE_3 Genera coordenadas de textura 3D (S, T, y R) Mtodos de la Clase TexCoordGeneration void setEnable(boolean state) Activa o desactiva la generacin de coordenadas para este objeto appearance. void setFormat(int format) Selecciona el formato TexCoordGeneration al valor especificado. void setGenMode(int genMode) Selecciona el modo de generacin de TexCoordGeneration al valor especifiado. void setPlaneR(Vector4f planeR) Selecciona la ecuacin plana de la coordenada R. void setPlaneS(Vector4f planeS) Selecciona la ecuacin plana de la coordenada S. void setPlaneT(Vector4f planeT) Selecciona la ecuacin plana de la coordenada T. Capacidades de la Clase TexCoordGeneration ALLOW_ENABLE_READ | WRITE Permite leer/escribir su bandera de enable. ALLOW_FORMAT_READ Permite leer escribir su informacin de formato. ALLOW_MODE_READ Permite leer su informacin de modo. ALLOW_PLANE_READ Permite leer la informacin de componentes planeS, planeR, y planeT.
Ejemplo:
BranchGroup bg = new BranchGroup(); TransformGroup tg = new TransformGroup(); [Link](TransformGroup.ALLOW_TRANSFORM_WRITE); [Link](tg); Appearance app = new Appearance(); Texture tex = new TextureLoader(texImage, this).getTexture(); [Link](tex); Box textureCube = new Box(0.4f, 0.4f, 0.4f, Box.GENERATE_TEXTURE_COORDS, app); [Link](textureCube); Transform3D yAxis = new Transform3D(); Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE, 0, 0, 4000, 0, 0, 0, 0, 0); RotationInterpolator rotator = new RotationInterpolator( rotationAlpha, tg, yAxis, 0.0f, (float) [Link] * 2.0f); BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0); [Link](bounds); [Link](rotator); [Link](); return bg; }