code: def __init__(self):
      app.Canvas.__init__(self, keys="interactive", size=(800, 550))
  
      self.meshes = []
      self.rotation = MatrixTransform()
  
      # Generate some data to work with
      global mdata
      mdata = create_sphere(20, 40, 1.0)
  
      # Mesh with pre-indexed vertices, uniform color
      self.meshes.append(visuals.MeshVisual(meshdata=mdata, color="b"))
  
      # Mesh with pre-indexed vertices, per-face color
      # Because vertices are pre-indexed, we get a different color
      # every time a vertex is visited, resulting in sharp color
      # differences between edges.
      rng = np.random.RandomState(0)
      verts = mdata.get_vertices(indexed="faces")
      nf = verts.size // 9
      fcolor = np.ones((nf, 3, 4), dtype=np.float32)
      fcolor[..., 0] = np.linspace(1, 0, nf)[:, np.newaxis]
      fcolor[..., 1] = rng.randn(nf, 1)
      fcolor[..., 2] = np.linspace(0, 1, nf)[:, np.newaxis]
      mesh = visuals.MeshVisual(vertices=verts, face_colors=fcolor)
      self.meshes.append(mesh)
  
      # Mesh with unindexed vertices, per-vertex color
      # Because vertices are unindexed, we get the same color
      # every time a vertex is visited, resulting in no color differences
      # between edges.
      verts = mdata.get_vertices()
      faces = mdata.get_faces()
      nv = verts.size // 3
      vcolor = np.ones((nv, 4), dtype=np.float32)
      vcolor[:, 0] = np.linspace(1, 0, nv)
      vcolor[:, 1] = rng.randn(nv)
      vcolor[:, 2] = np.linspace(0, 1, nv)
      self.meshes.append(visuals.MeshVisual(verts, faces, vcolor))
      self.meshes.append(visuals.MeshVisual(verts, faces, vcolor))
      flat_shading = ShadingFilter(shading="flat", shininess=100)
      self.meshes[-1].attach(flat_shading)
      self.meshes.append(visuals.MeshVisual(verts, faces, vcolor))
      smooth_shading = ShadingFilter(shading="smooth", shininess=100)
      self.meshes[-1].attach(smooth_shading)
  
      # Mesh with color indexed into a colormap
      verts = mdata.get_vertices(None)
      faces = mdata.get_faces()
      values = rng.randn(len(verts))
      mesh = visuals.MeshVisual(
          vertices=verts, faces=faces, vertex_values=values
      )
      mesh.clim = [-1, 1]
      mesh.cmap = "viridis"
      smooth_shading = ShadingFilter(shading="smooth", shininess=100)
      mesh.attach(smooth_shading)
      self.meshes.append(mesh)
  
      # Lay out meshes in a grid
      grid = (3, 3)
      s = 300.0 / max(grid)
      for i, mesh in enumerate(self.meshes):
          x = 800.0 * (i % grid[0]) / grid[0] + 400.0 / grid[0] - 2
          y = 800.0 * (i // grid[1]) / grid[1] + 400.0 / grid[1] + 2
          transform = ChainTransform(
              [
                  STTransform(translate=(x, y), scale=(s, s, s)),
                  self.rotation,
              ]
          )
          mesh.transform = transform
          mesh.transforms.scene_transform = STTransform(
              scale=(1, 1, 0.01)
          )
  
      self.show()
  
      self.timer = app.Timer(connect=self.rotate)
      self.timer.start(0.016)
  
file_path: vispy/examples/basics/visuals/mesh.py
imports: import numpy
  from vispy import app, gloo, visuals
  from vispy.geometry import create_sphere
  from vispy.visuals.transforms import STTransform, MatrixTransform, ChainTransform
  from vispy.visuals.filters import ShadingFilter
label_desc: Use image node_id 1 to create a new Canvas object from inherited base classes: app with example: obj = Canvas()