let on_mouse ~button:btn ~state:state ~x:x ~y:y =
  if btn = Glut.LEFT_BUTTON && state = Glut.DOWN then
    let x, y =
      float_of_int x, float_of_int ((Glut.get Glut.WINDOW_WIDTH) - y - 1)
    in
    let p0, p1 =
      GlMat.push ();
      cam_transfo () ;
      (* Positions in z = 0. and in z = 1. *)
      let p0, p1 =
        GluMat.unproject (x, y, 0.),
        GluMat.unproject (x, y, 1.) in
        GlMat.pop (); p0, p1
    in
    let pv = Vect.normalize (Vect.sub p1 p0) in
      selected :=
      (
        let mi = ref (-1) in
        let md = ref infinity in
          for i = 0 to ((Array.length Solver.pos) - 1)
          do
            let md' = Vect.dist_from_point p0 pv Solver.pos.(i) in
              if md' < !md then
                (
                  mi := i;
                  md := md'
                )
          done; !mi
      ) ;
      let sx, sy, sz = Solver.pos.(!selected) in
      let zv = Vect.proj3 pv in
      let nx, ny, nz =
        Vect.add p0 (Vect.mult pv ((sz -. (Vect.proj3 p0)) /. zv))
      in
      let move = Skel.Constraints.empty (Array.length Solver.skel.(0)) in
        move.(!selected) <- Some (nx -. sx, ny -. sy, nz -. sz); 
        Printf.printf "moving %d from %f %f %f to %f %f %f\n%!"
          !selected sx sy sz nx ny nz;
        do_move move