Спасибо всем участвующим в обсуждении.
Решил задачу следующим образом.
Вначале ОДИН раз я выставляю позицию своей камеры в нужном положение, а также с помощью функции LookRotation задаю направление камеры, чтобы она смотрела на цель. Напомню, что rotator - это объект с которого мне необходимо "считать" поворот вокруг оси z камеры (вокруг оптической оси камеры), соответсвенно объект rotator вращается только вокруг своей оси z.
Используется csharp
distance = DISTANCE_MIN;
transform.position = target.transform.position + distance * (target.transform.position.normalized);
Vector3 relativePos = target.transform.position - transform.position;
transform.rotation = Quaternion.LookRotation(relativePos) * rotator.transform.rotation;
Далее по FixedUpdate() выполняю:
Используется csharp
Quaternion displacement = Quaternion.FromToRotation(transform.InverseTransformDirection(lastGravity), Camera.mainCamera.transform.InverseTransformDirection(Physics.gravity));
transform.rotation = transform.rotation * displacement;
Quaternion rotate = Quaternion.AngleAxis(lastRotationZ - rotator.transform.rotation.eulerAngles.z, Vector3.forward);
transform.rotation = transform.rotation * rotate;
lastGravity = Physics.gravity;
lastRotationZ = rotator.transform.rotation.eulerAngles.z;
displacement - служит для корректировки направления оптической оси камеры.
rotate - корректировка поворота камеры вокруг оптической оси.