Dan Shiffman’s written a nice library to access the sudden motion sensor on the macbook and macbook pro. He based it on a couple other open source libraries. Below is a code sample for it that draws a plane on the screen and moves it as you tilt the computer.
/* smsTilt Takes the values from the sudden motion sensor on a powerbook (assuming the machine has the SMS in it: macBookPro, macBook, later Powerbooks) and uses it to set the position, attitude, and color of a rectangle on the screen. To use it, tilt your powerbook around. created 28 October 2006 by Tom Igoe */ import sms.*; int graphPosition = 0; // horizontal position of the graph int[] vals = new int[3]; // raw values from the sensor int[] maximum = new int[3]; // maximum value sensed int[] minimum = new int[3]; // minimum value sensed int[] range = new int[3]; // total range sensed float[] attitude = new float[3]; // current value as a attitude of window height float[] position = new float[3]; // current value as a attitude of window height float rectSize; // rectangle size void setup () { // draw the window: size(400, 400, P3D); // set the size of the rectangle: rectSize = width/4; // set the background color: background(0); // set the maximum and minimum values: for (int i = 0; i < 3; i++) { maximum[i] = 400; minimum[i] = -400; // calculate the total current range: range[i] = maximum[i] - minimum[i]; } } void draw () { background(0); // get the values: vals = Unimotion.getSMSArray(); // check to see if you have new peak values: checkLimits(); // draw the plane: tilt(); } void checkLimits() { for (int i = 0; i < 3; i++) { // calculate the current attitude as a percentage of 2*PI, // based on the current range: attitude[i] = PI * float(vals[i] - minimum[i]) /float(range[i]) ; } // calculate the current position as a percentage of the window height, // based on the current range: position[0] = width * float(vals[0] - minimum[0]) /float(range[0]); position[1] = height * float(vals[1] - minimum[1]) /float(range[1]) + minimum[1]; position[2] = height * float(vals[2] - minimum[2]) /float(range[2]); } void tilt() { // position: translate(position[0], position[2], position[1] ); // pi/2, 0, 0 is level plane // X is front-to-back rotateX(attitude[1]); // Y is left-to-right rotateY(attitude[0] + PI/2); // Z is pivot rotateZ(attitude[2]+PI/4); // draw the rect: fill(position[0],position[1],position[2]); rect(-rectSize, -rectSize, rectSize*2, rectSize*2); }