Search code examples
c#unity-game-engineclamp

Not able to Clamp my camera rotation value


I made a camera that rotates around an object... Everything is working fine. But I was not able to clamp or restrict the camera rotation. Here's the code..

//First - Get the Initial Position
        if (Input.GetMouseButtonDown(0))
        {
            mPreviousPosition = mCamRef.ScreenToViewportPoint(Input.mousePosition);
        }

        //Second - the difference amount and change in x
        if (Input.GetMouseButton(0))
        {
            Vector3 newPosition = mCamRef.ScreenToViewportPoint(Input.mousePosition);
            Vector3 direction = mPreviousPosition - newPosition;
            
            float rotationAroundYAxis = -direction.x * 180;
            mCamRef.transform.position = mTargetToRotateAround.position;
            rotationAroundYAxis = Mathf.Clamp(rotationAroundYAxis, -60f,60f);
            
            mCamRef.transform.rotation = Quaternion.Euler(Vector3.up * rotationAroundYAxis);

            mCamRef.transform.Translate(new Vector3(mDistanceToTarget.x, mDistanceToTarget.y, -mDistanceToTarget.z));
            mPreviousPosition = newPosition;
        }

Solution

  • You are clamping

    rotationAroundYAxis = Mathf.Clamp(rotationAroundYAxis, -0.6f, 0.6f);
    

    but then use it for Transform.Rotate which rotates from the current rotation about the given amount => you always rotate something.

    You would probably rather use e.g. Quaternion.Euler

    mCamRef.transform.rotation = Quaternion.Euler(Vector3.up * rotationAroundYAxis);
           
    

    However, note that clamping a rotation using +- 0.6° makes barely any sense ...

    From you comments you want to clamp to +-60° so rather use

    rotationAroundYAxis = Mathf.Clamp(rotationAroundYAxis, -60, 60);
    

    Though I still don't understand how you want to get a rotation in angles from a direction vector ...