protected override void Update(TimeSpan gameTime) { this.timeAcumulator += gameTime.TotalSeconds; double phase = this.timeAcumulator % Period; if (phase < StartPeriod) { this.Camera.Transform.LookAt(this.startLookAt); } else if (phase < EaseInPeriod) { float lerp = (float)((phase - StartPeriod) / StartPeriod); this.Camera.Transform.LookAt(Vector3.Lerp(this.startLookAt, this.endLookAt, lerp)); } else if (phase < EndPeriod) { this.Camera.Transform.LookAt(this.endLookAt); } else if (phase < EaseOutPeriod) { float lerp = (float)((phase - EndPeriod) / StartPeriod); lerp = (float)easing.Ease(lerp); this.Camera.Transform.LookAt(Vector3.Lerp(this.endLookAt, this.startLookAt, lerp)); } }
private static void OnTimerTick(RadCartesianChart chart) { CameraInfo cameraInfo = GetOrCreateCameraInfo(chart); double durationInSeconds = 1.5; Point targetOffset = new Point(100, -75); TimeSpan timeSpan = DateTime.Now - cameraInfo.initialAnimationDateTime; if (durationInSeconds < timeSpan.TotalSeconds) { cameraInfo.initialAnimationTimer.Stop(); cameraInfo.initialAnimationTimer = null; return; } double progress = timeSpan.TotalSeconds / durationInSeconds; EasingFunctionBase ease = new BackEase { EasingMode = EasingMode.EaseIn }; double easedProgress = ease.Ease(progress); double hOffset = easedProgress * targetOffset.X; ease = new CubicEase { EasingMode = EasingMode.EaseInOut }; easedProgress = ease.Ease(progress); double vOffset = easedProgress * targetOffset.Y; MoveCamera(chart, new Point(hOffset, vOffset)); }