Last edited 11/15/11 by
Find this document at

RunningGuy: A framework experiment in VPython


The purpose of this program is to create a 3D model of a human and make it demonstrate running. The model is implemented in VPython and is based off of Jim Blinn's 'Blobby Man.'

Creating the Skeleton

In order to begin constructing my model, I needed to first construct a framework. This could be done using the frame objects of VPython. These frame objects allow multiple objects to be connected and manipulated as if they were one object. The objects in the framework conform to a hierarchy of the frames they are in (shown below). The frame of the head serves as the mother frame in this configuration, meaning that a manipulation applied to the head will cause changes throughout the rest of the skeleton. Conversely, the head frame will not be affected by any rotations applied to frames lower than it on the hierarchical tree.

My framework was designed to represent the frame, or skeleton, of a running man. As such, it had to be asymmetrical. I included partial symmetry, along the x-axis in particular, but I needed to represent a man with one leg forward, and the other back. The arms had to exhibit the same behavior, but on the opposite side. The frames for the legs would be rotated and altered during the animation, so the initial conditions are, to an extent, arbitrary.

Creating the Body

My model is made up of mostly spheres and cylinders from the VPython library, similar to Sarah Hovey's 'Workout Guy.' I also experimented with ellipsoids to give the lower body and feet a more natural appearance. I colored the joints orange to differentiate them from the rest of the body parts, which are cyan. These joints correspond to the locations of the frames which they represent (e. g. the joint Rshoulder corresponds to the frame fRshoulder). I wanted to highlight these locations because they experience rotation during the running animation.


In order to simulate running, I had to combine the rotational motion of the joints with an overall translation of the frame. I approached these as two separate problems which I would attempt to resolve into a realistic running animation. The man's translation is controlled entirely by the head frame because it is the mother frame, and the head will not move due to the manipulation of any of the other frames. I made the translational speed increase with time. This allows for a more dynamic view of the running form and could simulate the acceleration of a sprinter at the beginning of a race. As a result, the rotation of the man's limbs had to accelerate accordingly. Using VPython's object.rotate function, I controlled the orange joints and attempted to match the overall leg speed with the body's translational speed.


I would like to implement a feature that would allow for the runner to be reset to his initial position without manually restarting the program. This would simply be more convenient.

I would like to allow the user more control over the runner after he has stopped. This includes picking individual frames to rotate, and possibly applying a translation to the body as a whole.

If possible, I would like to make the runner approach a turn, as if going around a track. I would extend the track used for the ground into a section of a rounded rectangle and alter the rotation and translation at the head.


In order to observe RunningGuy's motion, there needed to be a stable point of reference. For this purpose I created a blue 'track' for the ground with white hash marks, placed at even intervals to make it clear that RunningGuy is accelerating.

I added a rotation for the ankles as well to produce a more convincing animation. They are no longer stuck in one fixed position, and no longer intersect with the ground.

I borrowed the picking system from William Baker's (albeit with a few minor modifications). This system allows the user to experiment with the framework and explore the ways rotations affect the body. I plan to further modify this system to highlight the selected part and change the scale of rotation.

After learning a bit more about the way VPython's display works, I allowed the camera to follow the runner from the side. This view gives a better angle of the limbs as they do not currently experience any side-to-side movement (i. e. they maintain a constant x position). This may change, but for now RunningGuy moves only in a straight line.