onTriplePanMove method

void onTriplePanMove(
  1. dynamic event
)

Implementation

void onTriplePanMove(event) {
  if (enabled && enableZoom) {
    //	  fov / 2
    //		|\
    //		| \
    //		|  \
    //	x	|	\
    //		| 	 \
    //		| 	  \
    //		| _ _ _\
    //			y

    //final center = event.center;
    num clientX = 0;
    num clientY = 0;
    final nFingers = _touchCurrent.length;

    for (int i = 0; i < nFingers; i++) {
      clientX += _touchCurrent[i].clientX;
      clientY += _touchCurrent[i].clientY;
    }

    setCenter(clientX / nFingers, clientY / nFingers);

    const screenNotches = 8; //how many wheel notches corresponds to a full screen pan
    _currentCursorPosition.setY(
        getCursorNDC(_center.x, _center.y).y * 0.5);

    final movement =
        _currentCursorPosition.y - _startCursorPosition.y;

    double size = 1;

    if (movement < 0) {
      size = 1 / (math.pow(scaleFactor, -movement * screenNotches));
    }
    else if (movement > 0) {
      size = math.pow(scaleFactor, movement * screenNotches).toDouble();
    }

    _v3_1.setFromMatrixPosition(_cameraMatrixState);
    final x = _v3_1.distanceTo(_gizmos.position);
    double xNew = x /size; //distance between camera and gizmos if scale(size, scalepoint) would be performed

    //check min and max distance
    xNew = MathUtils.clamp(xNew, minDistance, maxDistance);

    final y = x * math.tan(MathUtils.deg2rad * _fovState * 0.5);

    //calculate fov
    double newFov = MathUtils.rad2deg * (math.atan(y / xNew) * 2);

    //check min and max fov
    newFov = MathUtils.clamp(newFov, minFov, maxFov);

    final newDistance = y / math.tan(MathUtils.deg2rad * (newFov / 2));
    size = x / newDistance;
    _v3_2.setFromMatrixPosition(_gizmoMatrixState);

    setFov(newFov);
    applyTransformMatrix(scale(size, _v3_2, false));

    //adjusting distance
    _offset
        .setFrom(_gizmos.position)
        .sub(camera.position)
        .normalize()
        .scale(newDistance / x);
    _m4_1.makeTranslation(_offset.x, _offset.y, _offset.z);

    dispatchEvent(_changeEvent);
  }
}