private static void AnimationFunction_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e) { Vector3DAnimation a = (Vector3DAnimation)d; a._isAnimationFunctionValid = false; a.PropertyChanged(e.Property); }
/// <summary> /// Animates the camera position and directions. /// </summary> /// <param name="camera"> /// The camera to animate. /// </param> /// <param name="newPosition"> /// The position to animate to. /// </param> /// <param name="newDirection"> /// The direction to animate to. /// </param> /// <param name="newUpDirection"> /// The up direction to animate to. /// </param> /// <param name="animationTime"> /// Animation time in milliseconds. /// </param> public static void AnimateTo( this Camera camera, Point3D newPosition, Vector3D newDirection, Vector3D newUpDirection, double animationTime) { var projectionCamera = camera as ProjectionCamera; if (projectionCamera == null) { return; } var fromPosition = projectionCamera.Position; var fromDirection = projectionCamera.LookDirection; var fromUpDirection = projectionCamera.UpDirection; projectionCamera.Position = newPosition; projectionCamera.LookDirection = newDirection; projectionCamera.UpDirection = newUpDirection; if (animationTime > 0) { var a1 = new Point3DAnimation( fromPosition, newPosition, new Duration(TimeSpan.FromMilliseconds(animationTime))) { AccelerationRatio = 0.3, DecelerationRatio = 0.5, FillBehavior = FillBehavior.Stop }; a1.Completed += (s, a) => { camera.BeginAnimation(ProjectionCamera.PositionProperty, null); }; camera.BeginAnimation(ProjectionCamera.PositionProperty, a1); var a2 = new Vector3DAnimation( fromDirection, newDirection, new Duration(TimeSpan.FromMilliseconds(animationTime))) { AccelerationRatio = 0.3, DecelerationRatio = 0.5, FillBehavior = FillBehavior.Stop }; a2.Completed += (s, a) => { camera.BeginAnimation(ProjectionCamera.LookDirectionProperty, null); }; camera.BeginAnimation(ProjectionCamera.LookDirectionProperty, a2); var a3 = new Vector3DAnimation( fromUpDirection, newUpDirection, new Duration(TimeSpan.FromMilliseconds(animationTime))) { AccelerationRatio = 0.3, DecelerationRatio = 0.5, FillBehavior = FillBehavior.Stop }; a3.Completed += (s, a) => { camera.BeginAnimation(ProjectionCamera.UpDirectionProperty, null); }; camera.BeginAnimation(ProjectionCamera.UpDirectionProperty, a3); } }
public void PlayAnimation(bool random = true) { if (!AllowAnimation) return; var storyboard = new Storyboard(); var pa = new Point3DAnimation() { Duration = TimeSpan.FromMilliseconds(600), To = new Point3D(0, 0, 800) }; Storyboard.SetTarget(pa, this); Storyboard.SetTargetProperty(pa, new PropertyPath(CameraPoint3DProperty)); storyboard.Children.Add(pa); var aa = new Vector3DAnimation() { Duration = new Duration(TimeSpan.FromMilliseconds(1500)), To = AnimationHelper.GetNextVector3D() }; Storyboard.SetTarget(aa, this); Storyboard.SetTargetProperty(aa, new PropertyPath(AxisProperty)); storyboard.Children.Add(aa); angle += AnimationHelper.GetNextBool() ? 360d : -360d; //angle += AnimationHelper.GetNextAngle(); var da = new DoubleAnimation { Duration = new Duration(TimeSpan.FromMilliseconds(3000)), To = angle }; Storyboard.SetTarget(da, this); Storyboard.SetTargetProperty(da, new PropertyPath(AngleProperty)); storyboard.Children.Add(da); var paEnd = new Point3DAnimation() { Duration = TimeSpan.FromMilliseconds(600), To = new Point3D(0, 0, 500), BeginTime = TimeSpan.FromMilliseconds(2400) }; Storyboard.SetTarget(paEnd, this); Storyboard.SetTargetProperty(paEnd, new PropertyPath(CameraPoint3DProperty)); storyboard.Children.Add(paEnd); var aaEnd = new Vector3DAnimation() { Duration = new Duration(TimeSpan.FromMilliseconds(1500)), To = new Vector3D(0, 1, 0), BeginTime = TimeSpan.FromMilliseconds(1500) }; Storyboard.SetTarget(aaEnd, this); Storyboard.SetTargetProperty(aaEnd, new PropertyPath(AxisProperty)); storyboard.Children.Add(aaEnd); if (random) { da.EasingFunction = AnimationHelper.GetEasingFunction(); pa.EasingFunction = AnimationHelper.GetEasingFunction(); paEnd.EasingFunction = AnimationHelper.GetEasingFunction(); aa.EasingFunction = AnimationHelper.GetEasingFunction(); aaEnd.EasingFunction = AnimationHelper.GetEasingFunction(); } else { var easing = new BackEase() {EasingMode = EasingMode.EaseInOut, Amplitude = 0.8}; da.EasingFunction = easing; pa.EasingFunction = easing; paEnd.EasingFunction = easing; aa.EasingFunction = easing; aaEnd.EasingFunction = easing; } storyboard.Begin(this); }
public void PlayAnimation(bool random = true) { var storyboard = new Storyboard(); var temp = AnimationHelper.GetNextInterval(1, 4); angel += AnimationHelper.GetNextBool() ? temp*90d : -temp*90d; var da = new DoubleAnimation { Duration = new Duration(TimeSpan.FromMilliseconds(1000 + 800 * temp)), To = angel }; storyboard.Children.Add(da); Storyboard.SetTarget(da, this); Storyboard.SetTargetProperty(da, new PropertyPath(AngleProperty)); var paStart = new Point3DAnimation() { Duration = new Duration(TimeSpan.FromMilliseconds(1000)), To = new Point3D(0, 0, 1000) }; storyboard.Children.Add(paStart); Storyboard.SetTarget(paStart, this); Storyboard.SetTargetProperty(paStart, new PropertyPath(CameraPoint3DProperty)); var color = new ColorAnimation() { Duration = new Duration(TimeSpan.FromMilliseconds(1000)), To = Color.FromArgb(0x11, 0, 0 ,0) }; storyboard.Children.Add(color); Storyboard.SetTarget(color, this); Storyboard.SetTargetProperty(color, new PropertyPath(MonthColorProperty)); var axis = new Vector3DAnimation() { Duration = new Duration(TimeSpan.FromMilliseconds(500 + 400 * temp)), To = AnimationHelper.GetNextVector3D() }; storyboard.Children.Add(axis); Storyboard.SetTarget(axis, this); Storyboard.SetTargetProperty(axis, new PropertyPath(AxisProperty)); var paEnd = new Point3DAnimation { Duration = new Duration(TimeSpan.FromMilliseconds(1000)), To = new Point3D(0, 0, 560), BeginTime = TimeSpan.FromMilliseconds(800 * temp) }; storyboard.Children.Add(paEnd); Storyboard.SetTarget(paEnd, this); Storyboard.SetTargetProperty(paEnd, new PropertyPath(CameraPoint3DProperty)); var colorBack = new ColorAnimation { Duration = new Duration(TimeSpan.FromMilliseconds(1000)), To = Colors.Transparent, BeginTime = TimeSpan.FromMilliseconds(800 * temp) }; storyboard.Children.Add(colorBack); Storyboard.SetTarget(colorBack, this); Storyboard.SetTargetProperty(colorBack, new PropertyPath(MonthColorProperty)); var axisBack = new Vector3DAnimation() { Duration = new Duration(TimeSpan.FromMilliseconds(500 + 400 * temp)), To = new Vector3D(0, 1, 0), BeginTime = TimeSpan.FromMilliseconds(500 + 400 * temp) }; storyboard.Children.Add(axisBack); Storyboard.SetTarget(axisBack, this); Storyboard.SetTargetProperty(axisBack, new PropertyPath(AxisProperty)); if (random) { da.EasingFunction = AnimationHelper.GetEasingFunction(); paStart.EasingFunction = AnimationHelper.GetEasingFunction(); color.EasingFunction = paStart.EasingFunction; paEnd.EasingFunction = AnimationHelper.GetEasingFunction(); colorBack.EasingFunction = paEnd.EasingFunction; } else { var e = new BackEase() { EasingMode = EasingMode.EaseInOut, Amplitude = 0.8 }; da.EasingFunction = e; paStart.EasingFunction = e; paEnd.EasingFunction = e; color.EasingFunction = e; colorBack.EasingFunction = e; } storyboard.Begin(); }
/// <summary> /// Animates the camera position and direction /// </summary> /// <param name="camera">Camera</param> /// <param name="newPosition">The position to animate to</param> /// <param name="newDirection">The direction to animate to</param> /// <param name="newUpDirection">The up direction to animate to</param> /// <param name="animationTime">Animation time in milliseconds</param> public static void AnimateTo(ProjectionCamera camera, Point3D newPosition, Vector3D newDirection, Vector3D newUpDirection, double animationTime) { var fromPosition = camera.Position; var fromDirection = camera.LookDirection; var fromUpDirection = camera.UpDirection; camera.Position = newPosition; camera.LookDirection = newDirection; camera.UpDirection = newUpDirection; if (animationTime > 0) { var a1 = new Point3DAnimation(fromPosition, newPosition, new Duration(TimeSpan.FromMilliseconds(animationTime))) { AccelerationRatio = 0.3, DecelerationRatio = 0.5, FillBehavior = FillBehavior.Stop }; camera.BeginAnimation(ProjectionCamera.PositionProperty, a1); var a2 = new Vector3DAnimation(fromDirection, newDirection, new Duration(TimeSpan.FromMilliseconds(animationTime))) { AccelerationRatio = 0.3, DecelerationRatio = 0.5, FillBehavior = FillBehavior.Stop }; camera.BeginAnimation(ProjectionCamera.LookDirectionProperty, a2); var a3 = new Vector3DAnimation(fromUpDirection, newUpDirection, new Duration(TimeSpan.FromMilliseconds(animationTime))) { AccelerationRatio = 0.3, DecelerationRatio = 0.5, FillBehavior = FillBehavior.Stop }; camera.BeginAnimation(ProjectionCamera.UpDirectionProperty, a3); } }
private void DrawSomeModels() { myViewport.Name = "myViewport"; ModelVisual3D myModelVisual = new ModelVisual3D(); //Define lights and cameras myPCamera.FarPlaneDistance = 20; myPCamera.NearPlaneDistance = 0; myPCamera.FieldOfView = 50; myPCamera.Position = new Point3D(-5, 2, 3); myPCamera.LookDirection = new Vector3D(5, -2, -3); myPCamera.UpDirection = new Vector3D(0, 1, 0); myDLight.Color = Colors.White; myDLight.Direction = new Vector3D(-3, -4, -5); myAmbLight.Color = Colors.White; //set Geometry property of MeshGeometry3D side2.Geometry = side2Plane; side6.Geometry = side6Plane; side1.Geometry = side1Plane; side3.Geometry = side3Plane; side4.Geometry = side4Plane; side5.Geometry = side5Plane; //create translations TranslateTransform3D cube2Translation = new TranslateTransform3D(new Vector3D(2, 0, 0)); TranslateTransform3D cube3Translation = new TranslateTransform3D(new Vector3D(4, 0, 0)); //Define a rotation RotateTransform3D myRotateTransform = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0), 1)); //Define an animation for the rotation DoubleAnimation myAnimation = new DoubleAnimation(); myAnimation.From = 1; myAnimation.To = 361; myAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(5000)); myAnimation.RepeatBehavior = RepeatBehavior.Forever; //Define another animation Vector3DAnimation myVectorAnimation = new Vector3DAnimation(new Vector3D(-1, -1, -1), new Duration(TimeSpan.FromMilliseconds(5000))); myVectorAnimation.RepeatBehavior = RepeatBehavior.Forever; myRotateTransform.Rotation.BeginAnimation(AxisAngleRotation3D.AngleProperty, myAnimation); myRotateTransform.Rotation.BeginAnimation(AxisAngleRotation3D.AxisProperty, myVectorAnimation); //Add transformation to the model cube1TransformGroup.Children.Add(myRotateTransform); cube2TransformGroup.Children.Add(myRotateTransform); cube2TransformGroup.Children.Add(cube2Translation); cube3TransformGroup.Children.Add(myRotateTransform); cube3TransformGroup.Children.Add(cube3Translation); allModelsTransformGroup.Children.Add(myRotateTransform); cubeModel_1.Children.Add(side1); cubeModel_1.Children.Add(side2); cubeModel_1.Children.Add(side3); cubeModel_1.Children.Add(side4); cubeModel_1.Children.Add(side5); cubeModel_1.Children.Add(side6); cubeModel_1.Transform = cube1TransformGroup; cubeModel_2.Children.Add(side1); cubeModel_2.Children.Add(side2); cubeModel_2.Children.Add(side3); cubeModel_2.Children.Add(side4); cubeModel_2.Children.Add(side5); cubeModel_2.Children.Add(side6); cubeModel_2.Transform = cube2TransformGroup; cubeModel_3.Children.Add(side1); cubeModel_3.Children.Add(side2); cubeModel_3.Children.Add(side3); cubeModel_3.Children.Add(side4); cubeModel_3.Children.Add(side5); cubeModel_3.Children.Add(side6); cubeModel_3.Transform = cube3TransformGroup; allModels.Transform = allModelsTransformGroup; allModels.Children.Add(cubeModel_3); allModels.Children.Add(cubeModel_2); allModels.Children.Add(cubeModel_1); allModels.Children.Add(myAmbLight); myViewport.Camera = myPCamera; myModelVisual.Content = allModels; myViewport.Children.Add(myModelVisual); mainWindow.Content = myViewport; }