バックフェイスプロパティの設定#

デフォルトでは,フロントフェイスとバックフェイスのレンダリングは同じプロパティを使用します.状況によっては,バックフェイスにフロントフェイスとは異なるプロパティを設定すると便利な場合があります.

簡単な例としては,閉じた(または十分に近い)サーフェスの内側が異なる色である場合す. "inside" と "outside" の概念は,サーフェスの法線の向きに依存することに注意してください.

import numpy as np

import pyvista as pv
from pyvista import examples

mesh = pv.ParametricEllipsoid(min_v=np.pi / 2 - 0.2, max_v=np.pi / 2 + 0.2)

# create a shifted copy with flipped normals
mesh_inside_out = mesh.translate((0, 0, 1), inplace=False)
mesh_inside_out.compute_normals(flip_normals=True, inplace=True)
meshes = mesh + mesh_inside_out

backface_params = dict(color='orangered')
meshes.plot(color='aquamarine', backface_params=backface_params, smooth_shading=True)
backface props

より興味深い使用例としては,複雑で自己交差する曲面の向きを視覚化するのに役立ちます.例えば Catalan's minimal surface は複雑な形をしていますが,前面と背面に異なる色を付けることで,サーフェスの複雑な構造を理解しやすくなります.この例では, pyvista.Actor クラスの backface_prop プロパティの使用も実演しています.

catalan = pv.ParametricCatalanMinimal()
plotter = pv.Plotter()
actor = plotter.add_mesh(catalan, color='dodgerblue', smooth_shading=True)
bprop = actor.backface_prop
bprop.color = 'forestgreen'
bprop.specular = 1.0
bprop.specular_power = 50.0
plotter.show()
backface props

無方向性表面の場合,特定の裏面特性を追加すると,表面特性が不連続になる "seams" が発生し,無方向性が非常に顕著になることがあります.

henneberg = pv.ParametricHenneberg().scale(0.25, inplace=False)
klein = pv.ParametricKlein().rotate_z(150, inplace=False).translate((6, 0, 0), inplace=False)
meshes = henneberg + klein

backface_params = dict(color='mediumseagreen', specular=1.0, specular_power=50.0)
meshes.plot(color='gold', backface_params=backface_params, smooth_shading=True)
backface props

もちろん,バックフェースの色だけでなく,ほとんどの pyvista.Property 属性をオーバーライドすることができます.しかし,これらの中には何の効果もないものもありますし,単に意味をなさないものもあります.例えば,ほとんどのオブジェクトは,どの方向から見ても同じ不透明度を持っています.このような非対称の不透明なメビウスの帯の周りを回るGIFアニメーションをご覧ください.

mobius = pv.ParametricMobius().rotate_z(-90, inplace=False)
backface_params = dict(opacity=0.5)
plotter = pv.Plotter()
plotter.add_mesh(mobius, color='deepskyblue', backface_params=backface_params, smooth_shading=True)
plotter.open_gif('mobius_semiopaque.gif')

viewup = [0, 0, 1]
orbit = plotter.generate_orbital_path(n_points=24, shift=0.0, viewup=viewup)
plotter.orbit_on_path(orbit, write_frames=True, viewup=viewup, step=0.02)
backface props

テクスチャ付きメッシュにバックフェイスプロパティを適用する#

バックフェイステクスチャは,テクスチャが適用されているメッシュに適用することもできます.この例では,地球儀のテクスチャを pyvista.examples.load_globe() でロードしてクリップし,内側の表面に異なる色を適用しています.

この例ではライティングを無効にしていますが,これは,裏面に異なる色を指定するだけで,指向性ライティングなしでサーフェスの内部を閉塞して見せることができることを示すためです.

globe = examples.load_globe()
texture = examples.load_globe_texture()
clipped = globe.clip(normal='z', value=4.37e9)

pl = pv.Plotter()
pl.add_mesh(
    clipped,
    backface_params={'color': [0.2, 0.2, 0.2]},
    lighting=False,
    smooth_shading=True,
    texture=texture,
)
pl.show()
backface props

バックフェイスプロパティと物理ベースレンダリング#

物理ベースレンダリングを有効にすると,バックフェイスパラメータの設定にかかわらず,バックフェイスが自動的に選抜除去されることに注意してください.

sphere = pv.Sphere()
clipped_sphere = sphere.clip(normal='z', value=0.4)

pl = pv.Plotter()
pl.set_environment_texture(examples.download_sky_box_cube_map())
pl.add_mesh(
    clipped_sphere,
    backface_params={'color': 'r'},
    pbr=True,
    metallic=1.0,
    roughness=0.2,
)
pl.show()
backface props

球の内側と外側を区別することに依存する 球体を裏返す の例も参照してください.

Total running time of the script: (6 minutes 13.489 seconds)

Sphinx-Galleryによるギャラリー