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; }
public void Reset() { UpdateWanted(); Position = desiredPosition; Vector3 upVector = ChaseOrientation.Transform(Vector3.Up); View = Matrix4.LookAt(Position, lookAt, upVector); }
/// <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; }
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(); } }
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; }
/// <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; }
void UpdateWanted() { desiredPosition = ChasePosition + ChaseOrientation.Transform(DesiredPositionOffset); lookAt = ChasePosition + ChaseOrientation.Transform(LookAtOffset); }
public void Reset() { lookAhead = Quaternion.Identity; rigRotate = ChaseOrientation.ExtractRotation(); }