Computing Surface Normals

Computing Surface Normals#

Compute normals on a surface.

import numpy as np

from pyvista import examples

mesh = examples.download_topo_global()
mesh.plot(cmap="gist_earth", show_scalar_bar=False)
c compute normals

Now we have a surface dataset of the globe loaded - unfortunately, the dataset shows the globe with a uniform radius which hides topographic relief. Using pyvista.PolyData.compute_normals(), we can compute the normal vectors on the globe at all points in the dataset, then use the values given in the dataset to warp the surface in the normals direction to create some exaggerated topographic relief.

# Compute the normals in-place and use them to warp the globe
mesh.compute_normals(inplace=True)  # this activates the normals as well
PolyData (0x7ff57965b580)
  N Cells:    2333880
  N Points:   2336041
  N Strips:   0
  X Bounds:   -1.000e+00, 1.000e+00
  Y Bounds:   -1.000e+00, 1.000e+00
  Z Bounds:   -1.000e+00, 1.000e+00
  N Arrays:   3


Now use those normals to warp the surface

warp = mesh.warp_by_scalar(factor=0.5e-5)

And let’s see it!

warp.plot(cmap="gist_earth", show_scalar_bar=False)
c compute normals

We could also use face or cell normals to extract all the faces of a mesh facing a general direction. In the following snippet, we take a mesh, compute the normals along its cell faces, and extract the faces that face upward.

mesh = examples.download_nefertiti()
# Compute normals
mesh.compute_normals(cell_normals=True, point_normals=False, inplace=True)

# Get list of cell IDs that meet condition
ids = np.arange(mesh.n_cells)[mesh["Normals"][:, 2] > 0.0]

# Extract those cells
top = mesh.extract_cells(ids)

cpos = [
    (-834.3184529757553, -918.4677714398535, 236.5468795300025),
    (11.03829376004883, -13.642289291587957, -35.91218884207208),
    (0.19212361465657216, 0.11401076390090074, 0.9747256344254143),
]

top.plot(cpos=cpos, color=True)
c compute normals
/home/runner/work/pyvista-tutorial/pyvista-tutorial/tutorial/04_filters/solutions/c_compute-normals.py:44: UserWarning: download_nefertiti returns a dataset licensed under CC BY-NC-SA 4.0 ("The Other Nefertiti" by Al-Badri and Nelles, 2016). It may not be used for commercial purposes, and derivative works must be shared under the same license. For a CC0 alternative suitable for commercial use, see download_washington_bust or download_lincoln_life_mask.
  mesh = examples.download_nefertiti()
Open In Colab

Total running time of the script: (0 minutes 42.026 seconds)

Gallery generated by Sphinx-Gallery