Modeling and texturing a photorealistic fish
A Lightwave Tutorial by Andrew Weiler

In this tutorial we're going to do things a little differently then you may be used to. Because our goal is to model and texture a realistic fish, we're going to start with the texture map as the basis for building our model. Please note that although I'm partial to LightWave, this tutorial is applicable to any 3d application that supports images in the modeler viewport. Please feel free to download the images on this page and follow along.

1. I started out by scanning a photo of a fish on a flatbed scanner (figure 1), this had to be separated from the background and retouched with paint and clone tools in Photoshop. The gamma curves were also adjusted to provide a sharp and saturated image which will become the color map for our fish. Name this image color_map and save it. You may also use a real fish as a basis for your texture, although you may have to fillet it to make sure it lays flat on the scanner. There are a couple of advantages to this method, 1. it will provide you with the sharpest, most authentic texture, and 2. when your boss sees you filleting a fish on your office desk and gingerly slapping it on a scanner he'll think you're in bad need of a break and give you the week off.

2. In photoshop, turn the full-color scan into a grayscale image, and boost the contrast to get a nice definition between the dark and light tones. This image (figure 2) will be used as a template to model the fish, as well as a texture map to control diffusion. Name it gray_map and save.

3. In the modeler of your choice load gray_map and position it in the x viewport. I used LightWave's MetaNurbs function to draw a rough box around the image and proceeded to add control points with the knife tool (figure 3). I then scaled and dragged these points into position. With nurbs-based modelers like Rhino 3D or Alias, you may want to draw curves in the z port, pull these into position and loft them into a nurbs surface.


Figures 4 and 5 show y and z views. Create the fins in a similar fashion, you may want to create them as separate objects then merge them into the final model. The eyes are simple spheres, flatened and moved into place.


In figure 6 we see the final polygonal wireframe, figure 7 shows the shaded geometry.

4. Note that the fish model need only be tagged with one surface name, because all material attributes will be modulated with "global" texture maps. Figure 8 is our transparency map. This map is based on the original grayscale image, all the areas that need to be opaque are painted out in black, while white areas signify complete transparency. Paint a gradual falloff of black to white at the tips if the fins to simulate the translucency seen in a real fish's fins. I used a combination of clone, smudge and blur tools, along with soft airbrushing and dodge/burn to acheive this effect in Photoshop.

5. Figure 9 is a specularity map which provides modulation to the hotspots and highlights of the finished rendering. Turn the original grayscale map negative and cut holes out for the eyes, which need to keep a smooth highlight.

6. Figure 10 is the bump map, which modulates a surface in a way that provides the illusion of bumpiness and raised texture. This will provide us with the final and most important touch: scales. Notice that I've cut out the original gray texture in what would be the scaley areas of a fish and replaced it with a "scales" texture. Again, be sure to cut holes for the eyes to maintain their smoothness.

7. Now that the model and texture maps are ready, load them into the 3d application of your choice and apply them to the appropriate material channels: color, specularity, bump and transparency. I used planar mapping on the x to apply the textures. Finally, load the original gray image and apply it to the diffuse channel. Diffusion controls how light is absorbed or reflected, since organic subjects rarely have uniform diffusion, it's a good idea to modulate it with a texture of some kind. Auto sizing your textures should place your textures perfectly because the model is based on them. You'll have to adjust the percentage of effect each of these channels have on your rendering, just tweak it till it looks right. In the final rendering I used a shader plugin for LightWave called HSVBoost form Worley Labs' ( Polk collection, this adjusts the saturation-desaturation level of the fish based on the camera's angle to the geometry, adding a final touch of realism.

Next time we'll discuss motion and timing, as well as IK hierarchies as we animate our fish. Click to see Part 2.

If you would like to see the fish in an animation, we've supplied a short clip in
Quicktime (1036k), AVI (1099k) and MPEG (439k) formats for your viewing pleasure.

Andrew Weiler is a CG artist and technical director working in the Atlanta, Georgia area. When not producing animation, graphics and effects for companies like Bellsouth, AT&T, and GE you'll probably find him juggling his kids around, and trying to get some sleep.