Exemplo n.º 1
0
        /*
         * Returns false if camera didn't move
         */
        private bool ComputeCameraMovement()
        {
            var frameDurationFactor = (float)(App.Current.TimeSinceLastFrame) / FRAME_DURATION_AT_60_FPS;

            if (PositionDistance.Length() > STOP_DISTANCE_THRESHOLD ||
                TargetDistance.Length() > STOP_DISTANCE_THRESHOLD ||
                MoveVelocity.Length() > STOP_DISTANCE_THRESHOLD ||
                _lookingAroundDelta.Length() > STOP_DISTANCE_THRESHOLD ||
                _manipulatedByMouseWheel ||
                _orbitDelta.Length() > 0.001f ||
                _manipulatedByKeyboard)
            {
                if (_orbitDelta.Length() > 0.001f)
                {
                    OrbitByAngle(_orbitDelta);
                    _orbitDelta *= new Vector2(ORBIT_HORIZONTAL_FRICTION, ORBIT_VERTICAL_FRICTION) / frameDurationFactor;
                }

                if (MoveVelocity.Length() > MaxMoveVelocity)
                {
                    MoveVelocity *= MaxMoveVelocity / MoveVelocity.Length();
                }
                else if (!_manipulatedByKeyboard)
                {
                    MoveVelocity *= (1 - _frictionKeyboardManipulation) / frameDurationFactor;
                }

                _cameraPositionGoal += MoveVelocity;
                _cameraTargetGoal   += MoveVelocity + _lookingAroundDelta;
                _lookingAroundDelta  = Vector3.Zero;

                PositionDistance *= CAMERA_MOVE_FRICTION / frameDurationFactor;
                TargetDistance   *= CAMERA_MOVE_FRICTION / frameDurationFactor;

                _isTransitionActive      = true;
                _manipulatedByMouseWheel = false;
                return(true);
            }
            else
            {
                StopTransitionOfPositionTarget();
                _isTransitionActive = false;
                return(false);
            }
        }
Exemplo n.º 2
0
        private bool ManipulateCameraByKeyboard()
        {
            var frameDurationFactor = (float)(App.Current.TimeSinceLastFrame);

            Vector3 viewDir, sideDir, upDir;

            _showSceneControl.RenderSetup.CalcDirections(out viewDir, out sideDir, out upDir);

            var viewDirLength   = viewDir.Length();
            var initialVelocity = MoveVelocity.Length() < STOP_DISTANCE_THRESHOLD ? INITIAL_MOVE_VELOCITY : 0;

            var increaseAccelerationWithZoom = (_cameraPositionGoal - _cameraTargetGoal).Length() / 10f;
            var accelFactor = _cameraAcceleration * increaseAccelerationWithZoom;

            var interactionKeysPressedCount = 0;

            foreach (var key in _pressedKeys)
            {
                switch (key)
                {
                case Key.A:
                case Key.Left:
                    MoveVelocity -= sideDir * (accelFactor + initialVelocity) * frameDurationFactor;
                    interactionKeysPressedCount++;
                    break;

                case Key.D:
                case Key.Right:
                    MoveVelocity += sideDir * (accelFactor + initialVelocity) * frameDurationFactor;
                    interactionKeysPressedCount++;
                    break;

                case Key.W:
                case Key.Up:
                    MoveVelocity += viewDir * (accelFactor + initialVelocity) / viewDirLength * frameDurationFactor;
                    interactionKeysPressedCount++;
                    break;

                case Key.S:
                case Key.Down:
                    MoveVelocity -= viewDir * (accelFactor + initialVelocity) / viewDirLength * frameDurationFactor;
                    interactionKeysPressedCount++;
                    break;

                case Key.E:
                    MoveVelocity += upDir * (accelFactor + initialVelocity) * frameDurationFactor;
                    interactionKeysPressedCount++;
                    break;

                case Key.X:
                    MoveVelocity -= upDir * (accelFactor + initialVelocity) * frameDurationFactor;
                    interactionKeysPressedCount++;
                    break;

                case Key.F:
                    MoveVelocity        = Vector3.Zero;
                    _cameraPositionGoal = new Vector3(0, 0, DEFAULT_CAMERA_POSITION_Z);
                    _cameraTargetGoal   = new Vector3(0, 0, 0f);
                    interactionKeysPressedCount++;
                    break;

                // Center Camera
                case Key.C:
                    var delta = _showSceneControl.RenderSetup.TransformGizmo.IsGizmoActive
                            ? _showSceneControl.RenderSetup.TransformGizmo.GizmoToWorld.TranslationVector - _cameraTargetGoal
                            : -_cameraTargetGoal;

                    _cameraTargetGoal   += delta;
                    _cameraPositionGoal += delta;
                    interactionKeysPressedCount++;
                    break;
                }
            }
            return(interactionKeysPressedCount > 0);
        }