RotateAround Clamping Issue

Hi all, I’m trying to implement a system where my camera will zoom in on the front face of a gameobject and I can then rotate around it with clamping.

I’ve managed to get it work, though I’m guessing I’ve done it totally wrong - Basically I’m expecting actualAngle to be NEGATIVE when I pan to the left and POSITIVE when I pan to the right.

It does work for targets that have no rotation but not for targets that do have a rotation as the centred angle is not zero.

Here’s my function:

float _prevMousePosX;

void RotateCamera()
{
    //Allow min -30 degrees when panning to the left
    minXLimit = -50;
    //And max 30 degrees when panning to the right
    maxXLimit = 50;

    //Work out how much the mouse has moved
    var mouseX = Input.GetAxis("Mouse X");
    
    Vector3 angle = target.position + target.rotation * transform.position * -1;
    var actualAngle = angle.x;
    //The angle is very small so times it by 100
    actualAngle = actualAngle * 100;
    Debug.Log(actualAngle);

    if ((actualAngle > minXLimit && actualAngle < maxXLimit && isMoving))
    {
        //No - Allow rotating in either direction horizontally
        if(isMoving) transform.RotateAround(target.transform.position, Vector3.up, mouseX * 1);
    } else
    {
        //Yes, it's more than 30 degrees either left or right
        //Work out which way wer're trying to drag the mouse and whether we should allow rotation further in that direction
        if (mouseX>0 && actualAngle < minXLimit)
        {
            //Don't allow?
        } 
        else if (mouseX<0 && actualAngle < minXLimit)
        {
            //Allow rotating back
            if (isMoving) transform.RotateAround(target.transform.position, Vector3.up, mouseX * 1);
        }
        else
        {
            //Mouse isn't moving

        }
        
        if (mouseX>0 && actualAngle > maxXLimit)
        {
            //Allow rotating back
            if (isMoving) transform.RotateAround(target.transform.position, Vector3.up, mouseX * 1);
        }
        else if(mouseX<0 && actualAngle > maxXLimit)
        {
            //Don't allow rotating in this direction any further
        } else
        {
            //Mouse isn't moving
        }
    }

    _prevMousePosX = mouseX;
}

Issue resolved. I was going down the wrong path basically.

It can be simplified like this:

    //Work out how close we are to facing each other
    //We can minus 180 because we'll always be facing each other, but just not always directly
    var newAngle = Quaternion.Angle(target.rotation, transform.rotation) -180;
    //Then we need to work out whether we are to it's left or it's right
    float rotateDirection = (((transform.eulerAngles.y - target.eulerAngles.y) + 360f) % 360f) > 180.0f ? 1 : -1;

    var actualAngle = newAngle;
    //And finally we can negate our degrees if we're to it's left
    actualAngle = actualAngle * rotateDirection;

You can then use actualAngle to work out whether you should allow more rotation.