private void Viewport3D_MouseWheel(object sender, MouseWheelEventArgs e) { double scaleFactor = 3; //120 near , -120 far System.Diagnostics.Debug.WriteLine(e.Delta.ToString()); Point3D currentPosition = camera.Position; Vector3D lookDirection = camera.LookDirection;//new Vector3D(camera.LookDirection.X, camera.LookDirection.Y, camera.LookDirection.Z); lookDirection.Normalize(); lookDirection *= scaleFactor; if (e.Delta == 120)//getting near { if ((currentPosition.X + lookDirection.X) * currentPosition.X > 0) { currentPosition += lookDirection; } } if (e.Delta == -120)//getting far { currentPosition -= lookDirection; } Point3DAnimation positionAnimation = new Point3DAnimation(); positionAnimation.BeginTime = new TimeSpan(0, 0, 0); positionAnimation.Duration = TimeSpan.FromMilliseconds(100); positionAnimation.To = currentPosition; positionAnimation.From = camera.Position; positionAnimation.Completed += new EventHandler(positionAnimation_Completed); camera.BeginAnimation(PerspectiveCamera.PositionProperty, positionAnimation, HandoffBehavior.Compose); }
public static void ZoomIn(PerspectiveCamera camera, double scaleFactor) { Point3D oldPosition = camera.Position; Vector3D currentLookDirection = camera.LookDirection; currentLookDirection.Normalize(); Vector3D positionChangeVector = currentLookDirection * scaleFactor; Point3D newPosition = oldPosition + positionChangeVector; Point3DAnimation positionAnimation = new Point3DAnimation(); positionAnimation.BeginTime = new TimeSpan(0, 0, 0); positionAnimation.Duration = TimeSpan.FromMilliseconds(100); positionAnimation.From = oldPosition; positionAnimation.To = newPosition; positionAnimation.Completed += (s, e) => { Point3D position = camera.Position; camera.BeginAnimation(ProjectionCamera.PositionProperty, null); camera.Position = position; }; camera.BeginAnimation(ProjectionCamera.PositionProperty, positionAnimation, HandoffBehavior.Compose); }
///<summary>计算当前状态下合适观察的相机位置</summary> public void moveCamera() { Point3D camPos, pcenter, orgPos; Vector3D camLookDir, camUpDir; Duration duration = TimeSpan.FromSeconds(1); savePos = camera.Position; saveLookDir = camera.LookDirection; saveUpDir = camera.UpDirection; //取得占用空间,计算中心点 double x, y, z; x = curSettle.RectVec.X; y = curSettle.RectVec.Y; z = curSettle.RectVec.Z; pcenter = new Point3D(x / 2, 0, z / 4); //if (x <= para.Limit.X) pcenter = new Point3D(0, pcenter.Y, pcenter.Z); //if (z <= para.Limit.Z) pcenter = new Point3D(pcenter.X, pcenter.Y, 0); if (z < y * 2) z = y * 2; if (z < x / 2) z = x / 2; matrix = Matrix3D.Identity; orgPos = new Point3D(pcenter.X, 0, z + y * 6.5); matrix.Translate(orgPos - savePos); matrix.RotateAt(new Quaternion(new Vector3D(1, 0, 0), -30), pcenter); matrix.RotateAt(new Quaternion(new Vector3D(0, 1, 0), 30), pcenter); camPos = matrix.Transform(orgPos); camLookDir = matrix.Transform(new Vector3D(0, 0, -1)); camUpDir = matrix.Transform(new Vector3D(0, 1, 0)); camPos = matrix.Transform(savePos); camLookDir = matrix.Transform(saveLookDir); camUpDir = matrix.Transform(saveUpDir); camera.Position = (camera.Transform as MatrixTransform3D).Transform(camera.Position); camera.LookDirection = (camera.Transform as MatrixTransform3D).Transform(camera.LookDirection); camera.UpDirection = (camera.Transform as MatrixTransform3D).Transform(camera.UpDirection); (camera.Transform as MatrixTransform3D).Matrix = Matrix3D.Identity; Point3DAnimation anipos = new Point3DAnimation(camera.Position, camPos, duration, FillBehavior.Stop); anipos.Completed += new EventHandler(anipos_Completed); Vector3DAnimation anilookdir = new Vector3DAnimation(camera.LookDirection, camLookDir, duration, FillBehavior.Stop); Vector3DAnimation aniupdir = new Vector3DAnimation(camera.UpDirection, camUpDir, duration, FillBehavior.Stop); camera.Position = camPos; camera.LookDirection = camLookDir; camera.UpDirection = camUpDir; camera.BeginAnimation(PerspectiveCamera.PositionProperty, anipos); camera.BeginAnimation(PerspectiveCamera.LookDirectionProperty, anilookdir); camera.BeginAnimation(PerspectiveCamera.UpDirectionProperty, aniupdir); }
/// <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( PerspectiveCamera 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); } }
public static void MoveVectorAnimation(this PerspectiveCamera camera, Vector3D vector, double scale, Duration duration) { camera.BeginAnimation(PerspectiveCamera.PositionProperty, new Point3DAnimation() { From = camera.Position, To = camera.Position + vector, Duration = duration }, HandoffBehavior.SnapshotAndReplace); }
/// <summary> /// Rotates the control in 3D space in the direction specified by the RotationDirection property /// over the amount of time specified by the AnimationLength property. Set the EasingMode property /// before calling this method to specify how the animated rotation should behave. /// </summary> public void Rotate() { if (!this.CanRotate) { throw new InvalidOperationException("You cannot call the Rotate method of ContentControl3D when CanRotate is set to false."); } if (_viewport == null) { throw new InvalidOperationException("The ContentControl3D's control template does not contain a Viewport3D whose name is PART_Viewport."); } if (_frontRotation == null) { throw new InvalidOperationException("The ContentControl3D's control template does not contain a Visual2DViewport3D with an AxisAngleRotation3D for the front side."); } if (_backRotation == null) { throw new InvalidOperationException("The ContentControl3D's control template does not contain a Visual2DViewport3D with an AxisAngleRotation3D for the back side."); } if (this.IsRotating) { return; } // Avoid trying to animate a frozen instance. if (_viewport.Camera.IsFrozen) { _viewport.Camera = this.CreateCamera(); } PerspectiveCamera camera = _viewport.Camera as PerspectiveCamera; // Create the animations. DoubleAnimation frontAnimation, backAnimation; this.PrepareForRotation(out frontAnimation, out backAnimation); Point3DAnimation cameraZoomAnim = this.CreateCameraAnimation(); // Start the animations. _frontRotation.BeginAnimation(AxisAngleRotation3D.AngleProperty, frontAnimation); _backRotation.BeginAnimation(AxisAngleRotation3D.AngleProperty, backAnimation); camera.BeginAnimation(PerspectiveCamera.PositionProperty, cameraZoomAnim); this.IsRotating = true; }
public void Rotate() { if (_isRotating) { ++_rotationRequests; return; } else { _isRotating = true; } if (_viewport != null) { // Find front rotation Viewport2DVisual3D backContentSurface = _viewport.Children[1] as Viewport2DVisual3D; RotateTransform3D backTransform = backContentSurface.Transform as RotateTransform3D; AxisAngleRotation3D backRotation = backTransform.Rotation as AxisAngleRotation3D; // Find back rotation Viewport2DVisual3D frontContentSurface = _viewport.Children[2] as Viewport2DVisual3D; RotateTransform3D frontTransform = frontContentSurface.Transform as RotateTransform3D; AxisAngleRotation3D frontRotation = frontTransform.Rotation as AxisAngleRotation3D; // Create a new camera each time, to avoid trying to animate a frozen instance. PerspectiveCamera camera = this.CreateCamera(); _viewport.Camera = camera; // Create animations. DoubleAnimation rotationAnim = new DoubleAnimation { Duration = new Duration(TimeSpan.FromMilliseconds(this.AnimationLength)), By = 180 }; Point3DAnimation cameraZoomAnim = new Point3DAnimation { To = new Point3D(0, 0, 2.5), Duration = new Duration(TimeSpan.FromMilliseconds(this.AnimationLength / 2)), AutoReverse = true }; cameraZoomAnim.Completed += this.OnRotationCompleted; // Start the animations. frontRotation.BeginAnimation(AxisAngleRotation3D.AngleProperty, rotationAnim); backRotation.BeginAnimation(AxisAngleRotation3D.AngleProperty, rotationAnim); camera.BeginAnimation(PerspectiveCamera.PositionProperty, cameraZoomAnim); } }
void ChangeUpDirection() { Vector3D newUpDirection = new Vector3D(0, 1, 0); if (this.currentUpDirection.X == 1) { newUpDirection = new Vector3D(0, 0, 1); } else if (this.currentUpDirection.Y == 1) { newUpDirection = new Vector3D(1, 0, 0); } else if (this.currentUpDirection.Z == 1) { newUpDirection = new Vector3D(0, 1, 0); } PerspectiveCamera camera = this.mainViewport.Camera as PerspectiveCamera; Vector3DAnimation animation = new Vector3DAnimation(currentUpDirection, newUpDirection, TimeSpan.FromMilliseconds(1000)); camera.BeginAnimation(PerspectiveCamera.UpDirectionProperty, animation); this.currentUpDirection = newUpDirection; }