moveTo(options) {
    if (options === undefined) {
      options = {};
      return;
    }

    if (options.offset != null) {
      if (options.offset.x != null) {
        // Coerce and verify that x is valid.
        options.offset.x = +options.offset.x;
        if (!Number.isFinite(options.offset.x)) {
          throw new TypeError(
            'The option "offset.x" has to be a finite number.'
          );
        }
      } else {
        options.offset.x = 0;
      }

      if (options.offset.y != null) {
        // Coerce and verify that y is valid.
        options.offset.y = +options.offset.y;
        if (!Number.isFinite(options.offset.y)) {
          throw new TypeError(
            'The option "offset.y" has to be a finite number.'
          );
        }
      } else {
        options.offset.x = 0;
      }
    } else {
      options.offset = {
        x: 0,
        y: 0,
      };
    }

    if (options.position != null) {
      if (options.position.x != null) {
        // Coerce and verify that x is valid.
        options.position.x = +options.position.x;
        if (!Number.isFinite(options.position.x)) {
          throw new TypeError(
            'The option "position.x" has to be a finite number.'
          );
        }
      } else {
        options.position.x = 0;
      }

      if (options.position.y != null) {
        // Coerce and verify that y is valid.
        options.position.y = +options.position.y;
        if (!Number.isFinite(options.position.y)) {
          throw new TypeError(
            'The option "position.y" has to be a finite number.'
          );
        }
      } else {
        options.position.x = 0;
      }
    } else {
      options.position = this.getViewPosition();
    }

    if (options.scale != null) {
      // Coerce and verify that the scale is valid.
      options.scale = +options.scale;
      if (!(options.scale > 0)) {
        throw new TypeError(
          'The option "scale" has to be a number greater than zero.'
        );
      }
    } else {
      options.scale = this.body.view.scale;
    }

    if (options.animation === undefined) {
      options.animation = { duration: 0 };
    }
    if (options.animation === false) {
      options.animation = { duration: 0 };
    }
    if (options.animation === true) {
      options.animation = {};
    }
    if (options.animation.duration === undefined) {
      options.animation.duration = 1000;
    } // default duration
    if (options.animation.easingFunction === undefined) {
      options.animation.easingFunction = "easeInOutQuad";
    } // default easing function

    this.animateView(options);
  }
@param {object} options  |  options.offset   = {x:number, y:number}   // offset from the center in DOM pixels
                         |  options.scale    = number                 // scale to move to
                         |  options.position = {x:number, y:number}   // position to move to
                         |  options.animation = {duration:number, easingFunction:String} || Boolean   // position to move to