Hard at work: By Hyun Gu Lee & Murad Akhter

Introduction

We were motivated by the desire to render the intricate and fine detail of human skin texture and multi-layered reflection and sub-surface scattering properties. Towards this end we implemented a paper on "Real-time, Photo-realistic, Physically Based Rendering of Fine Scale Human Skin Structure" by A. Haro et al, and “A Rapid Hierarchical Rendering Technique for Translucent Materials” by Henrik Wann Jensen

Skin Texture & Fine Detail (Murad Akhter)

Hand Modeling, Rigging and Posing

In order to build a realistic hand model we began work with a full body human model from Zygote. I edited the mesh to extract a hand model in Maya, added details like vascular ridges, rigged the model by using Maya's skeleton tool, bound the skin to the rig, and then posed the model so that it would match the image we were trying to reproduce. I then exported this model as an OBJ file and used Mark Colbert's PBRT wavefront shape plug-in to directly read this model for rendering.

Acquiring Skin Moulds


Following the approach of A.Haro et, all, I ordered SILFLO, a Silicone based moulding agent from CuDerm and took moulds from different regions of the hand. I tried to make sure I could capture the higher frequency details around finger joints and knuckles and skin pores around different regions of the skin as well as the lower and upper surface of the palm. Here are images of some of the samples I took.


Generating Normal Maps

I implemented shape from shading to compute normal maps from the skin moulds I had collected. The setup for this consisted of a fixed camera position, sample mould and a halogen lamp whose position I varied as I took pictures to generate 8 simultaneous equations as suggested by A.Haro. I used polaroid filters on the lamp and camera properly rotated prependicular with respect to each other in order to remove specular reflections and assumed pure Lambertian reflection. With 8 equations and images in hand I used a simple least squares method to calculate the normals using Matlab.
ShapeFromShading.zip


Texture Synthesis

I assumed that the normals across the hand surface varied stochastically and so grew the normal maps I had acquired via shape from shading above using texture synthesis. A few regions were selected to grow the normals across and the synthesized textures were stiched together in Photoshop. The texture synthesis algorithm I implemented was based on the extension to Li-Yi Wei & Marc Levoy's "Fast Texture Synthesis using TSVQ" paper by Ashikhmin ("Synthesizing Natural Textures) which works well for natural textures, only requires small neighbourhoods, & doesn't require TSVQ or multi-resolution acceleration. Here are some sample textures synthesized with this code.

And here is the final normal map that was generated from skin moulds, shape from shading, texture synthesis and texture stiching:
TextureSynthesis.zip


Bump mapping and bells and whistles

PBRT uses displacement maps for bump-mapping. I therefore, extended the code base so it could handle normal maps as well. Finally, I also added models and textures for pen, paper and a wooden desk as well as added a depth of focus effect to make a prettier image.


Subsurface Scattering (Hyun Gu Lee)

I tried to implement subsurface scattering using the “A Rapid Hierarchical Rendering Technique for Translucent Materials” by Henrik Wann Jensen and Juan Buhler. Unfortunately, I could not get it to work correctly. This is how I tried to implement it. First, to sample the points on the mesh, I tried using the point repulsion method described in the “Generating Textures on Arbitrary Surfaces Using Reaction-Diffusion” and “Re-Tiling Polygonal Surfaces” by Greg Turk. This method proved to be hard to implement, difficult to debug, and time consuming. After talking with some classmates who were using the same paper, I found that you can just use the vertices of the polygon mesh weighted by the area. The second part of the algorithm, evaluating the diffusion approximation, was done by using a modified octree class. The values of the parameters for skin were taken from “Reflection from Layered Surfaces due to Subsurface Scattering” by Pat Hanrahan and Wolfgang Krueger. In retrospect, I probably should have consulted others and asked for more help. I also shouldn’t have tried to design it in the most general way possible, but concentrate on making it work on one specific case at a time.
subsurface.zip

References

A. Haro, B. Guenter, and I. Essa, Proceedings 12th Eurographics Workshop on Rendering, London, England, June 2001.

http://www.zygote.com/
http://graphics.cs.ucf.edu/mayapbrt/index.php
http://www.antonioharo.com/skin/skin-data.html

Original Proposal

Our original project proposal can be found here. We did not have time to add hair as we had originally intended.