The datasets we would like to visualize are often discrete representations of data that are intrinsically continuous. We refer to such datasets as sampled data.
The Stanford Bunny is an example of sampled data. It is a range scan (point sampling) of the surface of a clay bunny. The surface has been reconstructed as a triangle mesh, which is a discrete approximation of the original continuous data. This triangle mesh is commonly available as an indexed face set both in PLY and OBJ format. A loader for the PLY format is available in the code samples from DV and a loader for the OBJ format is available in the code samples from GL. I use a slightly modified version of the OBJ parser from GL for this example.
The normals used for shading the bunny are important with respect to the quality of the reconstruction. If we use face normals, we get flat shading, which is not as good as the linear interpolation of the surface geometry provided by the triangles. If we can find proper vertex normals, we can also get linear interpolation of the lighting (Gouraud shading) or even quadratic interpolation of the lighting (Phong shading). Computing good vertex normals is not necessarily easy. In Section 2.3 of DV, area-weighted normal averaging is suggested for computing vertex normals. In this example, I use angle-weighted normal averaging.
Mouse control: orbit - left button, zoom - middle button, pan - right button.
Keyboard options: compute angle-weighted vertex normals - [n].