""" Example showing subdivided polyhedrons. """ import pygfx as gfx scene = gfx.Scene() material = gfx.MeshBasicMaterial(wireframe=True, side="FRONT") geometries = [gfx.tetrahedron_geometry(subdivisions=i) for i in range(4)] for i, geometry in enumerate(geometries): polyhedron = gfx.Mesh(geometry, material) polyhedron.position.set(6 - i * 3, 0, 0) scene.add(polyhedron) background = gfx.Background(None, gfx.BackgroundMaterial((0, 1, 0, 1), (0, 1, 1, 1))) scene.add(background) if __name__ == "__main__": gfx.show(scene, up=gfx.linalg.Vector3(0, 0, 1))
""" Example showing multiple rotating cubes. This also tests the depth buffer. """ import imageio from wgpu.gui.auto import WgpuCanvas, run import pygfx as gfx canvas = WgpuCanvas() renderer = gfx.renderers.WgpuRenderer(canvas) scene = gfx.Scene() im = imageio.imread("imageio:chelsea.png") tex = gfx.Texture(im, dim=2).get_view(filter="linear") material = gfx.MeshBasicMaterial(map=tex) geometry = gfx.box_geometry(100, 100, 100) cubes = [gfx.Mesh(geometry, material) for i in range(8)] for i, cube in enumerate(cubes): cube.position.set(350 - i * 100, 0, 0) scene.add(cube) background = gfx.Background(None, gfx.BackgroundMaterial((0, 1, 0, 1), (0, 1, 1, 1))) scene.add(background) camera = gfx.PerspectiveCamera(70, 16 / 9) camera.position.z = 500 def animate():
""" Example showing transparency using three overlapping planes. Press space to toggle the order of the planes. Press 1-6 to select the blend mode. """ from wgpu.gui.auto import WgpuCanvas, run import pygfx as gfx canvas = WgpuCanvas() renderer = gfx.renderers.WgpuRenderer(canvas) scene = gfx.Scene() geometry = gfx.plane_geometry(50, 50) plane1 = gfx.Mesh(geometry, gfx.MeshBasicMaterial(color=(1, 0, 0, 0.4))) plane2 = gfx.Mesh(geometry, gfx.MeshBasicMaterial(color=(0, 1, 0, 0.4))) plane3 = gfx.Mesh(geometry, gfx.MeshBasicMaterial(color=(0, 0, 1, 0.4))) plane1.position.set(-10, -10, 1) plane2.position.set(0, 0, 2) plane3.position.set(10, 10, 3) scene.add(plane1, plane2, plane3) camera = gfx.OrthographicCamera(100, 100) @canvas.add_event_handler("key_down") def handle_event(event): if event["key"] == " ": print("Rotating scene element order")
In this case the wireframe is lit while the solid mesh is not, producing a look of a metalic frame around a soft tube. """ from wgpu.gui.auto import WgpuCanvas, run import pygfx as gfx canvas = WgpuCanvas() renderer = gfx.renderers.WgpuRenderer(canvas) scene = gfx.Scene() geometry = gfx.torus_knot_geometry(1, 0.3, 64, 16) material1 = gfx.MeshBasicMaterial(color=(0.7, 0, 0, 1)) obj1 = gfx.Mesh(geometry, material1) scene.add(obj1) material2 = gfx.MeshPhongMaterial(color=(0.7, 0.7, 0.8, 1), wireframe=True, wireframe_thickness=1.5) obj2 = gfx.Mesh(geometry, material2) scene.add(obj2) camera = gfx.PerspectiveCamera(70, 1) camera.position.z = 4 def animate(): rot = gfx.linalg.Quaternion().set_from_euler(gfx.linalg.Euler(
canvas = WgpuCanvas() renderer = gfx.renderers.WgpuRenderer(canvas) scene = gfx.Scene() vol = imageio.volread("imageio:stent.npz") nslices = vol.shape[0] index = nslices // 2 tex_size = tuple(reversed(vol.shape)) tex = gfx.Texture(vol, dim=2, size=tex_size) view = tex.get_view(filter="linear", view_dim="2d", layer_range=range(index, index + 1)) geometry = gfx.plane_geometry(200, 200, 12, 12) material = gfx.MeshBasicMaterial(map=view, clim=(0, 2000)) plane = gfx.Mesh(geometry, material) scene.add(plane) camera = gfx.OrthographicCamera(200, 200) @canvas.add_event_handler("wheel") def handle_event(event): global index index = index + int(event["dy"] / 90) index = max(0, min(nslices - 1, index)) view = tex.get_view(filter="linear", view_dim="2d", layer_range=range(index, index + 1)) material.map = view
""" import imageio from wgpu.gui.auto import WgpuCanvas, run import pygfx as gfx canvas = WgpuCanvas() renderer = gfx.renderers.WgpuRenderer(canvas) scene = gfx.Scene() scene.add(gfx.AxesHelper(length=250)) im = imageio.imread("imageio:chelsea.png") tex = gfx.Texture(im, dim=2).get_view(filter="linear") material = gfx.MeshBasicMaterial(map=tex, side="front") geometry = gfx.box_geometry(100, 100, 100) cubes = [gfx.Mesh(geometry, material) for i in range(8)] for i, cube in enumerate(cubes): cube.position.set(350 - i * 100, 150, 0) scene.add(cube) background = gfx.Background(None, gfx.BackgroundMaterial((0, 1, 0, 1), (0, 1, 1, 1))) scene.add(background) camera = gfx.PerspectiveCamera(70, 16 / 9) camera.position.set(0, 0, 500) controls = gfx.OrbitControls(camera.position.clone()) controls.add_default_event_handlers(canvas, camera)
im = np.array( [ [0, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 2], ], np.float32, ) tex = gfx.Texture(im, dim=2) plane = gfx.Mesh( gfx.plane_geometry(4, 4), gfx.MeshBasicMaterial(map=tex.get_view(filter="nearest"), clim=(0, 2)), ) plane.position = gfx.linalg.Vector3(2, 2) # put corner at 0, 0 scene.add(plane) points = gfx.Points( gfx.Geometry(positions=[[0, 0, 1], [4, 4, 1]]), gfx.PointsMaterial(color=(0, 1, 0, 1), size=20), ) scene.add(points) camera = gfx.OrthographicCamera(10, 10) if __name__ == "__main__": print(__doc__)
canvas = WgpuCanvas() renderer = gfx.renderers.WgpuRenderer(canvas) scene = gfx.Scene() axes = gfx.AxesHelper(length=250) scene.add(axes) background = gfx.Background(None, gfx.BackgroundMaterial((0, 1, 0, 1), (0, 1, 1, 1))) scene.add(background) im = imageio.imread("imageio:astronaut.png") tex = gfx.Texture(im, dim=2) geometry = gfx.plane_geometry(512, 512) material = gfx.MeshBasicMaterial(map=tex.get_view(filter="linear")) plane = gfx.Mesh(geometry, material) scene.add(plane) camera = gfx.OrthographicCamera(512, 512) camera.position.set(0, 0, 500) controls = gfx.PanZoomControls(camera.position.clone()) controls.add_default_event_handlers(canvas, camera) def animate(): controls.update_camera(camera) renderer.render(scene, camera) if __name__ == "__main__":
def test_render_registry_of_wgpu(): r = gfx.renderers.wgpu.registry assert None is r.get_render_function(Object1(Material1())) assert r.get_render_function(gfx.Mesh(None, gfx.MeshBasicMaterial()))
from wgpu.gui.auto import WgpuCanvas, run import pygfx as gfx canvas = WgpuCanvas() renderer = gfx.renderers.WgpuRenderer(canvas) scene = gfx.Scene() vol = imageio.volread("imageio:stent.npz") nslices = vol.shape[0] index = nslices // 2 im = vol[index].copy() tex = gfx.Texture(im, dim=2) geometry = gfx.plane_geometry(200, 200, 12, 12) material = gfx.MeshBasicMaterial(map=tex.get_view(filter="linear"), clim=(0, 2000)) plane = gfx.Mesh(geometry, material) scene.add(plane) camera = gfx.OrthographicCamera(200, 200) @canvas.add_event_handler("wheel") def handle_event(event): global index index = index + int(event["dy"] / 90) index = max(0, min(nslices - 1, index)) im = vol[index] tex.data[:] = im tex.update_range((0, 0, 0), tex.size) canvas.request_draw()
# Prepare a very small data volume. The data is integer and not uint8, # so its not interpolated (a wgpu restriction). In this case this is intended. voldata = np.ones((3, 3, 3), np.int16) * 200 voldata[1:-1, :, :] = 600 voldata[:, 1:-1, :] = 600 voldata[:, :, 1:-1] = 600 voldata[1, 1, 1] = 800 # Create a texture, (wrapped in a geometry) for it geo = gfx.Geometry(grid=gfx.Texture(voldata, dim=3)) # Prepare two 3x3x3 boxes to indicate the proper position box1 = gfx.Mesh( gfx.box_geometry(3.1, 3.1, 3.1), gfx.MeshBasicMaterial(color=(1, 0, 0, 1), wireframe=True, wireframe_thickness=2), ) box2 = gfx.Mesh( gfx.box_geometry(3.1, 3.1, 3.1), gfx.MeshBasicMaterial(color=(0, 1, 0, 1), wireframe=True, wireframe_thickness=2), ) # In scene1 we show a raycasted volume scene1 = gfx.Scene() vol = gfx.Volume(geo, gfx.VolumeRayMaterial(clim=(0, 2000))) vol.position.set(-1, -1, -1) scene1.add(vol, box1) # In scene2 we show volume slices scene2 = gfx.Scene() slice1 = gfx.Volume(geo, gfx.VolumeSliceMaterial(clim=(0, 1000), plane=(0, 0, 1, 0)))
Example showing a Torus knot, as a wireframe. We create two wireframes, one for the front, bright blue and lit, and one for the back, unlit and gray. """ from wgpu.gui.auto import WgpuCanvas, run import pygfx as gfx canvas = WgpuCanvas() renderer = gfx.renderers.WgpuRenderer(canvas) scene = gfx.Scene() geometry = gfx.torus_knot_geometry(1, 0.3, 64, 8) material1 = gfx.MeshBasicMaterial(color=(0.2, 0.2, 0.2, 1.0), wireframe=True, wireframe_thickness=3, side="back") obj1 = gfx.Mesh(geometry, material1) scene.add(obj1) material2 = gfx.MeshPhongMaterial(color=(0, 0.8, 0.8, 1), wireframe=True, wireframe_thickness=3, side="front") obj2 = gfx.Mesh(geometry, material2) scene.add(obj2) camera = gfx.PerspectiveCamera(70, 1) camera.position.z = 4
# near values. With the perspective camera you'll want to pick a small # positive near-value, and a relatively small value for the far-value # as well, otherwise the distant squares become smaller than 1 pixel ;) # Select camera and matchingclipping planes if True: near, far = -40, 300 camera = gfx.OrthographicCamera(2.2, 2.2, near, far) else: near, far = 5, 10 camera = gfx.PerspectiveCamera(50, 1, near, far) # %% Create four planes near the z-clipping planes geometry = gfx.plane_geometry(1, 1) green_material = gfx.MeshBasicMaterial(color=(0, 0.8, 0.2, 1)) greener_material = gfx.MeshBasicMaterial(color=(0, 1, 0, 1)) red_material = gfx.MeshBasicMaterial(color=(1, 0, 0, 1)) plane1 = gfx.Mesh(geometry, green_material) plane2 = gfx.Mesh(geometry, red_material) plane3 = gfx.Mesh(geometry, greener_material) plane4 = gfx.Mesh(geometry, red_material) # Note the negation of near and far in the plane's position. This is # because the camera looks down the z-axis: more negative means moving # away from the camera, positive values are behind the camera. plane1.position = gfx.linalg.Vector3(-0.51, -0.51, -(near + 0.01)) # in range plane2.position = gfx.linalg.Vector3(+0.51, -0.51, -(near - 0.01)) # out range plane3.position = gfx.linalg.Vector3(-0.51, +0.51, -(far - 0.01)) # in range plane4.position = gfx.linalg.Vector3(+0.51, +0.51, -(far + 0.01)) # out range