Computer Graphics · Stanford CS348C
Animation and Simulation (CS348C): Procedural Modeling, Fracture, and Character FX
Coursework and studies in physically based animation — procedural modeling, rigid-body fracture with glue constraints, and cloth-driven character effects, built and rendered in Houdini.
The course
CS348C — Computer Graphics: Animation and Simulation, taught by Prof. Doug James, covers “core mathematics and methods for computer animation and motion simulation,” spanning both traditional animation technique and physics-based simulation. The syllabus moves through particle systems, constrained dynamics and Lagrange multipliers, rigid-body motion and contact, position-based dynamics and shape matching, fracture, fluid simulation (particle-based SPH and grid-based), the material point method, discrete elastic rods and yarn-level cloth, and audio synthesis for animation. There is no textbook — the course runs on lecture notes and assigned research papers — and there are no exams: the grade rests entirely on a sequence of assignments and a final project.
All work is authored in SideFX Houdini, whose procedural, node-graph paradigm means that an animation is not a baked artifact but a program — a directed graph of operators that can be re-parameterized and re-evaluated. The pages below record what I built for each unit.
Procedural modeling
The procedural modeling unit asks for geometry generated by rule rather than by hand. I built a morphing classical pillar: a base profile (a circle blended into a square) copied along a line, skinned and extruded to make the solid. Boolean operations on the resulting shapes proved unreliable, so the forms were converted to VDB volumes, combined, and subtracted — a far more robust route to the same result. Ornament was traced from a reference pattern, bent, extruded, and projected onto the surface with ray nodes, with VEX driving the carving angle. Lighting is a Polyhaven HDRI on a dome light; the render is Karma via Solaris.
Dynamics: fracture and constraint networks
The dynamics unit is where the physics begins. I built a brick wall by copying bricks to points and randomizing each in a loop to suggest wear. Mortar was derived by converting the bricks to a VDB, smoothing it, and subtracting the bricks back out. Bricks and mortar were then fractured — I experimented with RBD material fracture and VDB fracture, but found Voronoi fracture gave the most visual control, and wrapped it in a subnetwork to learn how Houdini Digital Assets are authored.
The fracture node’s outputs feed two streams: the geometry itself (in low- and high-resolution versions) and a glue constraint network, whose graph topology and constraint weights determine how the structure fails. Both go into a DOP network running the rigid-body solver with POP wind. The lesson the assignment actually taught, as my submission notes concede, was “how easy it is to run out of time when it comes to simulation.”
Character and audio FX
The character unit is the most involved, and produced the running man. Three Mixamo motion clips — a turn into a run, a run with a look back, and a run into a dive — are imported, cleaned of problematic scale-inheritance attributes, and blended with Houdini’s motion-clip sequencing into a single continuous performance. A free RenderPeople character is retargeted onto that skeleton using rig pose matching, point mapping, and full-body inverse kinematics.
The effect itself is a character who deflates mid-run. The animated body is fed into a Vellum solver as cloth — high stretch stiffness, lower bend stiffness, animated rest-length scale — with a SOP solver attached to the forces output running a VEX wrangle that arrests the animation at a chosen frame. From this network I extract both the deflating body and the centroid of a tracked body part, which drives a camera that follows the character by relative transformation matrix.
Post-it notes are then scattered across the body: painted into place with attribute paint (kept away from the armpits, where intersecting geometry stretches badly), oriented and coloured in VEX, copied to points, and simulated in a second Vellum solve. A POP force fires as the character dives. In post-processing, a per-primitive stretch-distance attribute deletes over-stretched notes, and a SOP solver persists those deletions forward in time so a note, once gone, stays gone.
Running away from work: three blended Mixamo clips, a Vellum deflation, and post-it notes shed under a POP force. Rendered in Karma with motion blur.
A chicken, outside the syllabus
Separately from the coursework, I developed a single character asset through three stages of increasing complexity — a personal study rather than an assignment. A turntable establishes the model and its materials; a behavioural pass animates the bird pecking and investigating; and a final pass couples the animation with a particulate dust simulation, so that the character’s motion excites and is grounded by its environment.
Turntable — model and look development.
Behavioural animation — the chicken investigates its surroundings.
Simulation pass — animation coupled with particulate dust.