Esempio n. 1
0
        public void Update(TimeSpan delta)
        {
            fnum++;


            UpdateRotateTarget(delta);
            rigRotate = DampS(rigRotate, targetRigRotate, SmoothSpeed, (float)delta.TotalSeconds);
            UpdateLookAhead(delta);

            var rigTransform       = Matrix4.CreateFromQuaternion(rigRotate) * Matrix4.CreateTranslation(ChasePosition); //Camera Rig
            var lookAheadTransform = Matrix4.CreateFromQuaternion(lookAhead);                                            //LookAhead Rig
            var camTransform       = Matrix4.CreateTranslation(DesiredPositionOffset);

            Vector3 lookAheadPosition = ChasePosition + ChaseOrientation.Transform(Vector3.Forward * 100);
            var     lookAheadStack    = lookAheadTransform * rigTransform;
            var     lookAheadRigUp    = CalcDir(ref lookAheadStack, Vector3.Up);

            var transformStack = camTransform * lookAheadTransform * rigTransform;
            var camRotation    = Matrix4.CreateFromQuaternion(Quaternion.LookRotation(ChasePosition - lookAheadPosition, lookAheadRigUp));
            var tr             = camRotation * Matrix4.CreateTranslation(transformStack.Transform(Vector3.Zero));

            //TODO: Finish with lookahead rig. there's some maths that go crazy there but it's needed to get this to work at all
            //var tr = transformStack;
            var v = tr;

            CameraUp = CalcDir(ref tr, Vector3.Up);
            Position = v.Transform(Vector3.Zero);
            v.Invert();
            View = v;

            _vpdirty = true;
        }
Esempio n. 2
0
        public void Reset()
        {
            UpdateWanted();
            Position = desiredPosition;
            Vector3 upVector = ChaseOrientation.Transform(Vector3.Up);

            View = Matrix4.LookAt(Position, lookAt, upVector);
        }
Esempio n. 3
0
        /// <summary>
        /// Allows the game component to update itself.
        /// </summary>
        public void Update(TimeSpan delta)
        {
            fnum++;

            UpdateWanted();
            Position = desiredPosition;
            View     = Matrix4.CreateTranslation(-Position) * ChaseOrientation.Inverted();
            _vpdirty = true;
        }
Esempio n. 4
0
 void UpdateRotateTarget(double delta)
 {
     if (MouseFlight)
     {
         var mat         = Matrix4x4.CreateFromQuaternion(rigRotate);
         var transformUp = CalcDir(ref mat, Vector3.UnitY);
         var orient      = ChaseOrientation;
         var shipFwd     = CalcDir(ref orient, Vector3.UnitZ);
         targetRigRotate = QuaternionEx.LookRotation(shipFwd, transformUp);
     }
     else
     {
         targetRigRotate = ChaseOrientation.ExtractRotation();
     }
 }
Esempio n. 5
0
        public void Update(TimeSpan delta)
        {
            fnum++;

            // Normalize screen positions so that the range is -1 to 1. Makes the math easier.
            var mouseScreenX = (MousePosition.X - (Viewport.Width * 0.5f)) / (Viewport.Width * 0.5f);
            var mouseScreenY = -(MousePosition.Y - (Viewport.Height * 0.5f)) / (Viewport.Height * 0.5f);

            // Clamp these screen position to make sure the rig doesn't oversteer.
            mouseScreenX = MathHelper.Clamp(mouseScreenX, -1f, 1f);
            mouseScreenY = MathHelper.Clamp(mouseScreenY, -1f, 1f);

            if (!MouseFlight)
            {
                mouseScreenX = mouseScreenY = 0;
            }

            float horizontal = 0f;
            float vertical   = 0f;

            horizontal = HorizontalTurnAngle * mouseScreenX;
            vertical   = (mouseScreenY < 0.0f) ? VerticalTurnUpAngle * mouseScreenY : VerticalTurnDownAngle * mouseScreenY;

            lookAhead = DampS(lookAhead, Quaternion.FromEulerAngles(MathHelper.DegreesToRadians(-vertical), MathHelper.DegreesToRadians(-horizontal), 0), SmoothSpeed, (float)delta.TotalSeconds);
            rigRotate = DampS(rigRotate, ChaseOrientation.ExtractRotation(), SmoothSpeed, (float)delta.TotalSeconds);


            var lookAheadPosition = ChaseOrientation.Transform(Vector3.Forward) * 100;

            var rigTransform       = Matrix4.CreateFromQuaternion(rigRotate) * Matrix4.CreateTranslation(ChasePosition);
            var lookAheadTransform = Matrix4.CreateFromQuaternion(lookAhead) * Matrix4.CreateTranslation(DesiredPositionOffset);

            var tr = lookAheadTransform * rigTransform;
            var lookAheadRigPos = tr.Transform(Vector3.Zero);

            var lookAtTr = Matrix4.CreateFromQuaternion(Quaternion.LookAt(lookAheadRigPos, lookAheadPosition));


            var v = tr;

            Position = v.Transform(Vector3.Zero);
            v.Invert();
            View = v;

            _vpdirty = true;
        }
Esempio n. 6
0
        /// <summary>
        /// Allows the game component to update itself.
        /// </summary>
        public void Update(TimeSpan delta)
        {
            fnum++;

            UpdateWanted();

            Vector3 stretch = Position - desiredPosition;
            Vector3 force   = -Stiffness * stretch - Damping * velocity;

            Vector3 acceleration = force / Mass;

            velocity += acceleration * (float)delta.TotalSeconds;

            Vector3 upVector = ChaseOrientation.Transform(Vector3.Up);

            Position += velocity * (float)delta.TotalSeconds;
            View      = Matrix4.LookAt(Position, lookAt, upVector);
            _vpdirty  = true;
        }
Esempio n. 7
0
 void UpdateWanted()
 {
     desiredPosition = ChasePosition + ChaseOrientation.Transform(DesiredPositionOffset);
     lookAt          = ChasePosition + ChaseOrientation.Transform(LookAtOffset);
 }
Esempio n. 8
0
 public void Reset()
 {
     lookAhead = Quaternion.Identity;
     rigRotate = ChaseOrientation.ExtractRotation();
 }