public void Update(double delta) { fnum++; UpdateRotateTarget(delta); rigRotate = DampS(rigRotate, targetRigRotate, SmoothSpeed, (float)delta); UpdateLookAhead(delta); var rigTransform = Matrix4x4.CreateFromQuaternion(rigRotate) * Matrix4x4.CreateTranslation(ChasePosition); //Camera Rig var lookAheadTransform = Matrix4x4.CreateFromQuaternion(lookAhead); //LookAhead Rig var camTransform = Matrix4x4.CreateTranslation(DesiredPositionOffset); Vector3 lookAheadPosition = ChasePosition + Vector3.Transform(-Vector3.UnitZ * 100, ChaseOrientation); var lookAheadStack = lookAheadTransform * rigTransform; var lookAheadRigUp = CalcDir(ref lookAheadStack, Vector3.UnitY); var transformStack = camTransform * lookAheadTransform * rigTransform; var camRotation = Matrix4x4.CreateFromQuaternion(QuaternionEx.LookRotation(ChasePosition - lookAheadPosition, lookAheadRigUp)); var tr = camRotation * Matrix4x4.CreateTranslation(Vector3.Transform(Vector3.Zero, transformStack)); //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.UnitY); CameraForward = CalcDir(ref tr, -Vector3.UnitZ); Position = Vector3.Transform(Vector3.Zero, tr); Matrix4x4.Invert(v, out v); View = v; _vpdirty = true; }
void Process(float t) { float pct = MathHelper.Lerp(StartPercent, StopPercent, t); var path = Path.Entity.Path; var mat = Path.Rotate * Matrix4x4.CreateTranslation(Path.Translate); var pos = Vector3.Transform(path.GetPosition(pct) + Offset, mat); if ((Flags & AttachFlags.LookAt) == AttachFlags.LookAt) { var orient = Matrix4x4.CreateFromQuaternion(QuaternionEx.LookRotation(path.GetDirection(pct, StartPercent > StopPercent), Vector3.UnitY)) * Path.Rotate; if ((Flags & AttachFlags.Position) == AttachFlags.Position) { SetPositionOrientation(pos, orient); } else { SetOrientation(orient); } } else if ((Flags & AttachFlags.Orientation) == AttachFlags.Orientation) { var orient = Path.Rotate * Matrix4x4.CreateFromQuaternion(path.GetOrientation(pct)); SetOrientation(orient); if ((Flags & AttachFlags.Position) == AttachFlags.Position) { SetPosition(pos); } } else if ((Flags & AttachFlags.Position) == AttachFlags.Position) { SetPosition(pos); } }
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(); } }