Here is an inexpensive way to create a three dimensional pointing device. Take a working mechanical wheel mouse (the type with a scrolling wheel). Remove the ball. Drill some holes in the sides and run a string into the mouse, around the horizontal roller, and out the other side. Reroute the sensors for the vertical roller and the scroll wheel to a pair of external sensors. The easiest way to do this is to take a couple of dead mechanical mice and simply wire their horizontal rollers to the master mouse's vertical roller and scroll wheel. Run strings around these two rollers as well. Attach small weights to one end of each string and tie the other ends together. The result is a computer peripheral which can be used to indicate a point in three dimensions.
My implementation was mostly built out of surplus parts. The board was the sign for the Inverness office of Digital Routes (made obsolete when the company moved to Elgin). The mouse is a Genius NetScroll+ PS2/Serial mouse. This type of mouse uses a four-byte protocol which may be unique to Genius (it is somewhat simpler than the more common Microsoft Intellimouse protocol). The front two rollers were extracted from a long-dead Microsoft bus mouse. They are mounted to the board using brackets cut from the plastic housing for some old telephone equipment. The string was purchased at a local knitting store. The central ring is my key ring. The three weights are built from a stack of washers attached to an alligator clip by a large bolt.
The biggest problem is friction -- or lack thereof. There isn't much friction between the strings and the rollers which means tacking is very poor quality (especially on downward movements when the string loop loosens). Looping the string around the rollers more than once solves the problem, but causes the roller to jam when the string runs over itself. Increasing the mass of the weights also solves the problem, but causes operator fatigue due to having to constantly pull against the weights. The solution was to use hot melt glue to build crude pulleys on the shafts. Hot melt glue has an extremely high coefficient of friction and works very well. Even so, the mouse quickly drifts out of sync with reality and has to be recentred regularly.
Converting the mouse's data into height-width-depth co-ordinates involves rather a lot of math. 3dmouse.py is a Python program which reads the data from the mouse, decodes it and computes the co-ordinates. This program can be used as the basis of more advanced applications such as the 3D Pong game pictured on the left. The 3D Mouse could also be used to manipulate objects in a CAD program, set up planets in an orbital simulator, or control a robotic arm.