Although extensive use of basic attributes such as color and material will be able to make an object realistic to the human user, it will be time consuming to develop the code for objects that have complicated geometries or appearances. As an example, to create an object with many color patterns on, say, a curve surface, many zones or strips may need to be individually defined using the appropriate color or material properties. To save programming effort, Java 3D allows the use of what is known as texturing and image mapping, which will be the concern of this chapter. Specifically, there are four ways to apply colors to a visual object in Java 3D. The first one is to apply color by defining the color of each vertex in the associated geometry object introduced in Chapter III. Another two ways are to use the coloring attributes in an appearance object and use a material object explained in Chapter IV. Alternatively, as will be discussed in this chapter, we can also apply textures. Texturing is a simple method of giving a geometrical object a realistic appearance. While a desert landscape can be created by simply setting the coloring attribute to golden brown, the result will be dull and unrealistic. However, by using a file with a digital photo for a real desert and applying this on top of the desert geometry, a realistic desert can be constructed in the virtual 3D world (Seamless textures pack, 2006). With texturing, we have new means to add visual details without the need to have additional geometries. The image used for texturing is mapped on to the object at rendering time, and as for material and coloring attributes, the inclusion of texturing can be carried out through an appearance object (Meyer, 2006).
The following four steps are involved for applying textures to a geometry:
The preparation of the best texture image is best performed using a good imaging editing software. However, it should be noted that the sides of the image must be integer powers of two such as 128 by 256, failing which may result in a runtime exception. Java 3D accepts a variety of picture formats, including gif and jpg.
The loading of the texture image can be done from files or through URLs. Lines 1 and 2 in Figure 1 give an example on how this can be performed. Basically, the first line loads the file, picture1.gif, to create an ImageComponent2D object, which can then be used by an appearance object. Note that image loading in Java 3D requires an image observer, which can be any of the AWT components and is specified in the second argument in line 1. The image observer is for the purpose of monitoring the image load process and can be queried on details concerning this process.
In addition to the previous method, the loading of images can also be performed by using the NewTextureLoader class, which is an extension of the TextureLoader class. This new class eliminates the need to specify an image observer component every time TextureLoader is instantiated. Rather, the image observer only needs to be specified once.
Having loaded the image, the created ImageComponent2D object must be added to the appropriate appearance bundle. The code segment from lines 4 to 7 in Figure 1 illustrates how this can be done.Top
After loading the texture image and adding the created texture object to an appearance, we will now need to specify the texture coordinates that will be applied to each of all the vertices of the geometry object. This serves to define the 2D mapping that maps the 2D texture image to each face of the geometry object.