code: def test_rotate_on_spot_roll(self):
      N = 14
      eye = torch.rand(N, 3)
      at = torch.rand(N, 3)
      up = torch.rand(N, 3)
  
      R, T = look_at_view_transform(eye=eye, at=at, up=up)
  
      # Moving around the z axis rotates the image.
      angles = torch.FloatTensor([0, 0, -radians(10)])
      rotation = axis_angle_to_matrix(angles)
      R_rot, T_rot = rotate_on_spot(R, T, rotation)
      eye_rot, at_rot, up_rot = camera_to_eye_at_up(
          get_world_to_view_transform(R=R_rot, T=T_rot)
      )
      self.assertClose(eye, eye_rot, atol=1e-5)
      self.assertClose(
          normalize(at - eye), normalize(at_rot - eye), atol=1e-5
      )
  
      # The camera has moved clockwise
      agree = _batched_dotprod(torch.cross(up, up_rot, dim=1), at - eye)
      self.assertGreater(agree.min(), 0)
  
file_path: pytorch3d/tests/test_camera_utils.py
imports: import unittest
  from math import radians
  import torch
  from pytorch3d.renderer.camera_utils import camera_to_eye_at_up, rotate_on_spot
  from pytorch3d.renderer.cameras import get_world_to_view_transform, look_at_view_transform, PerspectiveCameras
  from pytorch3d.transforms import axis_angle_to_matrix
  from torch.nn.functional import normalize
  from .common_testing import TestCaseMixin
label_desc: Use image node_id 5 for calling the TestCameraUtils obj's underlying member method code with example usage: obj.test_rotate_on_spot_roll() without return types