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);
}