code: def set_gl_transform(self):
          
          tangent = np.tan(self.fov_deg / 2.0 / 180.0 * np.pi)
          vport_radius = self.near_plane * tangent
          # calculate aspect of the viewport
          if self.vport_wd_px < self.vport_ht_px:
              vport_wd = 2.0 * vport_radius
              vport_ht = vport_wd * self.vport_ht_px / float(self.vport_wd_px)
  
          else:
              vport_ht = 2.0 * vport_radius
              vport_wd = vport_ht * self.vport_wd_px / float(self.vport_ht_px)
  
          gl.glFrustum(
              -0.5 * vport_wd, 0.5 * vport_wd,    # left, right
              -0.5 * vport_ht, 0.5 * vport_ht,    # bottom, top
              self.near_plane, self.far_plane
          )
  
          M = Matrix4x4.look_at(self.position, self.target, self.up, False)
          gl.glMultMatrixf(M.get())
docs: This side effects the OpenGL context to set the view to match
          the camera.