Exemple #1
0
        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);
        }
Exemple #3
0
        ///<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);
            }
        }
Exemple #5
0
 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);
            }
        }
Exemple #8
0
        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;
        }