focusOnCoordinates method

void focusOnCoordinates(
  1. GlobeCoordinates coordinates, {
  2. required bool animate,
  3. required Duration? duration,
  4. Curve curve = Curves.linear,
})

Focus on the specified coordinates on the sphere.

Implementation

void focusOnCoordinates(GlobeCoordinates coordinates,
    {required bool animate,
    required Duration? duration,
    Curve curve = Curves.linear}) {
  double latRad = radians(coordinates.latitude);
  double lonRad = radians(-coordinates.longitude);
  final targetRotationZ = -lonRad;
  final targetRotationY = -latRad;
  final targetRotationX = latRad;
  if (animate) {
    final initialRotationZ = rotationZ;
    final initialRotationX = rotationX;
    final initialRotationY = rotationY;

    final rZ = targetRotationZ - initialRotationZ;
    final rX = targetRotationX - initialRotationX;
    final rY = targetRotationY - initialRotationY;

    _genericCurvedAnimation?.dispose();
    genericAnimationController?.dispose();
    genericAnimationController = AnimationController(
      vsync: this,
      duration: duration,
    );
    _genericCurvedAnimation = CurvedAnimation(
      parent: genericAnimationController!,
      curve: curve,
    );
    _genericCurvedAnimation!.addListener(() {
      double animationFactor = _genericCurvedAnimation!.value;
      rotationX = initialRotationX + rX * animationFactor;
      rotationY = initialRotationY + rY * animationFactor;
      rotationZ = initialRotationZ + rZ * animationFactor;

      setState(() {});
    });
    genericAnimationController!.forward();
  } else {
    rotationX = targetRotationX;
    rotationY = targetRotationY;
    rotationZ = targetRotationZ;
    setState(() {});
  }
}