code: def on_drag(self, cursor_x, cursor_y):
          
          from blmath.geometry.transform.rodrigues import as_rotation_matrix
          if self.isdragging:
              mouse_pt = arcball.Point2fT(cursor_x, cursor_y)
              # Update End Vector And Get Rotation As Quaternion
              ThisQuat = self.arcball.drag(mouse_pt)
              # Convert Quaternion Into Matrix3fT
              self.thisrot = arcball.Matrix3fSetRotationFromQuat4f(ThisQuat)
              # Use correct Linear Algebra matrix multiplication C = A * B
              # Accumulate Last Rotation Into This One
              self.thisrot = arcball.Matrix3fMulMatrix3f(self.lastrot, self.thisrot)
              # make sure it is a rotation
              self.thisrot = as_rotation_matrix(self.thisrot)
              # Set Our Final Transform's Rotation From This One
              self.transform = arcball.Matrix4fSetRotationFromMatrix3f(self.transform, self.thisrot)
              glut.glutPostRedisplay()
          return
docs: Mouse cursor is moving
              Glut calls this function (when mouse button is down)
              and pases the mouse cursor postion in window coords as the mouse moves.