Rendering and
Modeling a Hawk Head with Feathers
Jiayi Chong (jychong@stanford.edu)
Oded Wurman (odie@stanford.edu)
Original
Proposal
Introduction
In this project, we render and
model a realistic hawk head with generated feather geometry. This
project proved to be challenging in several ways:
- Generating the feather geometry
- Rendering the feathers including developing a shading model
- Growing the feathers on the bird model
- Rendering time due to high scene complexity
Motivaton
Our motivation was to model a realistic hawk head, similar to the images below:
Generation of
Feather Geometry
We based our feather generation
approach on the Siggraph 2002 paper "Modeling and Rendering of Realistic Feathers" by Chen et al. The paper describes a method of feather generation using l-systems and splines. We followed this approach by writing our own b-spline library as well as l-systems code.
Our initial l-systems grammar was:
where the symbols R and B refer
to the splines on the feather diagram below:
Our system uses the above l-systems grammar to recursively grow the splines. The generated feathers looked too regular so we added some complexity to our final grammar:
This grammar accounts for forces (F) that, when they exceed a certain random threshold, rotate the feather splines. The result is added irregularity into the feather generation process that improves overall realism. We wrote and OpenGL program to aid us in debugging and visualization our feather geometry, and the following is a screenshot:
Rendering the
Feathers
Chen's paper rendered feathers using a BTF, sampling along a 1-dimensional texture. This approach captures the microgeometry of the feathers. We wrote an implementation similar to the paper, using a modified Kajiya-Kay shading model. The modified model takes into account the microgeometry of the feather surface. At each point that the ray intersects the feather spline, we sample the 1-dimensional texture, modifying the surface properties like the tangent vectors. To accomplish this, we had to derive a new surface integrator as well as a new materials class. Here are two examples of feathers we generated and rendered (with different feather material properties):
Growing Feathers on the Head Model
Feather growing proved to be one of our biggest challenges. The head was modelled using our b-spline library. We had a set of different parameters that accounted for the ways the feathers were placed onto the head model. These included:
- Angular Twist: the allowance in angular variation for the feather placed at a point
- Size Limit: how large or small a feather was allowed to be at a point
- Feather Type: the type of feather to be grown at a point
Feather growing points were initially placed uniformly across the head model. We added a slight random jitter to allow for some irregularities in the feather placement. To account for different feather types, we created a 2-dimensional "feather map" that had a one-to-one correspondence with the head model. Each cell in the feather map determined the type of feather to grow at that point on the model. Our program took the input parameters described above, grew the feathers and wrote them out into a .pbrt file. We wrote another OpenGL program to aid in debugging and visualization of this step, and once again, here is a screenshot:
Distributed Rendering of the Complete Scene
Rendering the complete scene took an exceedingly long time. We needed a high number of samples per pixel to capture the feather geometry, and initial calculations indicated that a high quality rendering could take up to a week. As an example, here is an initial low-quality rendering of the head model alone:
To cut down the rendering time, we wrote a new sampler class that allowed us to do distributed rendering. Our final images were rendered using a total of 4 computers. The film plane was partitioned into quadrants (with adjustable x and y splits to optimally distribute the rendering load) and each quadrant was rendered separately. We then wrote a tool to merge the output from all renders into one final .exr image. This cut down our rendering time by almost 75%, allowing us to render at much higher resolutions and sampling rates. As a future project, it may be interesting to thread and network PBRT to allow for distributed raytracing of extremely complex scenes, or at least take advantage of multiprocessor systems.
Final Images and Future Improvements
These are the final images of our bird. The eye was done using a refractive sphere (we wrote a new transparent material class). The only part of the head model that was not generated by our feather growing system was the beak, which we took from a .3DS model and planar textured using a real hawk beak image. The first two examples show how we can alter the appearance of the bird by adjusting the feather growing parameters of our system. The final example shows the bird rendered using a different environment map.
Future improvements on this project should include:
- Improved realism of the beak model, texture and material, including the use of subsurface scattering
- Realistically measured or artist inspired model of the head to conform to a true hawk
- Modeling and growing feathers on the entire body including wings and tail
- Growing feathers in an in-flight formation to account for wind
- Fully multithreading and networking PBRT to run on multiple CPUs and/or multiple machines