Ejemplo n.º 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;
                }
            }
        }