anchor.diff:  
       getMouseOnScreen( clientX, clientY )
         => new Vector2(
  -          ( clientX - screen.offsetLeft ) / radius * 0.5,
  -          ( clientY - screen.offsetTop ) / radius * 0.5
  +          ( clientX - screen.left ) / screen.width,
  +          ( clientY - screen.top ) / screen.height
         );
   
       getMouseProjectionOnBall( clientX, clientY ) {
   
         var mouseOnBall = new Vector3(
  -          ( clientX - screen.width * 0.5 - screen.offsetLeft ) / radius,
  -          ( screen.height * 0.5 + screen.offsetTop - clientY ) / radius,
  +          ( clientX - screen.width * 0.5 - screen.left ) / ( screen.width * 0.5 ),
  +          ( screen.height * 0.5 + screen.top - clientY ) / ( screen.height * 0.5 ),
             0.0
         );
   
         var length = mouseOnBall.length;
   
  -      if ( length > 1.0 ) {
  +      if ( noRoll ) {
  +
  +        if ( length < Math.SQRT1_2 ) {
  +
  +          mouseOnBall.z = Math.sqrt( 1.0 - length * length );
  +
  +        } else {
  +
  +          mouseOnBall.z = 0.5 / length;
  +          
  +        }
  +
  +      } else if ( length > 1.0 ) {
   
           mouseOnBall.normalize();
   
  
positive.code: 
  
      // methods
     handleResize () {
        screen
        ..width = window.innerWidth
        ..height = window.innerHeight
        ..offsetLeft = 0
        ..offsetTop = 0;
  
        radius = ( screen.width + screen.height ) / 4;
      }
  
      handleEvent( event ) {
        dispatchEvent(event);
  
negative.code:  static const PAN = 2;
  }
  
  class TrackballControls extends EventEmitter {
  
    int _state, _prevState;
    Object3D object;
    Element domElement;
    bool enabled;
    Rect screen;
    num rotateSpeed,
        zoomSpeed,
        panSpeed;
    bool noRotate,
         noZoom,
         noPan,
         noRoll;
    bool staticMoving;
    num dynamicDampingFactor;
    num minDistance, maxDistance;
  