// This source was written in C# //

public class Camera3D{

  public static Vector3 cameraPosition;
  public static Vector3 cameraTarget;
  public static Vector3 cameraUpVector;

  public static float radius = 1;
  public static float moveDist = 1f;

  private static float hRadians;
  private static float vRadians;

  public Camera3D(){}

  public static void SetCamera(Vector3 cPosition, float h, float v){
    cameraPosition = cPosition;
    cameraTarget = new Vector3();
    cameraUpVector = new Vector3();
    hRadians = h;
    vRadians = v;

    RotateCamera(0,0);
  }

  public static void RotateCamera(float h, float v){
    hRadians += h;
    vRadians += v;

    cameraTarget.Y = cameraPosition.Y+(float)(radius*Math.Sin(vRadians));
    cameraTarget.X = cameraPosition.X+(float)(radius*Math.Cos(vRadians)*Math.Cos(hRadians));
    cameraTarget.Z = cameraPosition.Z+(float)(radius*Math.Cos(vRadians)*Math.Sin(hRadians));
    
    cameraUpVector.X = cameraPosition.X-cameraTarget.X;
    cameraUpVector.Y = Math.Abs(cameraPosition.Y+(float)(radius*Math.Sin(vRadians+Math.PI/2))) ;
    cameraUpVector.Z = cameraPosition.Z-cameraTarget.Z;
  }

  public static void SlideCamera(float h, float v){
    cameraPosition.Y += v*moveDist;
    cameraPosition.X += h*moveDist*(float)Math.Cos(hRadians+Math.PI/2);
    cameraPosition.Z += h*moveDist*(float)Math.Sin(hRadians+Math.PI/2);
    RotateCamera(0,0);
  }

  public static void MoveCamera(float d){
    cameraPosition.Y += d*moveDist*(float)Math.Sin(vRadians);
    cameraPosition.X += d*moveDist*(float)(Math.Cos(vRadians)*Math.Cos(hRadians));
    cameraPosition.Z += d*moveDist*(float)(Math.Cos(vRadians)*Math.Sin(hRadians));
    RotateCamera(0,0);
  }
}