Exemple #1
0
        private void CameraOrient(Direction?d)
        {
            PerspectiveCamera camera = (PerspectiveCamera)_viewport.Camera;

            if (d == null)
            {
                // Stops the animation

                // testing _cameraOrienting is not reliable
                // if (_cameraOrienting && _viewport.Camera.HasAnimatedProperties)
                if (_viewport.Camera.HasAnimatedProperties)
                {
                    Vector3D currentDirection = camera.LookDirection;
                    camera.ApplyAnimationClock(PerspectiveCamera.LookDirectionProperty, null);
                    camera.LookDirection = currentDirection;
                    //_cameraOrienting = false;
                }
            }
            else
            {
                Vector3D v  = camera.LookDirection;
                Vector3D vY = new Vector3D(0.0, 1.0, 0.0);
                Vector3D vRelativeHorizontalAxis = Vector3D.CrossProduct(v, vY);
                Vector3D vRelativeVerticalAxis   = Vector3D.CrossProduct(v, vRelativeHorizontalAxis);

                double targetAngle = 45.0; // MUST be under 90.0 (if 90.0, Forward and Forward|Left have the same target vector)

                // this code supports direction combinations
                if ((d & Direction.Forward) == Direction.Forward)
                {
                    v = Helper3D.RotateVector(v, targetAngle, vRelativeHorizontalAxis);
                }
                if ((d & Direction.Backward) == Direction.Backward)
                {
                    v = Helper3D.RotateVector(v, -targetAngle, vRelativeHorizontalAxis);
                }
                if ((d & Direction.Left) == Direction.Left)
                {
                    v = Helper3D.RotateVector(v, -targetAngle, vRelativeVerticalAxis);
                }
                if ((d & Direction.Right) == Direction.Right)
                {
                    v = Helper3D.RotateVector(v, targetAngle, vRelativeVerticalAxis);
                }

                if (v != camera.LookDirection)
                {
                    _cameraLookDirectionAnimation.To = v;
                    camera.ApplyAnimationClock(PerspectiveCamera.LookDirectionProperty, _cameraLookDirectionAnimation.CreateClock());
                    //_cameraOrienting = true;
                }
            }
        }
Exemple #2
0
        private void CameraZoom(Direction?d)
        {
            PerspectiveCamera camera = (PerspectiveCamera)_viewport.Camera;

            if (d == null)
            {
                // Stops the animation

                // testing _cameraZooming is not reliable
                // if (_cameraZooming && _viewport.Camera.HasAnimatedProperties)
                if (_viewport.Camera.HasAnimatedProperties)
                {
                    double fieldOfView = camera.FieldOfView;
                    camera.ApplyAnimationClock(PerspectiveCamera.FieldOfViewProperty, null);
                    camera.FieldOfView = fieldOfView;
                    //_cameraZooming = false;
                }
            }
            else
            {
                // PerspectiveCamera.FieldOfView must be between 0 and 180 degrees
                if (d == Direction.Forward)
                {
                    _cameraZoomAnimation.To = 0.1;
                }
                else if (d == Direction.Backward)
                {
                    _cameraZoomAnimation.To = 179.9;
                }
                if ((d == Direction.Forward) ||
                    (d == Direction.Backward))
                {
                    camera.ApplyAnimationClock(PerspectiveCamera.FieldOfViewProperty, _cameraZoomAnimation.CreateClock());
                    //_cameraZooming = true;
                }
            }
        }
Exemple #3
0
        private void CameraTranslate(Direction?d)
        {
            PerspectiveCamera camera = (PerspectiveCamera)_viewport.Camera;

            if (d == null)
            {
                // Stops the animation

                // testing _cameraTranslating is not reliable
                // if (_cameraTranslating && camera.HasAnimatedProperties)

                if (camera.HasAnimatedProperties)
                {
                    Point3D currentPosition = camera.Position;
                    camera.ApplyAnimationClock(PerspectiveCamera.PositionProperty, null);
                    camera.Position = currentPosition;
                    // _cameraTranslating = false;
                }
            }
            else
            {
                Vector3D v  = camera.LookDirection;
                Vector3D vY = new Vector3D(0.0, 1.0, 0.0);
                Vector3D vRelativeHorizontalAxis = Vector3D.CrossProduct(v, vY);
                Vector3D vRelativeVerticalAxis   = Vector3D.CrossProduct(v, vRelativeHorizontalAxis);

                if (d != Direction.Forward)
                {
                    AxisAngleRotation3D rotation = new AxisAngleRotation3D();
                    switch (d)
                    {
                    case Direction.Forward | Direction.Left:
                        rotation.Axis  = vRelativeVerticalAxis;
                        rotation.Angle = -45.0;
                        break;

                    case Direction.Left:
                        rotation.Axis  = vRelativeVerticalAxis;
                        rotation.Angle = -90.0;
                        break;

                    case Direction.Backward | Direction.Left:
                        rotation.Axis  = vRelativeVerticalAxis;
                        rotation.Angle = -135.0;
                        break;

                    case Direction.Backward:
                        rotation.Axis  = vRelativeVerticalAxis;
                        rotation.Angle = 180.0;
                        break;

                    case Direction.Backward | Direction.Right:
                        rotation.Axis  = vRelativeVerticalAxis;
                        rotation.Angle = 135.0;
                        break;

                    case Direction.Right:
                        rotation.Axis  = vRelativeVerticalAxis;
                        rotation.Angle = 90.0;
                        break;

                    case Direction.Forward | Direction.Right:
                        rotation.Axis  = vRelativeVerticalAxis;
                        rotation.Angle = 45.0;
                        break;

                    case Direction.Up:
                        rotation.Axis  = vRelativeHorizontalAxis;
                        rotation.Angle = 90.0;
                        break;

                    case Direction.Down:
                        rotation.Axis  = vRelativeHorizontalAxis;
                        rotation.Angle = -90.0;
                        break;
                    }
                    RotateTransform3D transform = new RotateTransform3D(rotation);
                    v = transform.Transform(camera.LookDirection);
                }
                Point3D p = new Point3D(v.X, v.Y, v.Z);
                _cameraPositionAnimation.By = p;
                //_cameraTranslating = true;
                camera.ApplyAnimationClock(PerspectiveCamera.PositionProperty, _cameraPositionAnimation.CreateClock());
            }
        }