anchor.diff:    static const TICS_PER_SECOND = 35.0;
     static const double FAR_DISTANCE = 200.0;
   
  +  Matrix4 fromVersor(Multivector q) {
  +    Matrix3 rot = new Matrix3.columns(
  +        (q * new Multivector.basisVector(0) * q.inverse()).vector,
  +        (q * new Multivector.basisVector(1) * q.inverse()).vector,
  +        (q * new Multivector.basisVector(2) * q.inverse()).vector);
  +    /*Matrix3 rot = new Matrix3.columns(
  +        (q.inverse() * new Multivector.basisVector(0) * q).vector,
  +        (q.inverse() * new Multivector.basisVector(1) * q).vector,
  +        (q.inverse() * new Multivector.basisVector(2) * q).vector);*/
  +
  +    Matrix4 out = new Matrix4.identity();
  +    out.setRotation(rot);
  +    return out;
  +
  +    /*Matrix3 rot;
  +    rot = new Matrix3.columns(rotateVector(a, b, new Vector3(1.0, 0.0, 0.0)),
  +        rotateVector(a, b, new Vector3(0.0, 1.0, 0.0)),
  +        rotateVector(a, b, new Vector3(0.0, 0.0, 1.0)));
  +    return new Quaternion.fromRotation(rot);*/
  +
  +  }
     void _render() {
       _gl.clear(webgl.RenderingContext.COLOR_BUFFER_BIT |
           webgl.RenderingContext.DEPTH_BUFFER_BIT);
  
positive.code: 
      canvas.onMouseMove.listen((MouseEvent e) {
        if (_startDrag != null) {
          Matrix4 rotation = dragRotation(_startDrag, e.client, planeDistance);
          for (int i = 0; i < ROTATION_POWER; i++) {
            _rotation = _rotation.multiply(rotation);
          }
  
          _startDrag = e.client;
  
negative.code:     });
      canvas.onTouchLeave.listen((TouchEvent e) {
        if (_startDrag != null) {
          Multivector rotation =
              dragRotation(_startDrag, e.touches.first.client, planeDistance);
          for (int i = 0; i < ROTATION_POWER; i++) {
            _rotation = rotation * _rotation;
          }
  
          _startDrag = null;
          _needUpdate = true;
          e.preventDefault();
        }
      });
      canvas.onTouchCancel.listen((TouchEvent e) {
        if (_startDrag != null) {
          Multivector rotation =
              dragRotation(_startDrag, e.touches.first.client, planeDistance);
          for (int i = 0; i < ROTATION_POWER; i++) {
            _rotation = rotation * _rotation;
          }
  
          _startDrag = null;
  