サンプル関数:2DでのPerlinノイズ#

ここでは, pyvista.core.utilities.features.sample_function() を使用して領域上のPerlinノイズをサンプリングし,ランダムな地表を生成します.

Perlinノイズはグラデーションノイズの一種で,コンピュータグラフィックスのリアルな外観を向上させるために,ビジュアルエフェクトアーティストによってよく使用されます.ソース: Perlin Noise Wikipedia

Perlin Noiseの開発により,コンピュータグラフィックスアーティストは,映画業界の視覚効果における自然現象の複雑さをよりよく表現できるようになりました.

import pyvista as pv

StructuredGrid上にPerlinノイズを生成する#

freq の値を自由に変更して "山" の形を変えることができます.たとえば,周波数を下げると,地形が山ではなく丘のように見えます.

freq = [0.689, 0.562, 0.683]
noise = pv.perlin_noise(1, freq, (0, 0, 0))
sampled = pv.sample_function(noise, bounds=(-10, 10, -10, 10, -10, 10), dim=(500, 500, 1))

スカラーによるワープ#

ここでは,スカラーによってワープして,Perlinノイズの値に基づいて地表に高さを与えます.これは地表のシェイプに必要です.

mesh = sampled.warp_by_scalar('scalars')
mesh = mesh.extract_surface()

# clean and smooth a little to reduce Perlin noise artifacts
mesh = mesh.smooth(n_iter=100, inplace=False, relaxation_factor=1)

# This makes the "water" level look flat.
z = mesh.points[:, 2]
diff = z.max() - z.min()

# water level at 70%  (change this to change the water level)
water_percent = 0.7
water_level = z.max() - water_percent * diff
mesh.points[z < water_level, 2] = water_level

等高線プロットとして地形を表示します

# make the water blue
rng = z.max() - z.min()
clim = (z.max() - rng * 1.65, z.max())

pl = pv.Plotter()
pl.add_mesh(
    mesh,
    scalars=z,
    cmap='gist_earth',
    n_colors=10,
    show_scalar_bar=False,
    smooth_shading=True,
    clim=clim,
)
pl.show()
sampling functions 2d

カスタムのライトとシャドウを使用して地表を表示する

pl = pv.Plotter(lighting=None)
pl.add_light(pv.Light((3, 1, 0.5), show_actor=True, positional=True, cone_angle=90, intensity=1.2))
pl.add_mesh(mesh, cmap='gist_earth', show_scalar_bar=False, smooth_shading=True, clim=clim)
pl.enable_shadows = True
pl.show()
sampling functions 2d

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

Sphinx-Galleryによるギャラリー