|
Buscador
Secciones
Otras zonas
Foros
Ganamos
Registro
|
El Fragmento de Código 7-3 crea un solo plano usando un objeto de geometría QuadArray. Los coordenadas de la textura se asignan para cada vértice. En el código, las líneas tres a once establecen las cuatro esquinas de un cuadrángulo en 3-espacios. Las líneas 13 a 21 establecen la localización de la textura en la geometría. Este fragmento determinado de código crea un plano de 2 metros en una cara y pone la imagen de la textura en la orientación normal (hacia arriba, no invertido) a lo largo de la cara del plano. Fragmento de Código 7-3, Aplicar Coordenadas de Texturas a un Quad. 1. QuadArray plane = new QuadArray(4, GeometryArray.COORDINATES 2. | GeometryArray.TEXTURE_COORDINATE_2); 3. Point3f p = new Point3f(); 4. p.set(-1.0f, 1.0f, 0.0f); 5. plane.setCoordinate(0, p); 6. p.set(-1.0f, -1.0f, 0.0f); 7. plane.setCoordinate(1, p); 8. p.set( 1.0f, -1.0f, 0.0f); 9. plane.setCoordinate(2, p); 10. p.set( 1.0f, 1.0f, 0.0f); 11. plane.setCoordinate(3, p); 12. 13. Point2f q = new Point2f(); 14. q.set(0.0f, 1.0f); 15. plane.setTextureCoordinate(0, q); 16. q.set(0.0f, 0.0f); 17. plane.setTextureCoordinate(1, q); 18. q.set(1.0f, 0.0f); 19. plane.setTextureCoordinate(2, q); 20. q.set(1.0f, 1.0f); 21. plane.setTextureCoordinate(3, q); La Figura 7-4 muestra la relación entre las coordenadas de vértice y las coordenadas de la textura para el cuadrángulo del ejemplo creado en el Fragmento de Código 7-3. La imagen izquierda de la Figura 7-5 muestra la aplicación de la textura stripe.gif a la geometría del ejemplo. ![]() Ahora que hemos completado los tres pasos del texturado, el objeto texturado puede añadirse a un escenario gráfico. La siguiente sección presenta una serie de programas de ejemplo que muestra algunas opciones de texturado.
|
| Formato de Textura | Valores por Texel | Modifica Color del Pixel | Modifica alpha del Pixel |
|---|---|---|---|
| INTENSITY | 1 | si, R=G=B | si, R=G=B=A |
| LUMINANCE | 1 (sólo color) | si, R=G=B | no |
| ALPHA | 1 (sólo alpha) | no | si |
| LUMINANCE_ALPHA | 2 | si, R=G=B | si |
| RGB | 3 | si | no |
| RGBA | 4 | si | si |
Texture3dComo 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 extensión de Texture, así que todas las características de la clase Texture se aplican a Texture3d. La única característica que Texture3d tiene y que Texture2D no tiene, es una especificación para el modo de límite de la tercera dimensión, o la dimensión r.
Algunas Aplicaciones de TexturadoCréamoslo o no, hay muchas más características texturado a explicar. Sin embargo, podemos utilizar las características ya discutidas en muchas aplicaciones. Esta sección hace una parada en la discusión de los detalles de texturado para mostrar dos aplicaciones de texturado. Una aplicación aplica una textura a un primitivo geométrico (véase el Capítulo 2). Otra textura las líneas de polígonos no-rellenos. Una tercera aplicación utiliza la textura creada por un Text2D (véase el Capítulo 3) a otro objeto visual.
Texturado de Geométricos PrimitivosUna forma para simplificar el proceso de presentar una textura es utilizar un primitivo geométrico. Se puede utilizar una bandera para asignar automáticamente las coordenadas de textura al crear primitivos geométricos. El Fragmento de Código 7-6 muestra el uso de un constructor para una esfera primitiva con la generación de coordenadas.
1. objRoot.addChild(new Sphere(1.0f, Primitive.GENERATE_TEXTURE_COORDS, appear));
La línea del Fragmento de Código 7-6 se utiliza en el programa de ejemplo PrimitiveTextureApp.java. Este programa textura una esfera con la imagen earth.jpg, que también está en el fichero jar de ejemplo, dando por resultado la imagen de al Figura 7-13.

Texturado de LíneasLos polígonos no son los únicos elementos gráficos que pueden ser texturados; las líneas también se pueden texturar. El programa TexturedLinesApp.java lo demuestra, usando una textura 1-D para texturar líneas de un objeto visual. En esta aplicación, el objeto visual es una tira torcida creada en el capítulo 2. El único 'truco' para texturar líneas es crear el manojo de apariencia apropiado para visualizar las líneas de la geometría y de los polígonos no rellenos. El Fragmento de Código 7-7 muestra las líneas del código para agregar el componente PolygonAttributes a un manojo de apariencia para visualizar las líneas.
1. PolygonAttributes polyAttrib = new PolygonAttributes(); 2. polyAttrib.setCullFace(PolygonAttributes.CULL_NONE); 3. polyAttrib.setPolygonMode(PolygonAttributes.POLYGON_LINE); 4. twistAppear.setPolygonAttributes(polyAttrib);
Una textura unidimensional es realmente un objeto Texture2D con una dimensión (generalmente t) con tamaño 1. Para el programa de ejemplo, la textura tiene 16 texels por 1 texel. Las coordenadas de dos dimensiones de la textura se asignan al objeto visual. El valor-t de cada coordenada de textura se fija a 0.0f. Sin embargo, se podría utilizar cualquier valor-t y el resultado sería igual. La Figura 7-14 muestra la geometría de la tira torcida visualizada como líneas texturadas. El código fuente está en TexturedLinesApp.java

Usar Texturas Text2DLos objetos Text2D crean texturas de texto especificado y aplican la textura a un polígono. A esta textura se puede acceder fácilmente desde Text2D y aplicarla a otro objeto visual. La Figura 7-15 muestra una imagen producida por el programa Text2DTextureApp.java, un programa que aplica la textura creada por otro objeto Text2D mostrándola en el fondo de la geometría de otro objeto visual.

Atributos de TexturaEn secciones anteriores vimos algunas de las opciones disponibles en texturado. El componente TextureAttributes permite la personalización posterior del texturado. Las configuraciones de los atributos de textura incluyen el modo de textura, color de mezcla, modo de corrección de perspectiva, y una correspondencia del mapeo de la textura. Los valores por defecto para estas configuraciones son REPLACE, black, FASTEST, y NONE, respectivamente. Además, el método setEnable permite activar y desactivar el mapeo de la textura. Todas las configuraciones se explican en esta sección.
Una ventaja de tener controladas las características del texturado por un componente diferente del nodo es la capacidad de compartir una textura entre objetos visuales pero aún así poder personalizarla para cada objeto visual. La Figura 7-10 muestra dos objetos visuales que comparten un solo objeto Texture. Cada uno de los objetos visuales personaliza la textura con el componente TextureAttributes en su manojo de apariencia.

Los objetos TextureAttributes se añaden al escenario gráfico como miembros de una manejo de apariencia. El método setTextureAttributes de Appearance se muestra en el siguiente bloque de referencia.
|
Método setTextureAttributes de la Clase Appearance void setTextureAttributes(TextureAttributes textureAttributes) Selecciona el objeto textureAttributes en un objeto appearance. |
Modo de TexturaPara apreciar el rol del modo de textura debemos entender la secuencia de las operaciones implicadas en la determinación 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 geometría por vértice, ColoringAttributes, o la combinación de las características materiales y las condiciones de iluminación. 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 configuración del modo de textura es un factor importante en la determinación de cómo afecta el valor del texel (color y/o alpha) a los valores del color y del alpha del pixel de la no-textura. La operación de texturado real depende de la combinación del formato de la textura y del modo de textura. Puedes referirte a la especificación de Java 3D API (apéndice E) para más información.
El modo de textura por defecto es REPLACE, las otras opciones son BLEND, DECAL, y MODULATE. Cada uno de los modos se describe en las siguientes secciones. También podemos ver la tabla que resume los modos de la textura.
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 combinación 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 combinación de la transparencia de la textura y del material. Puesto que el color que resulta depende de la no-textura y de los colores de la textura, este modo es útil en la aplicación 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 iluminación.
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 iluminación). Éste es el modo de textura por defecto incluso cuando no hay componente TextureAttributes en el manojo de apariencia.
Sumario de Modos de Textura
La Siguiente tabla ofrece un sumario de cada uno de los modos de textura. Esta tabla se ha pensado como una guía general para entender los distintos modos de textura disponibles. Los cálculos del color real se basan en una combinación del modo de textura y del formato de textura.
Cuando se permite la iluminación, los componentes de colores ambiente, difuso, y emisivo se ven afectados por la operación de textura; el color specular se ve afectado. El color specular se calcula basándose en las condiciones del material y de la iluminación, luego después de que la operación de la textura se aplique a otros componentes del color (no-texturados) el color specular se agrega a los otros colores que renderizan el color final del pixel.
| Modo de Textura | Color de Pixel Derivado desde | Determinado por | Aplicación a... |
|---|---|---|---|
| BLEND | Color de Textura, no-textura, y color mezcla opcional | Color de textura | Escenas Iluminadas con Color de Mezcla |
| DECAL | Color de Textura y color no-textura | alpha de la textura | detalles de superficie |
| MODULATE | Colores de Textura y de no-textura | n/a | Escenas de iluminación |
| REPLACE | Sólo color de textura (modo de textura por defecto) | n/a | Escenas sin iluminación |
Textura con Color de MezclaEl color de mezcla se utiliza en texturado sólo cuando el modo de textura es BLEND. El color del pixel resultante es una combinación 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 Corrección de PerspectivaEl mapeo de textura ocurre en el espacio de la imagen. Por esta razón los planos texturados pueden parecer incorrectos cuando se ven desde un lateral. Es decir, parecen incorrectos a menos que se haga una corrección de la perspectiva. En Java 3D la corrección de la perspectiva se hace siempre. La única opción es cómo hacer esta corrección de la perspectiva.
Las dos opciones son FASTEST y NICEST. Obviamente, el dilema es la velocidad clásica contra la calidad de la imagen. Para esta opción, la configuración del valor por defecto es NICEST.
Transformación del Mapeo de TexturaDentro del componente Attributes de una textura se puede especificar un objeto Transform3d para alterar la función de mapeo de la textura. Esta correspondencia de transformación del mapeo de textura se puede utilizar para mover una textura sobre un objeto visual en tiempo de ejecución. La transformación traslada, rota, y escala las coordenadas de textura (s, t, r) antes de que los texels sean seleccionados desde la imagen de textura.
Una traslacción en la transformación de la textura desplazaría la textura a través del objeto visual. Se puede utilizar una transformación de rotación para reorientar la textura en un objeto visual. Se pueden utilizar una transformación de escala para repetir la textura a través de un objeto visual. Por supuesto, como un objeto transform puede contener una combinación de éstos, se puede animar la textura de un objeto visual manipulando este objeto.
API TextureAttributesLos siguientes bloques de referencia listan los constructores, métodos y capacidades del componente TextureAttributes.
|
Sumario de Constructores de la Clase TextureAttributes Extiende: NodeComponent El objeto TextureAttributes define los atributos que se aplican a un mapeo de textura. TextureAttributes() Construye un objeto TextureAttributes con estos valores por defecto:
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 métodos para seleccionar los modos de textura y de corrección de la perspectiva. Constantes de Modo de Textura
Constantes del Modo de Corrección de Perspectiva
|
|
Sumario de Métodos 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 corrección de la perspectiva a usar para la interpolación de coorednadas de color y/o textura a uno de :
void setTextureBlendColor(Color4f textureBlendColor) void setTextureBlendColor(float r, float g, float b, float a) Selecciona el color de mezcla para este objeto TextureAttributes. void setTextureMode(int textureMode) Selecciona el parámetro del modo de textura a uno de:
void setTextureTransform(Transform3d transform) Selecciona el objeto transform usado para transformar las coordenadas de textura. |
|
Sumario de capacidades de la Clase TextureAttributes
|
Generación Automática de Coordenadas de TexturaSegún se explicó anteriormente, asignar coordenadas de textura a cada vértice de la geometría es un paso necesario en el texturado de objetos visuales. Este proceso puede comsumir mucho tiempo así como es difícil para objetos visuales grandes y/o complejos. Debemos tener presente que esto es un problema para el programador y una vez solucionado, no es un problema que se repita.
A menudo las coordenadas de textura se asignan con el código específico de un objeto visual. Sin embargo, otra solución es automatizar la asignación de las coordenadas de textura mediante algún método. Este método se podía utilizar para cualquier objeto visual tanto si es grande o pequeño, complejo o simple. Este acercamiento es exactamente lo que lo hace un objeto TexCoordGeneration (generación de coordenadas de textura). Siempre que un objeto se cargue desde un fichero o sea creado en el código del programa, se puede utilizar un objeto TexCoordGeneration para asignar coordenadas de textura.
TexCoordGeneration es una clase del corazón del API Java 3D usada para generar coordenadas de textura. Para generar automáticamente coordenadas de textura, el programador especifica los parámetros de la coordenada de textura en un objeto TexCoordGeneration y agrega este objeto al manojo de apariencia del objeto visual. Las coordenadas de textura se calculan basándose en los parámetros de especificación de coordenadas en el tiempo de ejecución. Los parámetros se explican en las secciones siguientes.
Formato de Generación de TexturaEsta selección simplemente especifica si las coordenadas de textura serán 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 Generación de TexturaHay dos aproximaciones básicas para la generación de textura: proyección linear y mapeo esférico:
Poyección Linear
Con la proyección linear, 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 vértice a un plano es la coordenada de textura en una dimensión; la distancia desde el otro plano a un vértice es la coordenada de textura en la otra dimensión. Para las texturas tridimensionales, se utilizan tres planos.
Los tres parámetros planos posibles se nombran planeS, planeT, y planeR, donde el nombre corresponde a la dimensión para la cual se utiliza. Cada plano se especifica como 4-tuple (ecuación 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.
Hay dos variaciones en este método automático de generación de coordenadas de textura. El primero, llamado objeto linear, produce coordenadas de textura estáticas. Con coordenadas de textura generadas linearmente, si el objeto visual se mueve, los coordenadas de textura no cambian. La segunda opción, llamada ojo linear, produce coordenadas de textura relativas a las coordenadas del ojo dando como resultado coordenadas de textura variables. Con coordenadas de textura linear del ojo los objetos que se mueven parecen moverse con la textura.
La Figura 7-17 muestra las imágenes producidas por un programa de ejemplo que utiliza un objeto TexCoordGeneration para asignar coordenadas de textura a una tira torcida. En esta aplicación se usa una textura unidimensional. La textura tiene un solo texel rojo en un extremo. Cuando la aplicación se ejecuta, la tira torcida rota.
La imagen de la izquierda de la Figura 7-17 muestra el texturado con modo de generación OBJECT_LINEAR. En este caso la textura rota con el objeto y se puede ver el texel rojo rotar con la tira. La imagen de la derecha de la Figura 7-17 muestra la textura que resulta cuando el modo la generación es EYE_LINEAR para la tira torcida. En este caso, el texel rojo permanece en el centro de la vista mientras que el objeto rota.

TexCoordGenApp.java es el programa que produce estás imágenes.
Mapeo Esférico
Si un objeto brillante está en el centro de una habitación real, probablemente reflejaría la imagen de muchos de los otros objetos de la habitación. Las reflexiones dependerían de la forma del objeto y de la orientación de las cosas en la habitación. El modo de generación de las coordenadas del mapeo esférico está diseñado para asignar coordenadas de textura para aproximar las reflexiones de otros objetos sobre el objeto visual como sucedería para el objeto brillante en el mundo real del ejemplo.
Cuando se usa un objeto TexCoordGeneration en el modo de mapeo esférico el cálculo de las coordenadas de textura se basa en las superficies normales y en la dirección de la vista.
La textura usada para este efecto debe estar especialmente preparada. Si el ambiente virtual del objeto brillante existe en el mundo real, una fotografía de la escena tomada con una lente de ojo de pez creará una imagen de textura conveniente. Si no existe la escena, entonces la textura se debe crear para parecer que la imagen es una fotografía tomada con una lente de ojo de pez.
Cómo usar un Objeto TexCoordGenerationPara 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.

|
Método setTexCoordGeneration de la Clase Appearance void setTexCoordGeneration(TexCoordGeneration texCoordGeneration) Selecciona el objeto texCoordGeneration al objeto especificado. |
API TexCoordGenerationLos siguientes bloques de referencia listan los constructores, constantes, métodos y capacidades de los objetos de la clase TexCoordGeneration.
|
Sumario de Constructores de la Clase TexCoordGeneration El objeto TexCoordGeneration contiene todos los parámetros 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 Generación
Constantes de Formato
|
|
Sumario de Métodos de la Clase TexCoordGeneration void setEnable(boolean state) Activa o desactiva la generación 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 generación de TexCoordGeneration al valor especificado. void setPlaneR(Vector4f planeR) Selecciona la ecuación plana de la coordenada R. void setPlaneS(Vector4f planeS) Selecciona la ecuación plana de la coordenada S. void setPlaneT(Vector4f planeT) Selecciona la ecuación plana de la coordenada T. |
|
Sumario de Capacidades de la Clase TexCoordGeneration
|
Múltiples Niveles de Textura (Mipmaps)Para entender la razón de los múltiples niveles de textura, consideremos una aplicación que contenga un objeto visual texturado que se mueva alrededor la escena (o que lo mueva el espectador). Cuando este objeto visual está cerca del espectador aparecen demasiados pixels en la imagen. Para este caso, se debería utilizar una textura de buen tamaño para evitar la visión de texels individuales; esto es especialmente cierto cuando se utiliza el punto de muestreo como filtro de ampliación.
Sin embargo, cuando este objeto visual se ve en la distancia, la textura será demasiado grande para el objeto visual y la textura se reducirá durante la representación. (Recordamos que el mapeo de textura tiene lugar durante la renderización en la imagen, la pantalla, o el espacio). El punto de muestreo para el filtro de reducción problablemente no dará resultados satisfactorios cuando el objeto visual sea 1/32 o más pequeño (tamaño del pixel) que la resolución de la textura. El dilema es calidad de la imagen contra rendimiento de renderización.
Si en vez de usar un gran mapeo de textura (porque el objeto visual aparecerá grande) se usa uno pequeño para hacer que la vista del objeto sea mejor cuando es pequeño, existe el problema inverso. Para las imágenes de buena calidad el filtro de ampliación implicará la interpolación linear dando por resultado más cálculo. De nuevo, el dilema está entre la calidad de imagen contra el rendimiento de la renderización. La única ventaja de usar un mapeo de textura más pequeño es un menor requerimiento de memoria para almacenar la textura.
Lo que se necesita es un mapeo de textura pequeño cuando el objeto visual aparece pequeño y un mapeo de textura grande cuando el objeto visual aparece grande. Las técnicas de texturado actuales que usan una imagen de textura, llamada texturado base, no pueden hacer esto. Y esto es exactamente lo que proporcionan los múltiples niveles de textura.
¿Qué es el Texturado Multi-Nivel (MIPmap)?Los múltiples niveles de textura se refieren a una técnica de texturado donde se utilizan juntas una serie de imágenes de textura como textura para los objetos visuales. La serie de imágenes es (generalmente) la misma textura en una variedad de resoluciones. Cuando un objeto visual se está renderizando con múltiples niveles de textura, se utiliza la imagen de textura que está más cercana al tamaño de pantalla del objeto visual.
El funcionamiento del renderizador depende de los filtros de reducción y ampliación usados. Sin embargo, con MIPmaps tenemos más control sobre la apariencia de los objetos visuales y podemos conseguir objetos visuales de mejor aspecto con un mejor rendimiento.
Usar múltiples niveles de textura es como usar un objeto DistanceLOD (véase el Capítulo 5) para aplicar diversas texturas a un objeto visual cuando se ve desde diversas distancias. Las excepciones son que con el Mipmap el objeto visual siempre es texturado mientras que con el objeto DistanceLOD, el objeto podría no ser texturado a algunas distancias. Y, para los objetos visuales texturados en todas las distancias, el MIPmap es más eficiente y ha agregado posibilidades de filtrado con respecto a un objeto DistanceLOD usado para una aplicación similar.
Los múltiples niveles la textura son referidos comúnmente como mipmap. El término "MIPmap" viene de las siglas del Latin "multum in parvo", que significa muchas cosas en un lugar pequeño. El término MIPMap realmente se refiere a una técnica específica de almacenaje para almacenar una serie de imágenes para el uso en texturado de múltiples niveles El término MIPmap se utiliza comúnmente para significar texturado de múltiples niveles.
Con la técnica de almacenaje MIPmap, el tamaño de una imagen de textura es ¼ del tamaño anterior (½ del tamaño en cada cada dimensión). Esto continúa hasta que el tamaño de la imagen más pequeña es de 1 texel por 1 texel. Por ejemplo, si tamaño máximo de la textura es 16x4, las texturas restantes son 8x2, 4x1, 2x1, y 1x1. La Figura 7-19 muestra los niveles de textura para la textura stripe.gif, Cada una de estas imágenes de textura fue preparada usando software de edición de imágenes.

La Figura 7-20 muestra una imagen de un solo plano texturado con una textura múltiple donde cada nivel de textura tiene un color diferente. El plano se orienta en ángulo al espectador para que el lado izquierdo esté más cercano al espectador que el derecho. Debido a la proyección de la perspectiva el lado izquierdo del plano parece más grande en coordenadas de la imagen que el derecho.
Debido a la orientación y a la proyección del plano, los pixels representan menos área superficial (en el sistema virtual de coordenadas del objeto) a la izquierda y progresivamente más área superficial hacia a la derecha, dando como resultado que el nivel de textura cambia. A la izquierda del plano en la imagen, se utiliza el nivel base de la textura. Los cambios del color en la imagen indican donde ocurrieron los cambios del nivel de textura durante la renderización.
Tener una textura para cada nivel de un color diferene no es la aplicación típica de texturado múltiple. Esta aplicación simplemente iluistra la operación de una textura múltiple.

La Figura 7-20 está generada por el programas MIPmapDemo.java.
Ejemplos de Texturas Multi-NivelEn lo que concierte a programación con el API Java 3D, crear una textura de niveles múltiples es casi igual que crearla de un solo nivel, o nivel base. Mirando hacia la receta texturado simple la única diferencia es que se necesitan varias imágenes de textura para la textura de niveles múltiples. Hay dos maneras de crear los niveles múltiples de las imágenes de la textura. Una forma es crear cada imagen a mano con las aplicaciones apropiadas de edición/creacción de imágenes, la otra es utilizar una característica del cargador de textura para crear esas imágenes desde la imagen base.
Las dos técnicas de texturado de nivel múltiple ocupan una cantidad casi igual de código. La de menos cantidad de trabajo es la de generar las imágenes de los niveles desde la imagen base. El Fragmento de Código 7-8 presenta el código de carga de las texturas de MIPmapApp.java. Esta aplicación es un ejemplo de como generar niveles múltiples de textura desde una imagen base.
1. Appearance appear = new Appearance();
2.
3. NewTextureLoader loader = new NewTextureLoader("stripe.gif",
4. TextureLoader.GENERATE_MIPMAP);
5. ImageComponent2D image = loader.getImage();
6.
7. imageWidth = image.getWidth();
8. imageHeight = image.getHeight();
9.
10. Texture2D texture = new Texture2D(Texture.MULTI_LEVEL_MIPMAP,
11. Texture.RGB, imageWidth, imageHeight);
12. imageLevel = 0;
13. texture.setImage(imageLevel, image);
14.
15. while (imageWidth > 1 || imageHeight > 1){ // loop until size: 1x1
16. imageLevel++; // compute this level
17.
18. if (imageWidth > 1) imageWidth /= 2; // adjust width as necessary
19. if (imageHeight > 1) imageHeight /= 2; // adjust height as necessary
20.
21. image = loader.getScaledImage(imageWidth, imageHeight);
22. texture.setImage(imageLevel, image);
23. }
24.
25. texture.setMagFilter(Texture.BASE_LEVEL_POINT);
26. texture.setMinFilter(Texture.MULTI_LEVEL_POINT);
27.
28. appear.setTexture(texture);
El Fragmento de Código 7-8 empieza siguiendo los mismos pasos que son utilizados para cualquier aplicación de textura cargando la imagen base. Una diferencia es que el TextureLoader se crea con la bandera GENERATE_MIPMAP (líneas 3-4). Entonces se extrae la imagen base del cargador de la forma usual.
Las dimensiones de esta imagen son necesarias no sólo para crear el objeto Texture2D, sino también para calcular los tamaños de las siguientes imágenes. Por esta razón se guardan en dos variables (líneas 7 y 8). Estas variables serán utilizadas durante la generación y carga de las imágenes restantes.
El objeto Texture2D se crea usando el modo MIPmap MULTI_LEVEL_MIPMAP y la dimensión de la imagen base (líneas 10 y 11). El nivel base es el nivel 0. Entonces el número de nivel se graba y se selecciona la imagen base como la imagen para el nivel 0 (líneas 12 y 13).
El bucle itera hasta que el tamaño de la imagen sea de 1 pixel por 1 pixel (línea 15). El número de nivel se incrementa en cada iteración (línea 16) y se calcula la dimensión de la imagen (líneas 18 y 19). La imagen apropiadamente escalada se consigue desde TextureLoader (línea 21) y se selecciona para el nivel actual en el objeto Texture2D (línea 22).
Cuando se crea un mapeo de textura de múltiples niveles debemos asegurarnos de seleccionar filtros de nivel como se hace en las líneas 25 y 26 del Fragmento de Código 7-8. Las selecciones de filtrado desactivan el nivel de texturado múltiple.
Crea las imágenes a mano permite una calidad superior y/o poder añadir efectos especiales. Las imágenes generadas se producen filtrando la imagen base.
1. Appearance appear = new Appearance();
2.
3. String filename = "stripe.gif"; // filename for level 0
4. NewTextureLoader loader = new NewTextureLoader(filename);
5. ImageComponent2D image = loader.getImage();
6.
7. imageWidth = image.getWidth();
8. imageHeight = image.getHeight();
9.
10. Texture2D texture = new Texture2D(Texture.MULTI_LEVEL_MIPMAP,
11. Texture.RGBA,imageWidth, imageHeight);
12. imageLevel = 0;
13. texture.setImage(imageLevel, image);
14.
15. while (imageWidth > 1 || imageHeight > 1){ // loop until size: 1x1
16. imageLevel++; // compute this level
17.
18. if (imageWidth > 1) imageWidth /= 2; // adjust width as necess.
19. if (imageHeight > 1) imageHeight /= 2;// adjust height as necess.
20. filename = "stripe"+imageWidth+".gif";// file to load
21.
22. loader = new NewTextureLoader(filename);
23. image = loader.getImage();
24.
25. texture.setImage(imageLevel, image);
26. }
27.
28. texture.setMagFilter(Texture.BASE_LEVEL_POINT);
29. texture.setMinFilter(Texture.MULTI_LEVEL_POINT);
30.
31. appear.setTexture(texture);
Filtros de Reducción para Múltiples Niveles de TexturaAdemás de los dos filtros de nivel base, hay dos opciones de múltiples filtros para la configuración del filtro de reducción. Estas configuraciones adicionales son MIPMAP_POINT, y MIPMAP_LINEAR. Como con las otras configuraciones de filtro, el filtro de punto es probable que cree imágenes más rápidas pero de una calidad más baja con respecto al filtro linear.
Recuerda, cuando usamos múltiples niveles de textura, debemos seleccionar uno de los filtros de múltiples niveles para el filtro de reducción para utilizar otros niveles distintos del nivel base. Estas configuraciones adicionales de filtro no se aplican a las configuraciones de filtro de ampliación puesto que la ampliación de la textura se haría solamente en el nivel base.
Modo MipmapEl modo MIPmap de la clase Texture es realmente una elección entre varios niveles de textura y un sólo nivel de textura. Las dos selecciones son BASE_LEVEL y MULTI_LEVEL_MIPMAP.
API de Texture, Texture2D, y Texture3dMuchas de las secciones precedentes presentan algunas porciones de las clases Texture, Texture2D, o Texture3d. Puesto que estas clases se han descrito en muchas secciones, el API de estas clases se presenta en esta sección.
Texture es la clase base para Texture2D y Texture3d. La clase Texture proporciona la mayoría del interfaz para las clases Texture2D y Texture3d incluyendo texturado multi-nivel. La siguiente tabla presenta un resumen de las características de estas tres clases. Para cada opción de texturado la tabla lista la clase que proporciona al interface, el método (set) para cambiar la configuración y el valor por defecto
| Característica/Selección | Clase | Métodos set | Valor Defecto |
|---|---|---|---|
| Texture Image | Texture | setImage() | null |
| Image Format | Texture | (ver constructores) | none |
| Mipmap Mode | Texture | setMipMapMode() | BASE_LEVEL |
| Minification Filter | Texture | setMinFilter() | BASE_LEVEL_POINT |
| Magnification Filter | Texture | setMagFilter() | BASE_LEVEL_POINT |
| Boundary Modes | Texture Texture2D Texture3d |
setBoundaryModeS() setBoundaryModeT() setBoundaryModeR() |
WRAP WRAP WRAP |
| BoundaryColor | Texture | setBoundaryColor() | black |
Filtros de Reducción y AmpliaciónSegún lo discutido anteriormente hay configuraciones separadas de filtros para reducción y ampliación. Las opciones de ampliación son: BASE_LEVEL_POINT, BASE_LEVEL_LINEAR, FASTEST, o NICEST. El filtro será BASE_LEVEL_POINT cuando se especifique FASTEST y BASE_LEVEL_LINEAR cuando se especifique NICEST.
Las opciones de reducción son: BASE_LEVEL_POINT, BASE_LEVEL_LINEAR, MULTI_LEVEL_POINT, MULTI_LEVEL_LINEAR, FASTEST, o NICEST. Las opciones de filtro de nivel base se pueden utilizar para las texturas de un sólo nivel o texturas de varios niveles. Los filtros reales usados cuando se especifica FASTEST o NICEST se implementan dependiendo de si se elige un filtro multi-nivel o una textura de múltiples niveles.
API TextureAhora que se han presentado todas las características de la textura, presentamos el API de la clase Texture. Como esta es una clase abtracta no hay bloque de referencia sobre sus constructores.
|
Sumario de Campos de la Clase Texture El objeto Texture es un componente de un objeto Appearance que define las propiedades de la textura usada cuando se activa el mapeo de texturas. El objeto Texture es una clase abstracta y todos sus objetos se deben crear usando objetos Texture2D o Texture3d. Constantes de Formato
Constantes de modo MIPMap
Constantes de Filtro
Constantes de Modo de Límites
Constantes del Modo de Corrección de la Perspectiva
|
|
Sumario de Métodos de la Clase Texture El objeto Texture es un componente de un objeto Appearance que define las propiedades de la textura usada cuando se activa el mapeo de texturas. El objeto Texture es una clase abstracta y todos sus objetos se deben crear usando objetos Texture2D o Texture3d. ImageComponent getImage(int level) Obtiene el nivel de mipmap especificado. void setBoundaryColor(Color4f boundaryColor) void setBoundaryColor(float r, float g, float b, float a) Selecciona el color límite de la textura para este objeto. void setBoundaryModeS(int boundaryModeS) Selecciona el modo de límites para la coordenada S en este objeto texture. void setBoundaryModeT(int boundaryModeT) Selecciona el modo de límites para la coordenada T en este objeto texture. void setEnable(boolean state) Activa o desactiva el mapeo de textura para este objeto appearance. void setImage(int level, ImageComponent image) Selecciona un nivel de mipmap especificado. void setMagFilter(int magFilter) Selecciona la función de filtro de ampliación. void setMinFilter(int minFilter) Selecciona la función de filtro de reducción. void setMipMapMode(int mipmapMode) Selecciona el modo mipmap para el mapeo de textura de este objeto texture. |
|
Sumario de Capacidades de la Clase Texture
|
API de Texture2DTexture2D es una extensión concreta de la clase abstracta Texture. Texture2D sólo porporciona un constructor de interés. Todos los métodos usados con objetos Texture2D son métodos de Texture.
|
Sumario de Constructores de la Clase Texture2D Texture2D es una subclase de la clase Texture. Extiende la clase Texture añadiendo un constructor. Texture2D(int mipmapMode, int format, int width, int height) Construye un objeto Texture2D vacío con los valores especificados de mipmapMode, format, width, y height. La imagen del nivel 0 la debe seleccionar la aplicación usando el método setImage. Si mipmapMode se selecciona a MULTI_LEVEL_MIPMAP, se deben seleccionar las imágenes para TODOS los niveles. Parámetros:
|
API de Texture3dTexture3D es una extensión concreta de la clase abstracta Texture. Texture3D sólo porporciona un constructor de interés. Todos los métodos usados con objetos Texture3D son métodos de Texture.
|
Sumario de Constructores de la Clase Texture3d Texture3d es una subclase de la clase Texture. Extiende la clase Texture añadiendo una tercera coordenada, un constructor y un método mutador para seleccionar una imagen de textura 3D. Texture3d(int mipmapMode, int format, int width, int height, int depth) Construye un objeto Texture2D vacío con los valores especificados de mipmapMode, format, width, height y depth. La imagen del nivel 0 la debe seleccionar la aplicación usando el método setImage. Si mipmapMode se selecciona a MULTI_LEVEL_MIPMAP, se deben seleccionar las imágenes para TODOS los niveles. Parámetros:
|
|
Sumario de Métodos de la Clase Texture3d void setBoundaryModeR(int boundaryModeR) Selecciona el modo de límite para la coordenada R de este objeto texture. Parámetro:
|
API de TextureLoader y NewTextureLoaderEsta sección lista los bloques de referencia de las clases TextureLoader y NewTextureLoader.
La clase NewTextureLoader extiende la clase TextureLoader proporcionando una utilidad de cargador de texturas más fácil de utilizar -- una que no requiere un observador de imagen del AWT para cada constructor.
API de TextureLoader|
Sumario de Campos de TextureLoader GENERATE_MIPMAP Bandera opcional - especifica los mipmaps generados para todos los niveles. |
El siguiente bloque de referencia lista algunos constructores de la clase TextureLoader. Hay más constructores que no se listan en este bloque de referencia que permiten la carga de imágenes de textura desde otras fuentes. Puedes consultar la especificación del API Java 3D para ver una lista completa de todos los constructores.
|
Lista Parcial de Constructores de la Clase TextureLoader Extiende: java.lang.Object Paquete: com.sun.j3d.utils.image Esta clase se usa para cargar una textura desde un objeto Image o BufferedImage. Se proporcionan métodos para recuperar el objeto Texture y el objeto ImageComponent asociado o una versión escalada del objeto ImageComponent. El formato por defecto es RGBA. Otros formatos legales son: RGBA, RGBA4, RGB5_A1, RGB, RGB4, RGB5, R3_G3_B2, LUM8_ALPHA8, LUM4_ALPHA4, LUMINANCE y ALPHA TextureLoader(java.lang.String fname, java.awt.Component observer) TextureLoader(java.lang.String fname, int flags, java.awt.Component observer) Contruye un objeto TextureLoader usando el fichero especificado, la opción flags y el formato por defecto RGBA. TextureLoader(java.net.URL url, java.awt.Component observer) TextureLoader(java.net.URL url, int flags, java.awt.Component observer) Construye un objeto TextureLoader usando la URL especificada, opción flags y el formato por defecto RGBA. |
|
Sumario de Métodos de la Clase TextureLoader ImageComponent2D getImage() Devuelve el objeto ImageComponent2D asociado. ImageComponent2D getScaledImage(float xScale, float yScale) Devuelve el objeto ImageComponent2D escalado. ImageComponent2D getScaledImage(int width, int height) Devuelve el objeto ImageComponent2D escalado. Texture getTexture() Devuelve el objeto Texture asociado. |
API de NewTextureLoaderLa razón de utilizar NewTexureLoader es evitar la necesidad de un observador de imagen para construir un cargador de textura. El siguiente boque de referencia enumera algunos constructores de la clase NewTextureLoader. NewTextureLoader tiene los mismos constructores que TextureLoader excepto en que ninguno requiere un componente del awt para servir como el observador de imagen.
|
Lista Parcial de Constructores de la Clase NewTextureLoader Extiende: com.sun.j3d.utils.image.TextureLoader Esta clase se usa para cargar una textura desde un fichero o una URL. Esta clase se diferencia de com.sun.j3d.util.image.TextureLoader sólo en la ausencia de un observador de imagen en el constructor y en el método para selecccionar un sólo observador de imagen para todos los usos posteriores. NewTextureLoader(java.lang.String fname) NewTextureLoader(java.lang.String fname, int flags) Construye un objeto TextureLoader usando el fichero especificado, opción flags y el formato po defecto RGBA. NewTextureLoader(java.net.URL url) NewTextureLoader(java.net.URL url, int flags) Construye un objeto TextureLoader usando la URL especificada, opción flags y el formato por defecto RGBA. |
El siguiente bloque de referencia lista los dos métodos definidos en la clase NewTextureLoader. Todos los demás métodos están definidos por la clase TextureLoader. Para usar un objeto NewTextureLoader se debe seleccionar primero un observador de imagen. Esto se hace normalmente cuando se crea el objeto Canvas3d.
|
Lista Parcial de Métodos de la Clase NewTextureLoader java.awt.component getImageObserver() Devuelve el objeto awt.component usado como el observador de imagen para los objetos NewTextureLoader. void setImageObserver(java.awt.component imageObserver) Selecciona un objeto awt.component como el objeto a usar como observador de imagen en la construcción de los siguientes objetos NewTextureLoader. |
| Leer comentarios (62) | |
| Escribir comentario | |
| Puntuación: |
|
| Votar | |
| Recomendar este tutorial | |
| Estadísticas |
Copyright © 1999-2007
Programación en castellano.
Todos los derechos reservados.
Formulario de Contacto -
Datos legales -
Publicidad
Mantenida por: Claudio y
Dani.
Hospedaje web y servidores dedicados linux por Ferca Network
red internet: jugar gratis | amor | navidad 2009 | registro de dominios |
servidores dedicados
más internet: comprar | gratis | posicionamiento en buscadores | decoración libre | gifs animados