Goals
Squash and Stretch
I want to implement a non-physics based deformation technique that is more general than scaling the three coordinate axes. The deformation technique that I will implement will work for objects that can be approximated by a medial axis, for example spheres and cylinders.

This deformation technique will be used to simulate squash and stretch by constraining the orientation of the object so that it's medial axis is in the same direction as the object's velocity. The deformed medial axis will be represented by an interpolating cubic Hermite curve. The center point will be the objects current position. The end points will be based off of the object's previous and next position and velocity.

Once the deformed medial axis is defined a space warp must be constructed to deform the object. Every point on the medial axis (Hermite curve) not only has a position but also a local frame defined by the three normal vectors T, N, B, where T is in the direction of the derivative of the curve. If the radius of the object is constant, then N and B are in the normal to T and these vectors are orthonormal.

In order to implement this in general I will have to generate the medial axis and the radius along that axis for a poligonal model. I also want to be able to effect the deformation with an object variable saying how deformable the object is. A scheme must also be developed smoothly transition between stretching, squashing, and during squashing to re-orient the object in the new direction of travel. Also the jacobian of this space warp needs to be found so that the correct normals can be recomputed.

View Depenedant Warping
My idea here is to take as input a realistic 3D scene like a town. Then I want to automatically generate a FFD deformation of each object based on where it is in relation to the viewing direction. THe goal of this deformation is to make the scene/object look more "cartoony". This will involve determining some heuristics, which will be pseudo random and based on the objects position w.r.t. the viewing direction. While the effects are random, there must be frame by frame coherence.

What's done
Squash and Stretch
I Considered a cylindrical object oriented along the positive z axis from z=0 to z=1. Its medial axis is (0,0,0)->(0,0,1), and T = (0,0,1), also let N = (0,1,0) and B = (0,0,1). At time t there is a T', N', and B'. The space warp is defined by:
X' = curve(z) + y * yScale * N' + x * xScale * B'

Where xScale = yScale = sqrt( orignal_arc_length / new_arc_length). This makes it so that the volume is conserved.

In the series of images below the motion of the cylinder was generated by hand, so the deformation is not based on the object's velocity.



View Depenedant Warping
Implemented FFD.

What's left
Squash and Stretch

  • Interpolate the full medial frame instead of just the curve.
  • Generate deformations based off of velocities instead of hand placed.
  • Calculate the Jacobian at every point so the normals can be conserved.
  • Integrate a smooth transition between stretching and squashing and changing orientations.
  • Generalize warp to handle a changing radius along the medial axis.
  • Find an approx. medial axis for an inputted polygonal object.
  • Add a coefficient of deformability.


  • View Depenedant Warping
  • Construct a good model for a building.
  • Implement my heuristic and see if I can make it look good.
  • Future Work

  • Articulated figures for Squash and Stretch
  • Look into physically based deformation methods.