Surface with multiple textures#

This example demonstrates one possible method for displaying a 3D surface with multiple textures.

Thanks to Emmanuel Reynaud and Luis Gutierrez for providing the gorgeous coral model for this demo. You can find the data on FigShare: https://zenodo.org/records/13380203

More information on the methods used to generate this model can be found in L. Gutierrez-Heredia, C. Keogh, E. G. Reynaud, Assessing the Capabilities of Additive Manufacturing Technologies for Coral Studies, Education, and Monitoring. Front. Mar. Sci. 5 (2018), doi:10.3389/fmars.2018.00278.

A bit about 3D models#

A standard way to define a 3D model (mesh, or Surface in napari) is by listing vertices (3D point coordinates) and faces (triplets of vertex indices - each face is a triangle in 3D space). Meshes are often stored in “Wavefront” (.obj) files, which may have companion material (.mtl) files that describe some shading properties (base color, shinyness, etc.) for different parts of the model.

In some cases, the color of a vertex is given by a single point value that is then colormapped on the fly (vertex_values). In other cases, each vertex or face may be assigned a specific color (vertex_colors). These methods are demonstrated in Surface with texture and vertex_colors.

In the case of “photorealistic” models, the color of each vertex is instead determined by mapping a vertex to a point in an image called a texture using 2D texture coordinates in the range [0, 1]. The color of each individual pixel is smoothly interpolated (sampled) on the fly from the texture (the GPU makes this interpolation very fast).

Napari does not (yet) support models with multiple textures or materials. If the textures don’t overlap, you can display them on separate meshes as shown in this demo. If the textures do overlap, you may instead be able to combine the textures as images. This relies on textures having the same texture coordinates, and may require resizing the textures to match each other.

Tags: visualization-nD

import os

import matplotlib.pyplot as plt
import pooch
from vispy.io import imread, read_mesh

import napari

Download the model#

download = pooch.DOIDownloader(progressbar=True)
doi = '10.5281/zenodo.13380203'
tmp_dir = pooch.os_cache('napari-surface-texture-example')
os.makedirs(tmp_dir, exist_ok=True)
data_files = {
    'mesh': 'PocilloporaDamicornisSkin.obj',
    # "materials": "PocilloporaVerrugosaSkinCrop.mtl",  # not yet supported
    'Texture_0': 'PocilloporaDamicornisSkin_Texture_0.jpg',
    'GeneratedMat2': 'PocilloporaDamicornisSkin_GeneratedMat2.png',
}
print(f'downloading data into {tmp_dir}')
for file_name in data_files.values():
    if not (tmp_dir / file_name).exists():
        print(f'downloading {file_name}')
        download(
            f'doi:{doi}/{file_name}',
            output_file=tmp_dir / file_name,
            pooch=None,
        )
    else:
        print(f'using cached {tmp_dir / file_name}')
downloading data into /home/runner/.cache/napari-surface-texture-example
downloading PocilloporaDamicornisSkin.obj

  0%|                                              | 0.00/93.8M [00:00<?, ?B/s]
  0%|                                      | 14.3k/93.8M [00:00<13:18, 117kB/s]
  0%|                                      | 79.9k/93.8M [00:00<03:49, 407kB/s]
  0%|                                       | 136k/93.8M [00:00<03:41, 423kB/s]
  0%|                                       | 224k/93.8M [00:00<02:39, 586kB/s]
  0%|▏                                      | 333k/93.8M [00:00<02:03, 754kB/s]
  0%|▏                                      | 426k/93.8M [00:00<01:54, 812kB/s]
  1%|▏                                      | 510k/93.8M [00:00<01:53, 820kB/s]
  1%|▎                                      | 634k/93.8M [00:00<01:38, 950kB/s]
  1%|▎                                     | 794k/93.8M [00:00<01:20, 1.15MB/s]
  1%|▎                                     | 911k/93.8M [00:01<01:20, 1.16MB/s]
  1%|▍                                    | 1.03M/93.8M [00:01<01:19, 1.16MB/s]
  1%|▍                                     | 1.14M/93.8M [00:01<01:43, 895kB/s]
  1%|▌                                     | 1.28M/93.8M [00:01<01:32, 998kB/s]
  1%|▌                                    | 1.39M/93.8M [00:01<01:30, 1.02MB/s]
  2%|▌                                    | 1.50M/93.8M [00:01<01:28, 1.04MB/s]
  2%|▋                                    | 1.60M/93.8M [00:01<01:27, 1.06MB/s]
  2%|▋                                    | 1.71M/93.8M [00:01<01:26, 1.07MB/s]
  2%|▋                                    | 1.82M/93.8M [00:01<01:25, 1.07MB/s]
  2%|▊                                     | 1.98M/93.8M [00:02<01:37, 941kB/s]
  2%|▊                                     | 2.08M/93.8M [00:02<01:35, 955kB/s]
  2%|▉                                     | 2.18M/93.8M [00:02<01:34, 966kB/s]
  2%|▉                                    | 2.32M/93.8M [00:02<01:24, 1.09MB/s]
  3%|▉                                    | 2.43M/93.8M [00:02<01:23, 1.10MB/s]
  3%|█                                    | 2.55M/93.8M [00:02<01:22, 1.10MB/s]
  3%|█                                    | 2.66M/93.8M [00:02<01:22, 1.11MB/s]
  3%|█                                     | 2.77M/93.8M [00:02<01:45, 865kB/s]
  3%|█▏                                    | 2.87M/93.8M [00:03<01:42, 888kB/s]
  3%|█▏                                    | 2.97M/93.8M [00:03<01:37, 934kB/s]
  3%|█▏                                    | 3.08M/93.8M [00:03<01:34, 958kB/s]
  3%|█▎                                    | 3.18M/93.8M [00:03<01:33, 970kB/s]
  4%|█▎                                   | 3.30M/93.8M [00:03<01:25, 1.05MB/s]
  4%|█▎                                   | 3.43M/93.8M [00:03<01:20, 1.12MB/s]
  4%|█▍                                   | 3.57M/93.8M [00:03<01:15, 1.20MB/s]
  4%|█▍                                    | 3.70M/93.8M [00:03<01:36, 937kB/s]
  4%|█▌                                    | 3.80M/93.8M [00:03<01:33, 962kB/s]
  4%|█▌                                   | 3.92M/93.8M [00:04<01:26, 1.04MB/s]
  4%|█▌                                   | 4.04M/93.8M [00:04<01:25, 1.05MB/s]
  4%|█▋                                   | 4.17M/93.8M [00:04<01:19, 1.13MB/s]
  5%|█▋                                   | 4.29M/93.8M [00:04<01:18, 1.14MB/s]
  5%|█▋                                   | 4.41M/93.8M [00:04<01:17, 1.15MB/s]
  5%|█▊                                   | 4.55M/93.8M [00:04<01:11, 1.24MB/s]
  5%|█▊                                   | 4.69M/93.8M [00:04<01:10, 1.27MB/s]
  5%|█▉                                   | 4.84M/93.8M [00:04<01:06, 1.34MB/s]
  5%|█▉                                   | 4.97M/93.8M [00:04<01:06, 1.34MB/s]
  5%|██                                   | 5.11M/93.8M [00:05<01:25, 1.04MB/s]
  6%|██                                   | 5.22M/93.8M [00:05<01:23, 1.06MB/s]
  6%|██                                   | 5.38M/93.8M [00:05<01:14, 1.19MB/s]
  6%|██▏                                  | 5.50M/93.8M [00:05<01:12, 1.21MB/s]
  6%|██▎                                   | 5.63M/93.8M [00:05<01:31, 961kB/s]
  6%|██▎                                   | 5.74M/93.8M [00:05<01:28, 990kB/s]
  6%|██▎                                  | 5.86M/93.8M [00:05<01:24, 1.04MB/s]
  6%|██▍                                   | 5.97M/93.8M [00:05<01:44, 841kB/s]
  7%|██▍                                   | 6.12M/93.8M [00:06<01:29, 985kB/s]
  7%|██▍                                  | 6.26M/93.8M [00:06<01:19, 1.10MB/s]
  7%|██▌                                  | 6.41M/93.8M [00:06<01:13, 1.20MB/s]
  7%|██▌                                  | 6.59M/93.8M [00:06<01:04, 1.36MB/s]
  7%|██▋                                  | 6.73M/93.8M [00:06<01:03, 1.38MB/s]
  7%|██▋                                  | 6.88M/93.8M [00:06<01:02, 1.40MB/s]
  7%|██▊                                  | 7.02M/93.8M [00:06<01:01, 1.40MB/s]
  8%|██▊                                  | 7.17M/93.8M [00:06<01:01, 1.41MB/s]
  8%|██▉                                  | 7.31M/93.8M [00:06<01:01, 1.42MB/s]
  8%|██▉                                  | 7.45M/93.8M [00:07<01:18, 1.10MB/s]
  8%|██▉                                  | 7.58M/93.8M [00:07<01:16, 1.13MB/s]
  8%|███                                  | 7.72M/93.8M [00:07<01:11, 1.20MB/s]
  8%|███                                  | 7.84M/93.8M [00:07<01:10, 1.22MB/s]
  9%|███▏                                 | 8.01M/93.8M [00:07<01:03, 1.35MB/s]
  9%|███▏                                 | 8.15M/93.8M [00:07<01:20, 1.07MB/s]
  9%|███▎                                 | 8.27M/93.8M [00:07<01:17, 1.10MB/s]
  9%|███▎                                 | 8.40M/93.8M [00:07<01:14, 1.15MB/s]
  9%|███▍                                  | 8.53M/93.8M [00:08<01:32, 925kB/s]
  9%|███▍                                  | 8.63M/93.8M [00:08<01:28, 962kB/s]
  9%|███▍                                 | 8.78M/93.8M [00:08<01:18, 1.09MB/s]
  9%|███▌                                 | 8.90M/93.8M [00:08<01:16, 1.11MB/s]
 10%|███▌                                 | 9.03M/93.8M [00:08<01:13, 1.16MB/s]
 10%|███▋                                 | 9.19M/93.8M [00:08<01:06, 1.28MB/s]
 10%|███▋                                 | 9.32M/93.8M [00:08<01:05, 1.30MB/s]
 10%|███▋                                 | 9.45M/93.8M [00:08<01:23, 1.01MB/s]
 10%|███▊                                 | 9.57M/93.8M [00:08<01:20, 1.04MB/s]
 10%|███▊                                 | 9.73M/93.8M [00:09<01:09, 1.20MB/s]
 11%|███▉                                 | 9.86M/93.8M [00:09<01:08, 1.22MB/s]
 11%|███▉                                 | 10.1M/93.8M [00:09<01:10, 1.19MB/s]
 11%|████                                 | 10.2M/93.8M [00:09<01:09, 1.20MB/s]
 11%|████                                 | 10.4M/93.8M [00:09<01:05, 1.28MB/s]
 11%|████▏                                | 10.5M/93.8M [00:09<01:01, 1.34MB/s]
 11%|████▏                                | 10.7M/93.8M [00:09<01:01, 1.36MB/s]
 12%|████▎                                | 10.8M/93.8M [00:09<01:00, 1.37MB/s]
 12%|████▎                                | 10.9M/93.8M [00:09<01:00, 1.37MB/s]
 12%|████▎                                | 11.1M/93.8M [00:10<01:19, 1.04MB/s]
 12%|████▍                                | 11.2M/93.8M [00:10<01:17, 1.07MB/s]
 12%|████▍                                | 11.3M/93.8M [00:10<01:14, 1.11MB/s]
 12%|████▌                                | 11.4M/93.8M [00:10<01:12, 1.14MB/s]
 12%|████▌                                | 11.6M/93.8M [00:10<01:05, 1.25MB/s]
 13%|████▋                                | 11.7M/93.8M [00:10<01:04, 1.27MB/s]
 13%|████▊                                 | 11.9M/93.8M [00:10<01:22, 995kB/s]
 13%|████▋                                | 12.0M/93.8M [00:10<01:19, 1.02MB/s]
 13%|████▊                                | 12.1M/93.8M [00:11<01:18, 1.04MB/s]
 13%|████▊                                | 12.2M/93.8M [00:11<01:16, 1.06MB/s]
 13%|████▊                                | 12.3M/93.8M [00:11<01:15, 1.08MB/s]
 13%|████▉                                | 12.4M/93.8M [00:11<01:14, 1.10MB/s]
 13%|████▉                                | 12.5M/93.8M [00:11<01:13, 1.11MB/s]
 13%|█████                                 | 12.6M/93.8M [00:11<01:34, 863kB/s]
 14%|█████▏                                | 12.8M/93.8M [00:11<01:22, 982kB/s]
 14%|█████                                | 12.9M/93.8M [00:11<01:19, 1.01MB/s]
 14%|█████▏                               | 13.0M/93.8M [00:11<01:17, 1.04MB/s]
 14%|█████▏                               | 13.1M/93.8M [00:12<01:12, 1.11MB/s]
 14%|█████▎                                | 13.2M/93.8M [00:12<01:31, 879kB/s]
 14%|█████▍                                | 13.3M/93.8M [00:12<01:29, 901kB/s]
 14%|█████▎                               | 13.5M/93.8M [00:12<01:19, 1.01MB/s]
 14%|█████▎                               | 13.6M/93.8M [00:12<01:18, 1.03MB/s]
 15%|█████▍                               | 13.8M/93.8M [00:12<01:02, 1.27MB/s]
 15%|█████▍                               | 13.9M/93.8M [00:12<01:18, 1.01MB/s]
 15%|█████▌                               | 14.0M/93.8M [00:12<01:12, 1.09MB/s]
 15%|█████▋                                | 14.2M/93.8M [00:13<01:28, 895kB/s]
 15%|█████▊                                | 14.3M/93.8M [00:13<01:24, 940kB/s]
 15%|█████▋                               | 14.4M/93.8M [00:13<01:14, 1.07MB/s]
 16%|█████▋                               | 14.5M/93.8M [00:13<01:12, 1.10MB/s]
 16%|█████▊                               | 14.7M/93.8M [00:13<01:10, 1.12MB/s]
 16%|█████▊                               | 14.8M/93.8M [00:13<01:05, 1.20MB/s]
 16%|█████▉                               | 14.9M/93.8M [00:13<01:05, 1.21MB/s]
 16%|█████▉                               | 15.0M/93.8M [00:13<01:04, 1.22MB/s]
 16%|█████▉                               | 15.2M/93.8M [00:13<01:04, 1.23MB/s]
 16%|██████▏                               | 15.3M/93.8M [00:14<01:22, 956kB/s]
 16%|██████▏                               | 15.4M/93.8M [00:14<01:19, 982kB/s]
 17%|██████▏                              | 15.6M/93.8M [00:14<01:08, 1.13MB/s]
 17%|██████▏                              | 15.7M/93.8M [00:14<01:04, 1.22MB/s]
 17%|██████▍                               | 15.8M/93.8M [00:14<01:20, 971kB/s]
 17%|██████▎                              | 15.9M/93.8M [00:14<01:17, 1.00MB/s]
 17%|██████▎                              | 16.1M/93.8M [00:14<01:16, 1.02MB/s]
 17%|██████▍                              | 16.2M/93.8M [00:14<01:09, 1.11MB/s]
 17%|██████▌                               | 16.3M/93.8M [00:15<01:27, 889kB/s]
 18%|██████▋                               | 16.4M/93.8M [00:15<01:18, 986kB/s]
 18%|██████▌                              | 16.6M/93.8M [00:15<01:15, 1.02MB/s]
 18%|██████▌                              | 16.7M/93.8M [00:15<01:13, 1.05MB/s]
 18%|██████▌                              | 16.8M/93.8M [00:15<01:10, 1.09MB/s]
 18%|██████▋                              | 16.9M/93.8M [00:15<01:09, 1.11MB/s]
 18%|██████▉                               | 17.0M/93.8M [00:15<01:25, 894kB/s]
 18%|██████▉                               | 17.1M/93.8M [00:15<01:23, 918kB/s]
 18%|██████▊                              | 17.3M/93.8M [00:16<01:14, 1.03MB/s]
 19%|██████▊                              | 17.4M/93.8M [00:16<01:13, 1.04MB/s]
 19%|███████                               | 17.5M/93.8M [00:16<01:30, 843kB/s]
 19%|███████▏                              | 17.6M/93.8M [00:16<01:22, 925kB/s]
 19%|███████▏                              | 17.7M/93.8M [00:16<01:17, 979kB/s]
 19%|███████                              | 17.8M/93.8M [00:16<01:14, 1.02MB/s]
 19%|███████                              | 18.0M/93.8M [00:16<01:07, 1.13MB/s]
 19%|███████▎                              | 18.1M/93.8M [00:16<01:24, 891kB/s]
 19%|███████▍                              | 18.2M/93.8M [00:17<01:19, 951kB/s]
 20%|███████▍                              | 18.3M/93.8M [00:17<01:16, 985kB/s]
 20%|███████▎                             | 18.4M/93.8M [00:17<01:11, 1.05MB/s]
 20%|███████▎                             | 18.6M/93.8M [00:17<01:05, 1.15MB/s]
 20%|███████▍                             | 18.7M/93.8M [00:17<01:02, 1.20MB/s]
 20%|███████▍                             | 18.8M/93.8M [00:17<01:01, 1.22MB/s]
 20%|███████▋                              | 19.0M/93.8M [00:17<01:16, 975kB/s]
 20%|███████▋                              | 19.1M/93.8M [00:17<01:15, 996kB/s]
 20%|███████▌                             | 19.2M/93.8M [00:17<01:09, 1.07MB/s]
 21%|███████▌                             | 19.3M/93.8M [00:18<01:08, 1.09MB/s]
 21%|███████▋                             | 19.4M/93.8M [00:18<01:07, 1.10MB/s]
 21%|███████▋                             | 19.6M/93.8M [00:18<01:06, 1.12MB/s]
 21%|███████▊                             | 19.7M/93.8M [00:18<01:04, 1.14MB/s]
 21%|████████                              | 19.8M/93.8M [00:18<01:16, 967kB/s]
 21%|███████▊                             | 19.9M/93.8M [00:18<01:13, 1.01MB/s]
 21%|███████▉                             | 20.0M/93.8M [00:18<01:10, 1.04MB/s]
 22%|███████▉                             | 20.2M/93.8M [00:18<00:57, 1.29MB/s]
 22%|████████                             | 20.4M/93.8M [00:18<00:56, 1.30MB/s]
 22%|████████                             | 20.5M/93.8M [00:19<00:55, 1.32MB/s]
 22%|████████▏                            | 20.6M/93.8M [00:19<00:55, 1.32MB/s]
 22%|████████▏                            | 20.8M/93.8M [00:19<01:10, 1.03MB/s]
 22%|████████▏                            | 20.9M/93.8M [00:19<01:08, 1.06MB/s]
 22%|████████▎                            | 21.0M/93.8M [00:19<01:04, 1.13MB/s]
 23%|████████▎                            | 21.2M/93.8M [00:19<01:02, 1.16MB/s]
 23%|████████▌                             | 21.3M/93.8M [00:19<01:18, 926kB/s]
 23%|████████▍                            | 21.4M/93.8M [00:19<01:12, 1.00MB/s]
 23%|████████▍                            | 21.5M/93.8M [00:20<01:10, 1.03MB/s]
 23%|████████▌                            | 21.7M/93.8M [00:20<01:04, 1.11MB/s]
 23%|████████▌                            | 21.8M/93.8M [00:20<01:02, 1.14MB/s]
 23%|████████▋                            | 21.9M/93.8M [00:20<01:01, 1.17MB/s]
 23%|████████▉                             | 22.0M/93.8M [00:20<01:18, 911kB/s]
 24%|████████▋                            | 22.2M/93.8M [00:20<01:09, 1.03MB/s]
 24%|████████▊                            | 22.3M/93.8M [00:20<01:07, 1.06MB/s]
 24%|████████▊                            | 22.4M/93.8M [00:20<01:06, 1.08MB/s]
 24%|████████▉                            | 22.5M/93.8M [00:20<01:05, 1.09MB/s]
 24%|████████▉                            | 22.6M/93.8M [00:21<01:04, 1.11MB/s]
 24%|████████▉                            | 22.7M/93.8M [00:21<01:00, 1.16MB/s]
 24%|█████████▎                            | 22.9M/93.8M [00:21<01:17, 911kB/s]
 25%|█████████▎                            | 23.0M/93.8M [00:21<01:13, 963kB/s]
 25%|█████████▎                            | 23.1M/93.8M [00:21<01:11, 984kB/s]
 25%|█████████▏                           | 23.2M/93.8M [00:21<01:10, 1.00MB/s]
 25%|█████████▏                           | 23.3M/93.8M [00:21<01:04, 1.09MB/s]
 25%|█████████▍                            | 23.4M/93.8M [00:21<01:22, 858kB/s]
 25%|█████████▌                            | 23.6M/93.8M [00:22<01:11, 977kB/s]
 25%|█████████▎                           | 23.7M/93.8M [00:22<01:09, 1.00MB/s]
 25%|█████████▍                           | 23.8M/93.8M [00:22<01:04, 1.09MB/s]
 26%|█████████▍                           | 23.9M/93.8M [00:22<01:03, 1.11MB/s]
 26%|█████████▍                           | 24.1M/93.8M [00:22<00:59, 1.16MB/s]
 26%|█████████▊                            | 24.2M/93.8M [00:22<01:15, 916kB/s]
 26%|█████████▌                           | 24.3M/93.8M [00:22<01:08, 1.01MB/s]
 26%|█████████▋                           | 24.4M/93.8M [00:22<01:07, 1.03MB/s]
 26%|█████████▋                           | 24.6M/93.8M [00:22<00:59, 1.16MB/s]
 26%|██████████                            | 24.7M/93.8M [00:23<01:14, 924kB/s]
 26%|██████████                            | 24.8M/93.8M [00:23<01:12, 952kB/s]
 27%|██████████                            | 24.9M/93.8M [00:23<01:10, 975kB/s]
 27%|█████████▊                           | 25.0M/93.8M [00:23<01:08, 1.00MB/s]
 27%|█████████▉                           | 25.1M/93.8M [00:23<01:05, 1.04MB/s]
 27%|█████████▉                           | 25.2M/93.8M [00:23<01:05, 1.05MB/s]
 27%|██████████                           | 25.4M/93.8M [00:23<00:58, 1.17MB/s]
 27%|██████████▎                           | 25.5M/93.8M [00:23<01:14, 916kB/s]
 27%|██████████                           | 25.6M/93.8M [00:24<01:07, 1.01MB/s]
 28%|██████████▏                          | 25.8M/93.8M [00:24<00:55, 1.22MB/s]
 28%|██████████▏                          | 26.0M/93.8M [00:24<00:52, 1.28MB/s]
 28%|██████████▎                          | 26.1M/93.8M [00:24<00:51, 1.30MB/s]
 28%|██████████▎                          | 26.2M/93.8M [00:24<00:51, 1.32MB/s]
 28%|██████████▍                          | 26.4M/93.8M [00:24<01:05, 1.04MB/s]
 28%|██████████▍                          | 26.5M/93.8M [00:24<00:59, 1.12MB/s]
 28%|██████████▌                          | 26.6M/93.8M [00:24<00:58, 1.15MB/s]
 29%|██████████▌                          | 26.7M/93.8M [00:24<00:56, 1.18MB/s]
 29%|██████████▉                           | 26.9M/93.8M [00:25<01:11, 938kB/s]
 29%|██████████▉                           | 27.0M/93.8M [00:25<01:09, 965kB/s]
 29%|██████████▋                          | 27.2M/93.8M [00:25<00:56, 1.17MB/s]
 29%|██████████▊                          | 27.3M/93.8M [00:25<00:50, 1.30MB/s]
 29%|██████████▊                          | 27.5M/93.8M [00:25<01:03, 1.05MB/s]
 29%|██████████▉                          | 27.6M/93.8M [00:25<00:53, 1.23MB/s]
 30%|██████████▉                          | 27.8M/93.8M [00:25<00:52, 1.27MB/s]
 30%|███████████                          | 27.9M/93.8M [00:25<00:50, 1.30MB/s]
 30%|███████████                          | 28.1M/93.8M [00:26<01:03, 1.04MB/s]
 30%|███████████▏                         | 28.2M/93.8M [00:26<00:57, 1.15MB/s]
 30%|███████████▏                         | 28.3M/93.8M [00:26<00:55, 1.18MB/s]
 30%|███████████▏                         | 28.5M/93.8M [00:26<00:54, 1.20MB/s]
 30%|███████████▎                         | 28.6M/93.8M [00:26<00:53, 1.22MB/s]
 31%|███████████▋                          | 28.7M/93.8M [00:26<01:06, 971kB/s]
 31%|███████████▋                          | 28.8M/93.8M [00:26<01:05, 995kB/s]
 31%|███████████▍                         | 29.0M/93.8M [00:26<01:00, 1.08MB/s]
 31%|███████████▍                         | 29.1M/93.8M [00:27<00:55, 1.16MB/s]
 31%|███████████▊                          | 29.2M/93.8M [00:27<01:07, 955kB/s]
 31%|███████████▌                         | 29.4M/93.8M [00:27<01:04, 1.00MB/s]
 31%|███████████▋                         | 29.5M/93.8M [00:27<01:02, 1.04MB/s]
 32%|███████████▋                         | 29.7M/93.8M [00:27<00:50, 1.28MB/s]
 32%|███████████▊                         | 29.8M/93.8M [00:27<00:48, 1.31MB/s]
 32%|███████████▊                         | 29.9M/93.8M [00:27<00:48, 1.32MB/s]
 32%|███████████▊                         | 30.1M/93.8M [00:27<00:47, 1.34MB/s]
 32%|███████████▉                         | 30.3M/93.8M [00:28<00:56, 1.13MB/s]
 32%|███████████▉                         | 30.4M/93.8M [00:28<00:54, 1.15MB/s]
 33%|████████████                         | 30.5M/93.8M [00:28<00:54, 1.17MB/s]
 33%|████████████                         | 30.6M/93.8M [00:28<00:53, 1.18MB/s]
 33%|████████████▏                        | 30.7M/93.8M [00:28<00:52, 1.20MB/s]
 33%|████████████▏                        | 30.9M/93.8M [00:28<00:43, 1.43MB/s]
 33%|████████████▎                        | 31.1M/93.8M [00:28<00:43, 1.44MB/s]
 33%|████████████▎                        | 31.2M/93.8M [00:28<00:43, 1.44MB/s]
 33%|████████████▍                        | 31.4M/93.8M [00:28<00:55, 1.12MB/s]
 34%|████████████▍                        | 31.5M/93.8M [00:29<00:53, 1.15MB/s]
 34%|████████████▊                         | 31.6M/93.8M [00:29<01:06, 939kB/s]
 34%|████████████▊                         | 31.7M/93.8M [00:29<01:04, 967kB/s]
 34%|████████████▌                        | 31.9M/93.8M [00:29<00:55, 1.11MB/s]
 34%|████████████▋                        | 32.0M/93.8M [00:29<00:52, 1.18MB/s]
 34%|████████████▋                        | 32.2M/93.8M [00:29<00:50, 1.22MB/s]
 34%|█████████████                         | 32.3M/93.8M [00:29<01:03, 968kB/s]
 35%|████████████▊                        | 32.4M/93.8M [00:29<01:00, 1.02MB/s]
 35%|████████████▊                        | 32.6M/93.8M [00:30<00:54, 1.12MB/s]
 35%|█████████████▏                        | 32.7M/93.8M [00:30<01:07, 906kB/s]
 35%|█████████████▎                        | 32.8M/93.8M [00:30<01:02, 969kB/s]
 35%|█████████████▎                        | 32.9M/93.8M [00:30<01:01, 995kB/s]
 35%|█████████████                        | 33.0M/93.8M [00:30<00:59, 1.02MB/s]
 35%|█████████████                        | 33.1M/93.8M [00:30<00:58, 1.04MB/s]
 35%|█████████████                        | 33.2M/93.8M [00:30<00:57, 1.05MB/s]
 36%|█████████████▌                        | 33.3M/93.8M [00:30<01:13, 827kB/s]
 36%|█████████████▌                        | 33.5M/93.8M [00:31<01:05, 923kB/s]
 36%|█████████████▌                        | 33.6M/93.8M [00:31<01:01, 981kB/s]
 36%|█████████████▎                       | 33.7M/93.8M [00:31<00:59, 1.01MB/s]
 36%|█████████████▎                       | 33.8M/93.8M [00:31<00:58, 1.02MB/s]
 36%|█████████████▎                       | 33.9M/93.8M [00:31<00:57, 1.03MB/s]
 36%|█████████████▍                       | 34.1M/93.8M [00:31<00:45, 1.30MB/s]
 36%|█████████████▌                       | 34.2M/93.8M [00:31<00:45, 1.31MB/s]
 37%|█████████████▌                       | 34.4M/93.8M [00:31<00:58, 1.02MB/s]
 37%|█████████████▌                       | 34.5M/93.8M [00:31<00:56, 1.05MB/s]
 37%|█████████████▋                       | 34.6M/93.8M [00:32<00:53, 1.11MB/s]
 37%|██████████████                        | 34.7M/93.8M [00:32<01:06, 893kB/s]
 37%|██████████████                        | 34.8M/93.8M [00:32<01:01, 952kB/s]
 37%|██████████████▏                       | 34.9M/93.8M [00:32<00:59, 983kB/s]
 37%|█████████████▊                       | 35.1M/93.8M [00:32<00:53, 1.10MB/s]
 38%|█████████████▉                       | 35.2M/93.8M [00:32<00:52, 1.12MB/s]
 38%|█████████████▉                       | 35.3M/93.8M [00:32<00:49, 1.18MB/s]
 38%|█████████████▉                       | 35.5M/93.8M [00:32<00:49, 1.19MB/s]
 38%|██████████████▍                       | 35.6M/93.8M [00:33<01:01, 942kB/s]
 38%|██████████████▍                       | 35.7M/93.8M [00:33<01:00, 966kB/s]
 38%|██████████████▏                      | 35.8M/93.8M [00:33<00:55, 1.04MB/s]
 38%|██████████████▏                      | 35.9M/93.8M [00:33<00:54, 1.06MB/s]
 38%|██████████████▏                      | 36.0M/93.8M [00:33<00:52, 1.09MB/s]
 39%|██████████████▎                      | 36.2M/93.8M [00:33<00:52, 1.10MB/s]
 39%|██████████████▎                      | 36.3M/93.8M [00:33<00:51, 1.11MB/s]
 39%|██████████████▎                      | 36.4M/93.8M [00:33<00:51, 1.12MB/s]
 39%|██████████████▍                      | 36.5M/93.8M [00:33<00:50, 1.13MB/s]
 39%|██████████████▍                      | 36.6M/93.8M [00:33<00:47, 1.19MB/s]
 39%|██████████████▌                      | 36.8M/93.8M [00:34<00:47, 1.20MB/s]
 39%|██████████████▌                      | 36.9M/93.8M [00:34<00:47, 1.20MB/s]
 39%|██████████████▌                      | 37.0M/93.8M [00:34<00:44, 1.27MB/s]
 40%|██████████████▋                      | 37.2M/93.8M [00:34<00:50, 1.12MB/s]
 40%|██████████████▋                      | 37.3M/93.8M [00:34<00:46, 1.21MB/s]
 40%|██████████████▊                      | 37.5M/93.8M [00:34<00:44, 1.27MB/s]
 40%|██████████████▊                      | 37.6M/93.8M [00:34<00:42, 1.32MB/s]
 40%|██████████████▉                      | 37.8M/93.8M [00:34<00:42, 1.33MB/s]
 40%|██████████████▉                      | 37.9M/93.8M [00:34<00:41, 1.35MB/s]
 41%|███████████████                      | 38.1M/93.8M [00:35<00:41, 1.36MB/s]
 41%|███████████████                      | 38.2M/93.8M [00:35<00:40, 1.36MB/s]
 41%|███████████████▏                     | 38.4M/93.8M [00:35<00:32, 1.68MB/s]
 41%|███████████████▎                     | 38.7M/93.8M [00:35<00:30, 1.81MB/s]
 41%|███████████████▎                     | 38.8M/93.8M [00:35<00:39, 1.41MB/s]
 42%|███████████████▍                     | 39.0M/93.8M [00:35<00:37, 1.44MB/s]
 42%|███████████████▍                     | 39.2M/93.8M [00:35<00:37, 1.47MB/s]
 42%|███████████████▌                     | 39.3M/93.8M [00:35<00:36, 1.50MB/s]
 42%|███████████████▌                     | 39.5M/93.8M [00:35<00:35, 1.52MB/s]
 42%|███████████████▋                     | 39.6M/93.8M [00:36<00:45, 1.19MB/s]
 42%|███████████████▋                     | 39.8M/93.8M [00:36<00:44, 1.23MB/s]
 43%|███████████████▋                     | 39.9M/93.8M [00:36<00:43, 1.25MB/s]
 43%|███████████████▊                     | 40.0M/93.8M [00:36<00:42, 1.27MB/s]
 43%|███████████████▊                     | 40.2M/93.8M [00:36<00:41, 1.29MB/s]
 43%|███████████████▉                     | 40.3M/93.8M [00:36<00:42, 1.27MB/s]
 43%|███████████████▉                     | 40.4M/93.8M [00:36<00:41, 1.29MB/s]
 43%|████████████████                     | 40.6M/93.8M [00:36<00:52, 1.01MB/s]
 43%|████████████████                     | 40.7M/93.8M [00:37<00:51, 1.04MB/s]
 44%|████████████████                     | 40.8M/93.8M [00:37<00:44, 1.19MB/s]
 44%|████████████████▏                    | 41.0M/93.8M [00:37<00:43, 1.21MB/s]
 44%|████████████████▏                    | 41.1M/93.8M [00:37<00:42, 1.23MB/s]
 44%|████████████████▎                    | 41.2M/93.8M [00:37<00:42, 1.24MB/s]
 44%|████████████████▎                    | 41.4M/93.8M [00:37<00:36, 1.42MB/s]
 44%|████████████████▍                    | 41.5M/93.8M [00:37<00:36, 1.43MB/s]
 45%|████████████████▍                    | 41.8M/93.8M [00:37<00:31, 1.65MB/s]
 45%|████████████████▌                    | 41.9M/93.8M [00:37<00:31, 1.65MB/s]
 45%|████████████████▌                    | 42.1M/93.8M [00:37<00:31, 1.65MB/s]
 45%|████████████████▋                    | 42.3M/93.8M [00:38<00:40, 1.27MB/s]
 45%|████████████████▊                    | 42.5M/93.8M [00:38<00:33, 1.54MB/s]
 46%|████████████████▊                    | 42.7M/93.8M [00:38<00:32, 1.58MB/s]
 46%|████████████████▉                    | 42.8M/93.8M [00:38<00:31, 1.61MB/s]
 46%|████████████████▉                    | 43.0M/93.8M [00:38<00:39, 1.28MB/s]
 46%|█████████████████                    | 43.2M/93.8M [00:38<00:38, 1.32MB/s]
 46%|█████████████████                    | 43.3M/93.8M [00:38<00:37, 1.34MB/s]
 46%|█████████████████▏                   | 43.5M/93.8M [00:38<00:33, 1.51MB/s]
 47%|█████████████████▏                   | 43.7M/93.8M [00:39<00:41, 1.20MB/s]
 47%|█████████████████▎                   | 43.8M/93.8M [00:39<00:40, 1.24MB/s]
 47%|█████████████████▎                   | 43.9M/93.8M [00:39<00:39, 1.27MB/s]
 47%|█████████████████▍                   | 44.1M/93.8M [00:39<00:38, 1.30MB/s]
 47%|█████████████████▍                   | 44.2M/93.8M [00:39<00:37, 1.32MB/s]
 47%|█████████████████▍                   | 44.3M/93.8M [00:39<00:37, 1.33MB/s]
 47%|█████████████████▌                   | 44.5M/93.8M [00:39<00:34, 1.42MB/s]
 48%|█████████████████▌                   | 44.7M/93.8M [00:39<00:33, 1.47MB/s]
 48%|█████████████████▋                   | 44.8M/93.8M [00:39<00:32, 1.51MB/s]
 48%|█████████████████▋                   | 45.0M/93.8M [00:40<00:32, 1.52MB/s]
 48%|█████████████████▊                   | 45.1M/93.8M [00:40<00:39, 1.22MB/s]
 48%|█████████████████▊                   | 45.3M/93.8M [00:40<00:37, 1.28MB/s]
 48%|█████████████████▉                   | 45.4M/93.8M [00:40<00:37, 1.30MB/s]
 49%|█████████████████▉                   | 45.6M/93.8M [00:40<00:36, 1.31MB/s]
 49%|██████████████████                   | 45.7M/93.8M [00:40<00:36, 1.33MB/s]
 49%|██████████████████                   | 45.8M/93.8M [00:40<00:35, 1.33MB/s]
 49%|██████████████████▏                  | 46.0M/93.8M [00:40<00:45, 1.05MB/s]
 49%|██████████████████▏                  | 46.1M/93.8M [00:41<00:44, 1.08MB/s]
 49%|██████████████████▎                  | 46.3M/93.8M [00:41<00:39, 1.22MB/s]
 49%|██████████████████▎                  | 46.4M/93.8M [00:41<00:38, 1.24MB/s]
 50%|██████████████████▎                  | 46.5M/93.8M [00:41<00:37, 1.26MB/s]
 50%|██████████████████▍                  | 46.7M/93.8M [00:41<00:33, 1.41MB/s]
 50%|██████████████████▍                  | 46.8M/93.8M [00:41<00:33, 1.42MB/s]
 50%|██████████████████▌                  | 47.1M/93.8M [00:41<00:28, 1.63MB/s]
 50%|██████████████████▋                  | 47.2M/93.8M [00:41<00:28, 1.63MB/s]
 51%|██████████████████▋                  | 47.4M/93.8M [00:41<00:28, 1.64MB/s]
 51%|██████████████████▊                  | 47.6M/93.8M [00:42<00:28, 1.64MB/s]
 51%|██████████████████▊                  | 47.7M/93.8M [00:42<00:36, 1.27MB/s]
 51%|██████████████████▉                  | 47.9M/93.8M [00:42<00:35, 1.29MB/s]
 51%|██████████████████▉                  | 48.0M/93.8M [00:42<00:34, 1.32MB/s]
 51%|██████████████████▉                  | 48.1M/93.8M [00:42<00:33, 1.34MB/s]
 52%|███████████████████                  | 48.3M/93.8M [00:42<00:30, 1.48MB/s]
 52%|███████████████████▏                 | 48.5M/93.8M [00:42<00:30, 1.49MB/s]
 52%|███████████████████▏                 | 48.7M/93.8M [00:42<00:26, 1.69MB/s]
 52%|███████████████████▎                 | 48.9M/93.8M [00:42<00:26, 1.69MB/s]
 52%|███████████████████▎                 | 49.0M/93.8M [00:43<00:26, 1.70MB/s]
 52%|███████████████████▍                 | 49.2M/93.8M [00:43<00:33, 1.32MB/s]
 53%|███████████████████▍                 | 49.4M/93.8M [00:43<00:32, 1.35MB/s]
 53%|███████████████████▌                 | 49.6M/93.8M [00:43<00:27, 1.60MB/s]
 53%|███████████████████▋                 | 49.8M/93.8M [00:43<00:26, 1.63MB/s]
 53%|███████████████████▋                 | 49.9M/93.8M [00:43<00:33, 1.30MB/s]
 53%|███████████████████▊                 | 50.1M/93.8M [00:43<00:32, 1.33MB/s]
 54%|███████████████████▊                 | 50.2M/93.8M [00:43<00:31, 1.39MB/s]
 54%|███████████████████▉                 | 50.4M/93.8M [00:44<00:30, 1.41MB/s]
 54%|███████████████████▉                 | 50.5M/93.8M [00:44<00:38, 1.13MB/s]
 54%|███████████████████▉                 | 50.7M/93.8M [00:44<00:37, 1.16MB/s]
 54%|████████████████████                 | 50.8M/93.8M [00:44<00:35, 1.19MB/s]
 54%|████████████████████                 | 50.9M/93.8M [00:44<00:33, 1.27MB/s]
 55%|████████████████████▏                | 51.2M/93.8M [00:44<00:27, 1.55MB/s]
 55%|████████████████████▎                | 51.5M/93.8M [00:44<00:19, 2.16MB/s]
 55%|████████████████████▍                | 51.8M/93.8M [00:44<00:18, 2.26MB/s]
 55%|████████████████████▌                | 52.0M/93.8M [00:45<00:23, 1.77MB/s]
 56%|████████████████████▌                | 52.2M/93.8M [00:45<00:22, 1.81MB/s]
 56%|████████████████████▋                | 52.4M/93.8M [00:45<00:22, 1.85MB/s]
 56%|████████████████████▊                | 52.6M/93.8M [00:45<00:21, 1.88MB/s]
 56%|████████████████████▊                | 52.8M/93.8M [00:45<00:20, 1.97MB/s]
 57%|████████████████████▉                | 53.0M/93.8M [00:45<00:20, 1.99MB/s]
 57%|█████████████████████                | 53.3M/93.8M [00:45<00:19, 2.05MB/s]
 57%|█████████████████████                | 53.5M/93.8M [00:45<00:19, 2.06MB/s]
 57%|█████████████████████▏               | 53.8M/93.8M [00:45<00:20, 1.95MB/s]
 58%|█████████████████████▎               | 54.0M/93.8M [00:46<00:20, 1.96MB/s]
 58%|█████████████████████▍               | 54.3M/93.8M [00:46<00:19, 2.03MB/s]
 58%|█████████████████████▌               | 54.5M/93.8M [00:46<00:18, 2.13MB/s]
 58%|█████████████████████▌               | 54.7M/93.8M [00:46<00:18, 2.14MB/s]
 59%|█████████████████████▋               | 54.9M/93.8M [00:46<00:18, 2.14MB/s]
 59%|█████████████████████▊               | 55.4M/93.8M [00:46<00:12, 2.96MB/s]
 59%|█████████████████████▉               | 55.7M/93.8M [00:46<00:16, 2.30MB/s]
 60%|██████████████████████               | 56.0M/93.8M [00:46<00:19, 1.90MB/s]
 60%|██████████████████████▏              | 56.2M/93.8M [00:47<00:19, 1.96MB/s]
 60%|██████████████████████▎              | 56.4M/93.8M [00:47<00:22, 1.63MB/s]
 60%|██████████████████████▎              | 56.6M/93.8M [00:47<00:22, 1.67MB/s]
 61%|██████████████████████▍              | 56.8M/93.8M [00:47<00:21, 1.71MB/s]
 61%|██████████████████████▍              | 57.0M/93.8M [00:47<00:21, 1.74MB/s]
 61%|██████████████████████▌              | 57.2M/93.8M [00:47<00:19, 1.86MB/s]
 61%|██████████████████████▋              | 57.4M/93.8M [00:47<00:18, 1.93MB/s]
 61%|██████████████████████▋              | 57.6M/93.8M [00:47<00:23, 1.52MB/s]
 62%|██████████████████████▊              | 57.8M/93.8M [00:48<00:22, 1.60MB/s]
 62%|██████████████████████▉              | 58.0M/93.8M [00:48<00:20, 1.72MB/s]
 62%|██████████████████████▉              | 58.2M/93.8M [00:48<00:19, 1.78MB/s]
 62%|███████████████████████              | 58.4M/93.8M [00:48<00:18, 1.92MB/s]
 63%|███████████████████████▏             | 58.6M/93.8M [00:48<00:18, 1.93MB/s]
 63%|███████████████████████▏             | 58.8M/93.8M [00:48<00:17, 1.95MB/s]
 63%|███████████████████████▎             | 59.0M/93.8M [00:48<00:22, 1.52MB/s]
 63%|███████████████████████▍             | 59.3M/93.8M [00:48<00:19, 1.73MB/s]
 63%|███████████████████████▍             | 59.5M/93.8M [00:48<00:19, 1.77MB/s]
 64%|███████████████████████▌             | 59.6M/93.8M [00:49<00:23, 1.42MB/s]
 64%|███████████████████████▌             | 59.8M/93.8M [00:49<00:23, 1.46MB/s]
 64%|███████████████████████▋             | 60.0M/93.8M [00:49<00:22, 1.50MB/s]
 64%|███████████████████████▋             | 60.1M/93.8M [00:49<00:21, 1.55MB/s]
 64%|███████████████████████▊             | 60.3M/93.8M [00:49<00:27, 1.24MB/s]
 64%|███████████████████████▊             | 60.4M/93.8M [00:49<00:26, 1.27MB/s]
 65%|███████████████████████▉             | 60.7M/93.8M [00:49<00:21, 1.52MB/s]
 65%|████████████████████████             | 60.8M/93.8M [00:49<00:20, 1.59MB/s]
 65%|████████████████████████             | 61.0M/93.8M [00:50<00:19, 1.69MB/s]
 65%|████████████████████████▏            | 61.2M/93.8M [00:50<00:19, 1.71MB/s]
 66%|████████████████████████▏            | 61.4M/93.8M [00:50<00:17, 1.83MB/s]
 66%|████████████████████████▎            | 61.6M/93.8M [00:50<00:17, 1.84MB/s]
 66%|████████████████████████▍            | 61.8M/93.8M [00:50<00:17, 1.85MB/s]
 66%|████████████████████████▍            | 62.0M/93.8M [00:50<00:17, 1.85MB/s]
 66%|████████████████████████▌            | 62.2M/93.8M [00:50<00:21, 1.44MB/s]
 66%|████████████████████████▌            | 62.3M/93.8M [00:50<00:21, 1.48MB/s]
 67%|████████████████████████▋            | 62.5M/93.8M [00:50<00:20, 1.53MB/s]
 67%|████████████████████████▋            | 62.7M/93.8M [00:51<00:19, 1.56MB/s]
 67%|████████████████████████▊            | 62.9M/93.8M [00:51<00:17, 1.72MB/s]
 67%|████████████████████████▉            | 63.1M/93.8M [00:51<00:16, 1.88MB/s]
 68%|████████████████████████▉            | 63.3M/93.8M [00:51<00:15, 1.95MB/s]
 68%|█████████████████████████            | 63.6M/93.8M [00:51<00:13, 2.19MB/s]
 68%|█████████████████████████▏           | 63.9M/93.8M [00:51<00:13, 2.26MB/s]
 68%|█████████████████████████▎           | 64.1M/93.8M [00:51<00:13, 2.27MB/s]
 69%|█████████████████████████▍           | 64.3M/93.8M [00:51<00:12, 2.27MB/s]
 69%|█████████████████████████▍           | 64.5M/93.8M [00:51<00:12, 2.27MB/s]
 69%|█████████████████████████▌           | 64.8M/93.8M [00:51<00:12, 2.27MB/s]
 69%|█████████████████████████▋           | 65.0M/93.8M [00:52<00:15, 1.83MB/s]
 70%|█████████████████████████▋           | 65.2M/93.8M [00:52<00:15, 1.87MB/s]
 70%|█████████████████████████▊           | 65.5M/93.8M [00:52<00:16, 1.74MB/s]
 70%|█████████████████████████▉           | 65.8M/93.8M [00:52<00:13, 2.01MB/s]
 70%|██████████████████████████           | 66.1M/93.8M [00:52<00:13, 2.05MB/s]
 71%|██████████████████████████▏          | 66.4M/93.8M [00:52<00:10, 2.52MB/s]
 71%|██████████████████████████▎          | 66.7M/93.8M [00:53<00:16, 1.67MB/s]
 71%|██████████████████████████▍          | 66.9M/93.8M [00:53<00:15, 1.77MB/s]
 72%|██████████████████████████▍          | 67.1M/93.8M [00:53<00:14, 1.86MB/s]
 72%|██████████████████████████▌          | 67.4M/93.8M [00:53<00:13, 1.93MB/s]
 72%|██████████████████████████▋          | 67.6M/93.8M [00:53<00:13, 1.99MB/s]
 72%|██████████████████████████▋          | 67.8M/93.8M [00:53<00:16, 1.61MB/s]
 72%|██████████████████████████▊          | 68.0M/93.8M [00:53<00:15, 1.66MB/s]
 73%|██████████████████████████▉          | 68.2M/93.8M [00:53<00:14, 1.77MB/s]
 73%|██████████████████████████▉          | 68.4M/93.8M [00:53<00:13, 1.92MB/s]
 73%|███████████████████████████          | 68.6M/93.8M [00:54<00:12, 1.99MB/s]
 73%|███████████████████████████▏         | 68.8M/93.8M [00:54<00:12, 2.01MB/s]
 74%|███████████████████████████▏         | 69.1M/93.8M [00:54<00:12, 2.03MB/s]
 74%|███████████████████████████▎         | 69.3M/93.8M [00:54<00:11, 2.07MB/s]
 74%|███████████████████████████▍         | 69.5M/93.8M [00:54<00:11, 2.08MB/s]
 74%|███████████████████████████▌         | 69.7M/93.8M [00:54<00:14, 1.62MB/s]
 75%|███████████████████████████▌         | 69.9M/93.8M [00:54<00:14, 1.66MB/s]
 75%|███████████████████████████▋         | 70.1M/93.8M [00:54<00:17, 1.34MB/s]
 75%|███████████████████████████▋         | 70.3M/93.8M [00:55<00:14, 1.62MB/s]
 75%|███████████████████████████▊         | 70.5M/93.8M [00:55<00:13, 1.75MB/s]
 75%|███████████████████████████▉         | 70.7M/93.8M [00:55<00:12, 1.80MB/s]
 76%|████████████████████████████         | 71.0M/93.8M [00:55<00:11, 1.97MB/s]
 76%|████████████████████████████         | 71.2M/93.8M [00:55<00:11, 2.00MB/s]
 76%|████████████████████████████▏        | 71.4M/93.8M [00:55<00:11, 2.02MB/s]
 76%|████████████████████████████▎        | 71.6M/93.8M [00:55<00:14, 1.58MB/s]
 77%|████████████████████████████▎        | 71.8M/93.8M [00:55<00:13, 1.62MB/s]
 77%|████████████████████████████▍        | 72.0M/93.8M [00:55<00:11, 1.89MB/s]
 77%|████████████████████████████▌        | 72.2M/93.8M [00:56<00:11, 1.92MB/s]
 77%|████████████████████████████▌        | 72.4M/93.8M [00:56<00:10, 1.95MB/s]
 78%|████████████████████████████▋        | 72.7M/93.8M [00:56<00:09, 2.13MB/s]
 78%|████████████████████████████▊        | 72.9M/93.8M [00:56<00:09, 2.15MB/s]
 78%|████████████████████████████▊        | 73.1M/93.8M [00:56<00:09, 2.16MB/s]
 78%|████████████████████████████▉        | 73.4M/93.8M [00:56<00:14, 1.38MB/s]
 78%|█████████████████████████████        | 73.6M/93.8M [00:56<00:12, 1.56MB/s]
 79%|█████████████████████████████        | 73.8M/93.8M [00:56<00:12, 1.63MB/s]
 79%|█████████████████████████████▏       | 74.0M/93.8M [00:57<00:11, 1.70MB/s]
 79%|█████████████████████████████▎       | 74.2M/93.8M [00:57<00:14, 1.39MB/s]
 79%|█████████████████████████████▎       | 74.3M/93.8M [00:57<00:13, 1.44MB/s]
 79%|█████████████████████████████▍       | 74.5M/93.8M [00:57<00:12, 1.49MB/s]
 80%|█████████████████████████████▍       | 74.6M/93.8M [00:57<00:12, 1.52MB/s]
 80%|█████████████████████████████▌       | 74.8M/93.8M [00:57<00:12, 1.54MB/s]
 80%|█████████████████████████████▌       | 75.0M/93.8M [00:57<00:15, 1.23MB/s]
 80%|█████████████████████████████▋       | 75.1M/93.8M [00:57<00:14, 1.26MB/s]
 80%|█████████████████████████████▋       | 75.2M/93.8M [00:58<00:14, 1.29MB/s]
 80%|█████████████████████████████▊       | 75.4M/93.8M [00:58<00:12, 1.49MB/s]
 81%|█████████████████████████████▊       | 75.6M/93.8M [00:58<00:11, 1.52MB/s]
 81%|█████████████████████████████▉       | 75.8M/93.8M [00:58<00:11, 1.54MB/s]
 81%|█████████████████████████████▉       | 76.0M/93.8M [00:58<00:13, 1.29MB/s]
 81%|██████████████████████████████       | 76.1M/93.8M [00:58<00:13, 1.31MB/s]
 81%|██████████████████████████████       | 76.3M/93.8M [00:58<00:11, 1.54MB/s]
 82%|██████████████████████████████▏      | 76.5M/93.8M [00:58<00:09, 1.74MB/s]
 82%|██████████████████████████████▎      | 76.8M/93.8M [00:58<00:09, 1.84MB/s]
 82%|██████████████████████████████▎      | 77.0M/93.8M [00:59<00:08, 1.87MB/s]
 82%|██████████████████████████████▍      | 77.1M/93.8M [00:59<00:08, 1.89MB/s]
 82%|██████████████████████████████▌      | 77.3M/93.8M [00:59<00:08, 1.90MB/s]
 83%|██████████████████████████████▌      | 77.5M/93.8M [00:59<00:08, 1.90MB/s]
 83%|██████████████████████████████▋      | 77.7M/93.8M [00:59<00:08, 1.90MB/s]
 83%|██████████████████████████████▊      | 78.0M/93.8M [00:59<00:07, 2.00MB/s]
 83%|██████████████████████████████▊      | 78.2M/93.8M [00:59<00:07, 2.09MB/s]
 84%|██████████████████████████████▉      | 78.4M/93.8M [00:59<00:07, 2.10MB/s]
 84%|███████████████████████████████      | 78.6M/93.8M [00:59<00:07, 2.09MB/s]
 84%|███████████████████████████████      | 78.8M/93.8M [01:00<00:09, 1.61MB/s]
 84%|███████████████████████████████▏     | 79.0M/93.8M [01:00<00:08, 1.65MB/s]
 84%|███████████████████████████████▏     | 79.2M/93.8M [01:00<00:08, 1.68MB/s]
 85%|███████████████████████████████▎     | 79.4M/93.8M [01:00<00:07, 1.87MB/s]
 85%|███████████████████████████████▍     | 79.6M/93.8M [01:00<00:07, 1.89MB/s]
 85%|███████████████████████████████▌     | 79.9M/93.8M [01:00<00:06, 2.11MB/s]
 85%|███████████████████████████████▌     | 80.1M/93.8M [01:00<00:08, 1.66MB/s]
 86%|███████████████████████████████▋     | 80.3M/93.8M [01:00<00:07, 1.76MB/s]
 86%|███████████████████████████████▊     | 80.5M/93.8M [01:00<00:07, 1.79MB/s]
 86%|███████████████████████████████▊     | 80.7M/93.8M [01:01<00:06, 2.00MB/s]
 86%|███████████████████████████████▉     | 81.0M/93.8M [01:01<00:08, 1.59MB/s]
 87%|████████████████████████████████     | 81.2M/93.8M [01:01<00:07, 1.77MB/s]
 87%|████████████████████████████████     | 81.4M/93.8M [01:01<00:08, 1.46MB/s]
 87%|████████████████████████████████▏    | 81.6M/93.8M [01:01<00:07, 1.56MB/s]
 87%|████████████████████████████████▎    | 81.8M/93.8M [01:01<00:07, 1.61MB/s]
 87%|████████████████████████████████▎    | 81.9M/93.8M [01:01<00:09, 1.31MB/s]
 88%|████████████████████████████████▍    | 82.1M/93.8M [01:02<00:08, 1.35MB/s]
 88%|████████████████████████████████▍    | 82.3M/93.8M [01:02<00:07, 1.49MB/s]
 88%|████████████████████████████████▌    | 82.5M/93.8M [01:02<00:07, 1.57MB/s]
 88%|████████████████████████████████▌    | 82.7M/93.8M [01:02<00:06, 1.75MB/s]
 88%|████████████████████████████████▋    | 82.9M/93.8M [01:02<00:06, 1.77MB/s]
 89%|████████████████████████████████▊    | 83.0M/93.8M [01:02<00:05, 1.79MB/s]
 89%|████████████████████████████████▊    | 83.3M/93.8M [01:02<00:05, 1.95MB/s]
 89%|████████████████████████████████▉    | 83.5M/93.8M [01:02<00:04, 2.10MB/s]
 89%|█████████████████████████████████    | 83.7M/93.8M [01:02<00:06, 1.63MB/s]
 89%|█████████████████████████████████    | 83.9M/93.8M [01:03<00:05, 1.67MB/s]
 90%|█████████████████████████████████▏   | 84.1M/93.8M [01:03<00:05, 1.72MB/s]
 90%|█████████████████████████████████▎   | 84.3M/93.8M [01:03<00:05, 1.74MB/s]
 90%|█████████████████████████████████▎   | 84.5M/93.8M [01:03<00:05, 1.76MB/s]
 90%|█████████████████████████████████▍   | 84.7M/93.8M [01:03<00:06, 1.39MB/s]
 90%|█████████████████████████████████▍   | 84.8M/93.8M [01:03<00:05, 1.51MB/s]
 91%|█████████████████████████████████▌   | 85.0M/93.8M [01:03<00:05, 1.61MB/s]
 91%|█████████████████████████████████▋   | 85.2M/93.8M [01:03<00:04, 1.75MB/s]
 91%|█████████████████████████████████▋   | 85.4M/93.8M [01:03<00:04, 1.80MB/s]
 91%|█████████████████████████████████▊   | 85.6M/93.8M [01:04<00:04, 1.82MB/s]
 92%|█████████████████████████████████▊   | 85.8M/93.8M [01:04<00:04, 1.83MB/s]
 92%|█████████████████████████████████▉   | 86.0M/93.8M [01:04<00:04, 1.84MB/s]
 92%|██████████████████████████████████   | 86.2M/93.8M [01:04<00:03, 1.95MB/s]
 92%|██████████████████████████████████   | 86.4M/93.8M [01:04<00:03, 2.01MB/s]
 92%|██████████████████████████████████▏  | 86.6M/93.8M [01:04<00:04, 1.56MB/s]
 93%|██████████████████████████████████▎  | 86.8M/93.8M [01:04<00:05, 1.28MB/s]
 93%|██████████████████████████████████▎  | 87.0M/93.8M [01:04<00:05, 1.32MB/s]
 93%|██████████████████████████████████▍  | 87.1M/93.8M [01:05<00:04, 1.44MB/s]
 93%|██████████████████████████████████▍  | 87.4M/93.8M [01:05<00:03, 1.80MB/s]
 93%|██████████████████████████████████▌  | 87.6M/93.8M [01:05<00:03, 1.86MB/s]
 94%|██████████████████████████████████▋  | 87.8M/93.8M [01:05<00:04, 1.48MB/s]
 94%|██████████████████████████████████▋  | 88.0M/93.8M [01:05<00:03, 1.59MB/s]
 94%|██████████████████████████████████▊  | 88.3M/93.8M [01:05<00:03, 1.80MB/s]
 94%|██████████████████████████████████▉  | 88.5M/93.8M [01:05<00:02, 1.84MB/s]
 95%|███████████████████████████████████  | 88.7M/93.8M [01:05<00:02, 2.00MB/s]
 95%|███████████████████████████████████  | 88.9M/93.8M [01:05<00:02, 2.09MB/s]
 95%|███████████████████████████████████▏ | 89.3M/93.8M [01:06<00:01, 2.38MB/s]
 95%|███████████████████████████████████▎ | 89.5M/93.8M [01:06<00:01, 2.44MB/s]
 96%|███████████████████████████████████▍ | 89.8M/93.8M [01:06<00:01, 2.45MB/s]
 96%|███████████████████████████████████▌ | 90.0M/93.8M [01:06<00:01, 2.45MB/s]
 96%|███████████████████████████████████▌ | 90.3M/93.8M [01:06<00:01, 2.46MB/s]
 97%|███████████████████████████████████▋ | 90.5M/93.8M [01:06<00:01, 1.90MB/s]
 97%|███████████████████████████████████▊ | 90.7M/93.8M [01:06<00:01, 1.57MB/s]
 97%|███████████████████████████████████▊ | 90.9M/93.8M [01:06<00:01, 1.62MB/s]
 97%|███████████████████████████████████▉ | 91.1M/93.8M [01:07<00:01, 1.66MB/s]
 97%|████████████████████████████████████ | 91.3M/93.8M [01:07<00:01, 1.69MB/s]
 98%|████████████████████████████████████ | 91.5M/93.8M [01:07<00:01, 1.94MB/s]
 98%|████████████████████████████████████▏| 91.7M/93.8M [01:07<00:01, 1.97MB/s]
 98%|████████████████████████████████████▎| 91.9M/93.8M [01:07<00:01, 1.56MB/s]
 98%|████████████████████████████████████▎| 92.1M/93.8M [01:07<00:01, 1.60MB/s]
 98%|████████████████████████████████████▍| 92.3M/93.8M [01:07<00:01, 1.31MB/s]
 99%|████████████████████████████████████▌| 92.5M/93.8M [01:07<00:00, 1.53MB/s]
 99%|████████████████████████████████████▌| 92.7M/93.8M [01:08<00:00, 1.59MB/s]
 99%|████████████████████████████████████▋| 92.9M/93.8M [01:08<00:00, 1.77MB/s]
 99%|████████████████████████████████████▋| 93.1M/93.8M [01:08<00:00, 1.80MB/s]
 99%|████████████████████████████████████▊| 93.3M/93.8M [01:08<00:00, 1.42MB/s]
100%|████████████████████████████████████▉| 93.6M/93.8M [01:08<00:00, 1.88MB/s]
  0%|                                              | 0.00/93.8M [00:00<?, ?B/s]
100%|██████████████████████████████████████| 93.8M/93.8M [00:00<00:00, 487GB/s]
downloading PocilloporaDamicornisSkin_Texture_0.jpg

  0%|                                              | 0.00/17.3M [00:00<?, ?B/s]
  0%|                                      | 15.4k/17.3M [00:00<02:22, 121kB/s]
  0%|▏                                     | 85.0k/17.3M [00:00<00:50, 339kB/s]
  1%|▌                                      | 222k/17.3M [00:00<00:24, 703kB/s]
  2%|▋                                      | 313k/17.3M [00:00<00:28, 606kB/s]
  3%|█▏                                     | 513k/17.3M [00:00<00:21, 785kB/s]
  4%|█▋                                     | 741k/17.3M [00:00<00:17, 933kB/s]
  6%|██▏                                    | 954k/17.3M [00:01<00:16, 990kB/s]
  7%|██▌                                  | 1.20M/17.3M [00:01<00:14, 1.08MB/s]
  8%|██▉                                  | 1.40M/17.3M [00:01<00:15, 1.06MB/s]
  9%|███▎                                 | 1.58M/17.3M [00:01<00:15, 1.02MB/s]
 10%|███▊                                 | 1.77M/17.3M [00:01<00:15, 1.01MB/s]
 12%|████▍                                | 2.08M/17.3M [00:02<00:10, 1.40MB/s]
 13%|████▊                                | 2.25M/17.3M [00:02<00:12, 1.22MB/s]
 14%|█████▎                               | 2.48M/17.3M [00:02<00:12, 1.20MB/s]
 15%|█████▋                               | 2.64M/17.3M [00:02<00:11, 1.29MB/s]
 16%|█████▉                               | 2.80M/17.3M [00:02<00:12, 1.13MB/s]
 19%|██████▉                              | 3.26M/17.3M [00:02<00:09, 1.54MB/s]
 20%|███████▍                             | 3.46M/17.3M [00:03<00:10, 1.37MB/s]
 21%|███████▉                             | 3.69M/17.3M [00:03<00:10, 1.31MB/s]
 22%|████████▎                            | 3.86M/17.3M [00:03<00:11, 1.19MB/s]
 24%|████████▉                            | 4.16M/17.3M [00:03<00:08, 1.52MB/s]
 25%|█████████▎                           | 4.33M/17.3M [00:03<00:09, 1.30MB/s]
 27%|█████████▊                           | 4.60M/17.3M [00:03<00:09, 1.33MB/s]
 28%|██████████▍                          | 4.89M/17.3M [00:04<00:07, 1.63MB/s]
 29%|██████████▊                          | 5.08M/17.3M [00:04<00:08, 1.40MB/s]
 31%|███████████▎                         | 5.30M/17.3M [00:04<00:09, 1.32MB/s]
 33%|████████████                         | 5.66M/17.3M [00:04<00:06, 1.76MB/s]
 34%|████████████▌                        | 5.87M/17.3M [00:04<00:07, 1.52MB/s]
 35%|████████████▉                        | 6.06M/17.3M [00:04<00:08, 1.34MB/s]
 36%|█████████████▍                       | 6.30M/17.3M [00:05<00:08, 1.31MB/s]
 38%|██████████████                       | 6.55M/17.3M [00:05<00:08, 1.30MB/s]
 39%|██████████████▌                      | 6.82M/17.3M [00:05<00:07, 1.34MB/s]
 41%|███████████████▏                     | 7.12M/17.3M [00:05<00:07, 1.39MB/s]
 42%|███████████████▋                     | 7.35M/17.3M [00:05<00:07, 1.33MB/s]
 44%|████████████████▎                    | 7.63M/17.3M [00:06<00:07, 1.36MB/s]
 45%|████████████████▊                    | 7.86M/17.3M [00:06<00:07, 1.30MB/s]
 47%|█████████████████▎                   | 8.12M/17.3M [00:06<00:06, 1.31MB/s]
 49%|█████████████████▉                   | 8.39M/17.3M [00:06<00:06, 1.35MB/s]
 50%|██████████████████▌                  | 8.66M/17.3M [00:06<00:06, 1.35MB/s]
 52%|███████████████████▏                 | 8.97M/17.3M [00:06<00:05, 1.67MB/s]
 53%|███████████████████▌                 | 9.16M/17.3M [00:07<00:05, 1.44MB/s]
 54%|████████████████████                 | 9.39M/17.3M [00:07<00:05, 1.37MB/s]
 56%|████████████████████▋                | 9.69M/17.3M [00:07<00:04, 1.69MB/s]
 57%|█████████████████████▏               | 9.89M/17.3M [00:07<00:05, 1.45MB/s]
 58%|█████████████████████▋               | 10.1M/17.3M [00:07<00:05, 1.35MB/s]
 60%|██████████████████████▏              | 10.4M/17.3M [00:08<00:05, 1.35MB/s]
 62%|██████████████████████▉              | 10.7M/17.3M [00:08<00:04, 1.45MB/s]
 63%|███████████████████████▎             | 10.9M/17.3M [00:08<00:04, 1.34MB/s]
 65%|████████████████████████             | 11.2M/17.3M [00:08<00:04, 1.42MB/s]
 67%|████████████████████████▋            | 11.5M/17.3M [00:08<00:03, 1.70MB/s]
 68%|█████████████████████████            | 11.7M/17.3M [00:08<00:03, 1.46MB/s]
 69%|█████████████████████████▍           | 11.9M/17.3M [00:09<00:04, 1.30MB/s]
 70%|█████████████████████████▉           | 12.1M/17.3M [00:09<00:04, 1.26MB/s]
 71%|██████████████████████████▍          | 12.4M/17.3M [00:09<00:04, 1.23MB/s]
 73%|██████████████████████████▉          | 12.6M/17.3M [00:09<00:03, 1.22MB/s]
 74%|███████████████████████████▍         | 12.8M/17.3M [00:09<00:03, 1.20MB/s]
 76%|███████████████████████████▉         | 13.1M/17.3M [00:10<00:03, 1.27MB/s]
 77%|████████████████████████████▌        | 13.4M/17.3M [00:10<00:02, 1.32MB/s]
 78%|████████████████████████████▉        | 13.5M/17.3M [00:10<00:02, 1.35MB/s]
 80%|█████████████████████████████▍       | 13.8M/17.3M [00:10<00:02, 1.32MB/s]
 81%|█████████████████████████████▉       | 14.0M/17.3M [00:10<00:02, 1.59MB/s]
 83%|██████████████████████████████▌      | 14.3M/17.3M [00:10<00:01, 1.55MB/s]
 84%|███████████████████████████████      | 14.5M/17.3M [00:11<00:01, 1.40MB/s]
 85%|███████████████████████████████▌     | 14.8M/17.3M [00:11<00:01, 1.32MB/s]
 87%|████████████████████████████████▏    | 15.1M/17.3M [00:11<00:01, 1.41MB/s]
 89%|████████████████████████████████▊    | 15.3M/17.3M [00:11<00:01, 1.36MB/s]
 90%|█████████████████████████████████▎   | 15.6M/17.3M [00:11<00:01, 1.33MB/s]
 92%|█████████████████████████████████▉   | 15.9M/17.3M [00:11<00:00, 1.67MB/s]
 93%|██████████████████████████████████▍  | 16.1M/17.3M [00:12<00:00, 1.50MB/s]
 95%|███████████████████████████████████  | 16.4M/17.3M [00:12<00:00, 1.47MB/s]
 97%|███████████████████████████████████▊ | 16.7M/17.3M [00:12<00:00, 1.85MB/s]
 98%|████████████████████████████████████▏| 16.9M/17.3M [00:12<00:00, 1.60MB/s]
 99%|████████████████████████████████████▌| 17.1M/17.3M [00:12<00:00, 1.38MB/s]
  0%|                                              | 0.00/17.3M [00:00<?, ?B/s]
100%|█████████████████████████████████████| 17.3M/17.3M [00:00<00:00, 59.8GB/s]
downloading PocilloporaDamicornisSkin_GeneratedMat2.png

  0%|                                               | 0.00/120k [00:00<?, ?B/s]
 32%|████████████▋                          | 38.9k/120k [00:00<00:00, 205kB/s]
 85%|██████████████████████████████████      | 102k/120k [00:00<00:00, 390kB/s]
  0%|                                               | 0.00/120k [00:00<?, ?B/s]
100%|████████████████████████████████████████| 120k/120k [00:00<00:00, 479MB/s]

Load the model#

Next, read the model data from the .obj file. Currently napari/vispy do not support reading material properties (.mtl files) nor separate texture and vertex indices (i.e. repeated vertices). Normal vectors read from the file are also ignored and re-calculated from the faces.

Notice reading .OBJ: material properties are ignored.

Load the textures#

This model comes with two textures: Texture_0 is generated from photogrammetry of the actual object, and GeneratedMat2 is a generated material to fill in parts of the model lacking photographic texture.

This is what the texture images look like in 2D:

fig, axs = plt.subplots(1, 2)
axs[0].set_title(f'Texture_0 {photo_texture.shape}')
axs[0].imshow(photo_texture)
axs[0].set_xticks((0, photo_texture.shape[1]), labels=(0.0, 1.0))
axs[0].set_yticks((0, photo_texture.shape[0]), labels=(0.0, 1.0))
axs[1].set_title(f'GeneratedMat2 {generated_texture.shape}')
axs[1].imshow(generated_texture)
axs[1].set_xticks((0, generated_texture.shape[1]), labels=(0.0, 1.0))
axs[1].set_yticks((0, generated_texture.shape[0]), labels=(0.0, 1.0))
fig.show()
Texture_0 (8192, 8192, 3), GeneratedMat2 (2048, 2048, 4)

Create the napari layers#

Next create two separate layers with the same mesh - once with each texture. In this example the texture coordinates happen to be the same for each texture, but this is not a strict requirement.

Add the layers to a viewer#

Finally, create the viewer and add the Surface layers. sphinx_gallery_thumbnail_number = 2

surface multi texture

Total running time of the script: (1 minutes 45.432 seconds)

Gallery generated by Sphinx-Gallery