3D Orbital Camera issue

I’m working on creating a 3D orbital camera for my player character (i.e. it moves on a spherical path around the model) and I understand the principal behind converting spherical coordinates to Cartesian coords, but for some reason I’m getting weird behavior in the actual movement.

GIF of camera movement

if (Input.GetMouseButtonDown(1))
{
    MouseX = Input.mousePosition.x;
    MouseY = Input.mousePosition.y;
}
if (Input.GetMouseButton(1))
{
    if (Input.mousePosition.x - MouseX > 0)
    {
        phi += CameraMoveSpeed * Mathf.PI / 180;
    }
    else if (Input.mousePosition.x - MouseX < 0)
    {
        phi -= CameraMoveSpeed * Mathf.PI / 180;
    }
    if (Input.mousePosition.y - MouseY > 0)
    {
        theta += CameraMoveSpeed * Mathf.PI / 180;
    }
    else if (Input.mousePosition.y - MouseY < 0)
    {
        theta -= CameraMoveSpeed * Mathf.PI / 180;
    }
}

Vector3 target = new Vector3(transform.position.x, transform.position.y + 10, transform.position.z - 10);

target.x = transform.position.x + CameraDistance * Mathf.Cos(phi) * Mathf.Sin(theta);
target.y = transform.position.y + CameraDistance * Mathf.Sin(phi) * Mathf.Sin(theta);
target.z = transform.position.z + CameraDistance * Mathf.Cos(theta);

mainCam.transform.position = target;

I’m not sure where I’m going wrong.

Ok, I’ve figured it out!

I ended up finding a project from my computer graphics course that had the answer.

if (Input.GetMouseButtonDown(1))
{
    MouseX = Input.mousePosition.x;
    MouseY = Input.mousePosition.y;
}
if (Input.GetMouseButton(1))
{
    if (Input.mousePosition.x - MouseX > CameraMouseThreshhold)
    {
        theta += CameraMoveSpeed;
    }
    else if (Input.mousePosition.x - MouseX < -CameraMouseThreshhold)
    {
        theta -= CameraMoveSpeed;
    }
    if (Input.mousePosition.y - MouseY > CameraMouseThreshhold)
    {
        phi += CameraMoveSpeed;
    }
    else if (Input.mousePosition.y - MouseY < -CameraMouseThreshhold)
    {
        phi -= CameraMoveSpeed;
    }
}
target.x = transform.position.x + CameraDistance * Mathf.Sin(theta * Mathf.Deg2Rad) * Mathf.Sin(phi * Mathf.Deg2Rad);
target.z = transform.position.z + CameraDistance * Mathf.Cos(theta * Mathf.Deg2Rad) * Mathf.Sin(phi * Mathf.Deg2Rad);
target.y = transform.position.y + CameraDistance * Mathf.Cos(phi * Mathf.Deg2Rad);

mainCam.transform.position = Vector3.Lerp(mainCam.transform.position, target, 5f * Time.deltaTime);
mainCam.transform.LookAt(transform);

The key was getting the right Cartesian coordinate conversions mapped to the correct transform position vector units.