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; } } }
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; } } }
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()); } }