public void Update(GameTime gameTime)
{
UpdateProjectionMatrix();
CameraPosition = DVector3.Transform(new DVector3(0, 0, CameraDistance), Rotation);
ViewMatrix = DMatrix.LookAtRH(CameraPosition, DVector3.Zero, DVector3.UnitY);
ViewMatrixWithTranslation = ViewMatrix;
ViewMatrix.TranslationVector = DVector3.Zero;
FinalCamPosition = CameraPosition;
if (CameraState == CameraStates.ViewToPoint) {
var mat = CalculateBasisOnSurface();
DVector3 lookAtPoint = mat.Up * EarthRadius;
double length = CameraDistance - EarthRadius;
var quat = DQuaternion.RotationAxis(DVector3.UnitY, ViewToPointYaw) * DQuaternion.RotationAxis(DVector3.UnitX, ViewToPointPitch);
var qRot = DMatrix.RotationQuaternion(quat);
var matrix = qRot * mat;
var pointOffset = DVector3.Transform(new DVector3(0, 0, length), matrix);
var camPoint = new DVector3(pointOffset.X, pointOffset.Y, pointOffset.Z) + lookAtPoint;
FinalCamPosition = camPoint;
ViewMatrix = DMatrix.LookAtRH(camPoint, lookAtPoint, mat.Up);
ViewMatrixWithTranslation = ViewMatrix;
ViewMatrix.TranslationVector = DVector3.Zero;
} else if (CameraState == CameraStates.FreeSurface) {
var mat = CalculateBasisOnSurface();
#region Input
// Update surface camera yaw and pitch
//if (input.IsKeyDown(Keys.RightButton)) {
// FreeSurfaceYaw += input.RelativeMouseOffset.X*0.0003;
// FreeSurfacePitch -= input.RelativeMouseOffset.Y*0.0003;
//
// input.IsMouseCentered = false;
// input.IsMouseHidden = true;
//}
//else {
// input.IsMouseCentered = false;
// input.IsMouseHidden = false;
//}
//if (Game.Keyboard.IsKeyDown(Input.Keys.Left)) FreeSurfaceYaw -= gameTime.ElapsedSec * 0.7;
//if (Game.Keyboard.IsKeyDown(Input.Keys.Right)) FreeSurfaceYaw += gameTime.ElapsedSec * 0.7;
//if (Game.Keyboard.IsKeyDown(Input.Keys.Up)) FreeSurfacePitch -= gameTime.ElapsedSec * 0.7;
//if (Game.Keyboard.IsKeyDown(Input.Keys.Down)) FreeSurfacePitch += gameTime.ElapsedSec * 0.7;
//FreeSurfaceYaw = DMathUtil.Clamp(FreeSurfaceYaw, -DMathUtil.PiOverTwo, DMathUtil.PiOverTwo);
if (FreeSurfaceYaw > DMathUtil.TwoPi) FreeSurfaceYaw -= DMathUtil.TwoPi;
if (FreeSurfaceYaw < -DMathUtil.TwoPi) FreeSurfaceYaw += DMathUtil.TwoPi;
// Calculate free cam rotation matrix
if (!freezeFreeCamRotation)
freeSurfaceRotation = DQuaternion.RotationAxis(DVector3.UnitY, FreeSurfaceYaw) * DQuaternion.RotationAxis(DVector3.UnitX, FreeSurfacePitch);
var quat = freeSurfaceRotation;
var qRot = DMatrix.RotationQuaternion(quat);
var matrix = qRot * mat;
var velDir = matrix.Forward * velocityDirection.X + mat.Up * velocityDirection.Y + matrix.Right * velocityDirection.Z;
if (velDir.Length() != 0) {
velDir.Normalize();
}
#endregion
double fac = ((CameraDistance - EarthRadius) - Parameters.MinDistVelocityThreshold) / (Parameters.MaxDistVelocityThreshold - Parameters.MinDistVelocityThreshold);
fac = DMathUtil.Clamp(fac, 0.0, 1.0);
FreeSurfaceVelocityMagnitude = DMathUtil.Lerp(Parameters.MinVelocityFreeSurfCam, Parameters.MaxVelocityFreeSurfCam, fac);
// Update camera position
FinalCamPosition = FreeSurfacePosition = FreeSurfacePosition + velDir * FreeSurfaceVelocityMagnitude * gameTime.ElapsedSec;
CameraPosition = FinalCamPosition;
velocityDirection = DVector3.Zero;
//Calculate view matrix
ViewMatrix = DMatrix.LookAtRH(FinalCamPosition, FinalCamPosition + matrix.Forward, matrix.Up);
ViewMatrixWithTranslation = ViewMatrix;
ViewMatrix.TranslationVector = DVector3.Zero;
// Calculate new yaw and pitch
CameraDistance = CameraPosition.Length();
var newLonLat = GetCameraLonLat();
Yaw = newLonLat.X;
Pitch = -newLonLat.Y;
}
ViewMatrixFloat = DMatrix.ToFloatMatrix(ViewMatrix);
ProjMatrixFloat = DMatrix.ToFloatMatrix(ProjMatrix);
//var viewDir = CameraPosition / CameraPosition.Length();
}