public override void Update(TimeSpan elapsed)
        {
            MouseState ms = Mouse.GetState();

            GraphicsDevice device = GameContainer.Graphics.GraphicsDevice;

            if (ms.LeftButton == ButtonState.Pressed)
            {
                if (ms.X != msLast.X || ms.Y != msLast.Y)
                {
                    Vector3 objSpace     = device.Viewport.Unproject(new Vector3(ms.X, ms.Y, 0), tmp_proj, tmp_view, Matrix.Identity);
                    Vector3 objSpaceLast = device.Viewport.Unproject(new Vector3(msLast.X, msLast.Y, 0), tmp_proj, tmp_view, Matrix.Identity);

                    objSpace.Z     = 0;
                    objSpaceLast.Z = 0;

                    // crazy way of making sure we only continue on mousemoves that were not just pixel to pixel
                    float distance = Vector3.Distance(objSpaceLast, objSpace);

                    if (distance > minMouseMove)
                    {
                        Vector3 moveDirection = Vector3.Normalize(objSpace - objSpaceLast);
                        Vector3 force         = (moveDirection * power) * (float)elapsed.TotalSeconds;

                        transform.Position += force;

                        OnShake(new ShakeEventArgs(moveDirection, force));
                    }
                }
            }

            transform.Position *= friction;

            ball.Update(camera.View, camera.Projection, Matrix.Identity, device);

            transform.Rotation = ball.CurrentQuaternion;

            /*
             * if (Keyboard.GetState().IsKeyDown(Keys.Left)) {
             *  left += 2 * (float)elapsed.TotalSeconds;
             * }
             * if (Keyboard.GetState().IsKeyDown(Keys.Right)) {
             *  left -= 2 * (float)elapsed.TotalSeconds;
             * }
             *
             * if (Keyboard.GetState().IsKeyDown(Keys.Up)) {
             *  up -= 2 * (float)elapsed.TotalSeconds;
             * }
             * if (Keyboard.GetState().IsKeyDown(Keys.Down)) {
             *  up += 2 * (float)elapsed.TotalSeconds;
             * }
             *
             * transform.Rotation = Quaternion.CreateFromRotationMatrix(Matrix.CreateRotationZ(left) * Matrix.CreateRotationX(up));
             */

            msLast = ms;
        }