code: def orbit(self, x1_px, y1_px, x2_px, y2_px):
          
          px_per_deg = self.vport_radius_px / float(self.orbit_speed)
          radians_per_px = 1.0 / px_per_deg * np.pi / 180.0
  
          t2p = self.position - self.target
  
          M = Matrix4x4.rotation_around_origin((x1_px - x2_px) * radians_per_px,
                                               self.ground)
          t2p = M * t2p
          self.up = M * self.up
  
          right = (self.up ^ t2p).normalized()
          M = Matrix4x4.rotation_around_origin((y1_px - y2_px) * radians_per_px,
                                               right)
          t2p = M * t2p
          self.up = M * self.up
  
          self.position = self.target + t2p
docs: Causes the camera to "orbit" around the target point.
          This is also called "tumbling" in some software packages.