/// <summary> /// This method calculates modification matrix, that allows to convert world /// coordinates to camera. /// </summary> public Matrix GetCameraMatrix() { //Stage 1: Creating inverted matrix of translation Matrix matrixInverted = ModificationMatrix.NewMoveMatrix(-Position.X, -Position.Y, -Position.Z); //Stage 2: Calculating vectors u, v, n Vector3D N = new Vector3D(Target.X - Position.X, Target.Y - Position.Y, Target.Z - Position.Z); Vector3D V = new Vector3D(0, 1, 0); Vector3D U = V ^ N; V = U ^ N; //Normalizing all vectors U.Normalize(); V.Normalize(); N.Normalize(); cameraMatrix = ModificationMatrix.NewUVNProjectionMatrix( U.X, U.Y, U.Z, V.X, V.Y, V.Z, N.X, N.Y, N.Z); cameraMatrix = cameraMatrix.Multiply(matrixInverted); return(cameraMatrix); }
/// <summary> /// Rotates camera up & down with @angle /// </summary> public void FlyCameraUpDown(double angle) { Matrix rotateMatrix = ModificationMatrix.NewMoveMatrix(-Target.X, -Target.Y, -Target.Z); rotateMatrix = rotateMatrix.Multiply(Position.GetProjectiveCoordinates()); Position.Set(rotateMatrix[0, 0], rotateMatrix[1, 0], rotateMatrix[2, 0]); angle += MathHelpers.FromRadiansToDegrees(Position.Theta); angle = Math.Min(Math.Max(angle, MIN_THETA), MAX_THETA); Position.SetTheta(MathHelpers.FromDegreesToRadians(angle)); AngleTheta = 180 - (int)angle; rotateMatrix = ModificationMatrix.NewMoveMatrix(Target.X, Target.Y, Target.Z); rotateMatrix = rotateMatrix.Multiply(Position.GetProjectiveCoordinates()); Position.Set(rotateMatrix[0, 0], rotateMatrix[1, 0], rotateMatrix[2, 0]); }
// do you really need any comments here? public void HeadCameraLeftRight(double angle) { Matrix rotateMatrix = ModificationMatrix.NewMoveMatrix(-Position.X, -Position.Y, -Position.Z); rotateMatrix = rotateMatrix.Multiply(Target.GetProjectiveCoordinates()); Target.Set(rotateMatrix[0, 0], rotateMatrix[1, 0], rotateMatrix[2, 0]); angle += MathHelpers.FromRadiansToDegrees(Target.Phi); angle %= 360; angle = angle < 0 ? 360 + angle : angle; Target.SetPhi(MathHelpers.FromDegreesToRadians(angle)); AnglePhi = (int)angle; rotateMatrix = ModificationMatrix.NewMoveMatrix(Position.X, Position.Y, Position.Z); rotateMatrix = rotateMatrix.Multiply(Target.GetProjectiveCoordinates()); Target.Set(rotateMatrix[0, 0], rotateMatrix[1, 0], rotateMatrix[2, 0]); }