Audi "Paper Liberation"
Role: 3D Artist
VFX: The Mill
Director: Nicolai Fuglsig
Production Company: MJZ
I was working in Houdini for this job. One of my more interesting tasks was to make the blocks of simple flat geometry look like stacks of hundreds of sheets of paper.
This was done using a displacement shader in Mantra. See below for more details on how this shader was created.
Displacement Shader Development
The base geometry that the shader was applied to was a set of vertical blocks. These blocks would gradually increase in height throughout the film as the paper rained down.
The image below shows part of the process we went through to generate the blocks with the shape of the Audi carved out of it. Houdini's boolean operation wasn't as good as it is now, and cleaning up the geometry caused us a lot of headaches!
The principal input to a displacement shader is the surface position in space. If we're trying to emulate a stack of paper, the position value itself isn't of much help. Instead, it's more useful to know which sheet of paper is being evaluated, and which stack of paper we're within.
A simple bit of maths allows us to figure out which stack we're in. Once that's figured out, it can become the basis for many of the calculations. It's also useful as a random number seed as it ensures that all random values are consistent given a particular paper stack.
The other value that was important was the center position of the stack, as the paper needed to rotate around this axis.
Positional and rotational offsets were introduced for each sheet of paper. The paper stack was also warped vertically with a low frequency sine wave to modulate the profile slightly and give the impression of flexibility and weight.
Initially, the part of the shader that dealt with differentiating between the different sheets of paper, did so by quantising the Y coordinate of the current evaluated position. This was a naive approach! By doing this, I had effectively introduced a square wave signal which (if you know your Fourier theory) requires infinitely wide frequency bandwidth. Hello aliasing!
To work around this, introducing a simple soft-step filter to the quantisation, removed the high frequency components and made it look much nicer.