code: def on_timer(self, event):
      if not self.stop_rotation:
          self.theta += 0.05
          self.phi += 0.05
          self.model = np.dot(
              rotate(self.theta, (0, 0, 1)), rotate(self.phi, (0, 1, 0))
          )
          self.program["u_model"] = self.model
      self.clock += np.pi / 100
      self.program["u_clock"] = self.clock
      self.update()
  
file_path: vispy/examples/demo/gloo/atom.py
imports: import numpy
  from vispy import gloo
  from vispy import app
  from vispy.util.transforms import perspective, translate, rotate
label_desc: Use image node_id 3 for calling the Canvas obj's underlying member method code with example usage: obj.on_timer(event) without return types