def create_object(texcoords, tex, xpos): geometry = get_geometry() geometry.texcoords = gfx.Buffer(texcoords) material = gfx.MeshPhongMaterial(map=tex, clim=(-0.05, 1)) obj = gfx.Mesh(geometry, material) obj.position.x = xpos scene.add(obj)
def create_scene(clipping_planes, clipping_mode): maxsize = 221 scene = gfx.Scene() for n in range(20, maxsize, 50): material = gfx.MeshPhongMaterial( color=(n / maxsize, 1, 0, 1), clipping_planes=clipping_planes, clipping_mode=clipping_mode, ) geometry = gfx.box_geometry(n, n, n) cube = gfx.Mesh(geometry, material) scene.add(cube) return scene
""" Example showing a Klein Bottle. """ from wgpu.gui.auto import WgpuCanvas, run import pygfx as gfx canvas = WgpuCanvas() renderer = gfx.renderers.WgpuRenderer(canvas) scene = gfx.Scene() geometry = gfx.klein_bottle_geometry(10) geometry.texcoords = None material = gfx.MeshPhongMaterial(color=(1, 0.5, 0, 1)) obj = gfx.Mesh(geometry, material) scene.add(obj) obj2 = gfx.Mesh(geometry, gfx.MeshNormalLinesMaterial(color=(0, 0, 1, 1))) obj.add(obj2) camera = gfx.PerspectiveCamera(70, 1) camera.position.z = 30 def animate(): rot = gfx.linalg.Quaternion().set_from_euler(gfx.linalg.Euler( 0.0071, 0.01)) obj.rotation.multiply(rot) renderer.render(scene, camera) canvas.request_draw()
import imageio from wgpu.gui.auto import WgpuCanvas, run import pygfx as gfx raise RuntimeError("Post-processing needs to be redesigned") canvas = WgpuCanvas() renderer = gfx.renderers.WgpuRenderer(canvas) scene = gfx.Scene() im = imageio.imread("imageio:bricks.jpg").astype(np.float32) / 255 tex = gfx.Texture(im, dim=2).get_view(filter="linear", address_mode="repeat") geometry = gfx.box_geometry(200, 200, 200) geometry.texcoords.data[:] *= 2 # smaller bricks material = gfx.MeshPhongMaterial(map=tex, color=(1, 0, 0, 0.2)) cube = gfx.Mesh(geometry, material) scene.add(cube) camera = gfx.PerspectiveCamera(70, 16 / 9) camera.position.z = 400 class MyRenderFlusher(gfx.renderers.wgpu._renderutils.RenderFlusher): uniform_type = dict( size="2xf4", sigma="f4", support="i4", amplitude="f4", )
import numpy as np 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:bricks.jpg").astype(np.float32) / 255 tex = gfx.Texture(im, dim=2).get_view(filter="linear", address_mode="repeat") geometry = gfx.torus_knot_geometry(1, 0.3, 128, 32) geometry.texcoords.data[:, 0] *= 10 # stretch the texture material = gfx.MeshPhongMaterial(map=tex) obj = gfx.InstancedMesh(geometry, material, 100) scene.add(obj) # Set matrices. Note that these are sub-transforms of the mesh's own matrix. for y in range(10): for x in range(10): m = gfx.linalg.Matrix4().set_position_xyz(y * 2, x * 2, 0) obj.set_matrix_at(x + y * 10, m.elements) camera = gfx.PerspectiveCamera(70, 1) camera.position.set(9, 9, 15)
import numpy as np from wgpu.gui.auto import WgpuCanvas, run import pygfx as gfx # Create a canvas and renderer canvas = WgpuCanvas(size=(500, 300)) renderer = gfx.renderers.WgpuRenderer(canvas) # Compose a 3D scene scene1 = gfx.Scene() geometry1 = gfx.box_geometry(200, 200, 200) material1 = gfx.MeshPhongMaterial(color=(1, 1, 0, 1.0)) cube1 = gfx.Mesh(geometry1, material1) scene1.add(cube1) camera1 = gfx.OrthographicCamera(300, 300) # Compose another scene, a 2D overlay scene2 = gfx.Scene() positions = np.array( [ [-1, -1, 0.5], [-1, +1, 0.5], [+1, +1, 0.5], [+1, -1, 0.5],
""" Example showing transparency using three orthogonal 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() sphere = gfx.Mesh(gfx.sphere_geometry(10), gfx.MeshPhongMaterial()) geometry = gfx.plane_geometry(50, 50) plane1 = gfx.Mesh(geometry, gfx.MeshBasicMaterial(color=(1, 0, 0, 0.3))) plane2 = gfx.Mesh(geometry, gfx.MeshBasicMaterial(color=(0, 1, 0, 0.5))) plane3 = gfx.Mesh(geometry, gfx.MeshBasicMaterial(color=(0, 0, 1, 0.7))) plane1.rotation.set_from_axis_angle(gfx.linalg.Vector3(1, 0, 0), 1.571) plane2.rotation.set_from_axis_angle(gfx.linalg.Vector3(0, 1, 0), 1.571) plane3.rotation.set_from_axis_angle(gfx.linalg.Vector3(0, 0, 1), 1.571) scene.add(plane1, plane2, plane3, sphere) camera = gfx.PerspectiveCamera(70, 16 / 9) camera.position.z = 70 controls = gfx.OrbitControls(camera.position.clone())
canvas = WgpuCanvas() renderer = gfx.renderers.WgpuRenderer(canvas) scene = gfx.Scene() im = imageio.imread("imageio:astronaut.png").astype(np.float32) / 255 tex = gfx.Texture(im, dim=2).get_view(filter="linear", address_mode="repeat") geometry = gfx.box_geometry(200, 200, 200) material = gfx.MeshBasicMaterial(map=tex) cube = gfx.Mesh(geometry, material) cube.position.x += 150 scene.add(cube) torus = gfx.Mesh(gfx.torus_knot_geometry(100, 20, 128, 32), gfx.MeshPhongMaterial()) torus.position.x -= 150 scene.add(torus) camera = gfx.PerspectiveCamera(70, 16 / 9) camera.position.z = 400 @canvas.add_event_handler("pointer_down") def handle_event(event): info = renderer.get_pick_info((event["x"], event["y"])) wobject = info["world_object"] # If a mesh was clicked .. if wobject and "face_index" in info: # Get what face was clicked face_index = info["face_index"]
# First create the subscene, that reders into a texture texture1 = gfx.Texture(dim=2, size=(200, 200, 1), format="rgba8unorm") renderer1 = gfx.renderers.WgpuRenderer(texture1) scene1 = gfx.Scene() background1 = gfx.Background(None, gfx.BackgroundMaterial((0, 0.5, 0, 1))) scene1.add(background1) im = imageio.imread("imageio:bricks.jpg").astype(np.float32) / 255 tex = gfx.Texture(im, dim=2).get_view(filter="linear", address_mode="repeat") geometry1 = gfx.box_geometry(200, 200, 200) material1 = gfx.MeshPhongMaterial(map=tex, color=(1, 1, 0, 1.0)) cube1 = gfx.Mesh(geometry1, material1) scene1.add(cube1) camera1 = gfx.PerspectiveCamera(70, 16 / 9) camera1.position.z = 300 # Then create the actual scene, in the visible canvas canvas2 = WgpuCanvas() renderer2 = gfx.renderers.WgpuRenderer(canvas2) scene2 = gfx.Scene() geometry2 = gfx.box_geometry(200, 200, 200)
* The bottom row shows the same, but the camera looks backwards. """ from wgpu.gui.auto import WgpuCanvas, run import pygfx as gfx canvas = WgpuCanvas(size=(600, 600)) renderer = gfx.renderers.WgpuRenderer(canvas) scene = gfx.Scene() # geometry = gfx.BoxGeometry(1, 1, 1) geometry = gfx.torus_knot_geometry(1, 0.3, 64, 10) # Create red know shown normally material1 = gfx.MeshPhongMaterial(color=(1, 0, 0, 1)) obj1 = gfx.Mesh(geometry, material1) obj1.position.set(-2, 0, 0) obj1.material.side = "FRONT" # Create a green knot for which we show the back material2 = gfx.MeshPhongMaterial(color=(0, 1, 0, 1)) obj2 = gfx.Mesh(geometry, material2) obj2.position.set(+2, 0, 0) obj2.material.side = "BACK" # Rotate all of them and add to scene rot = gfx.linalg.Quaternion().set_from_euler(gfx.linalg.Euler(0.71, 1)) obj1.rotation.multiply(rot) obj2.rotation.multiply(rot) scene.add(obj1, obj2)
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:bricks.jpg") tex = gfx.Texture(im, dim=2).get_view(filter="linear", address_mode="repeat") geometry = gfx.torus_knot_geometry(1, 0.3, 128, 32) geometry.texcoords.data[:, 0] *= 10 # stretch the texture material = gfx.MeshPhongMaterial(map=tex, clim=(30, 240)) obj = gfx.Mesh(geometry, material) scene.add(obj) camera = gfx.PerspectiveCamera(70, 1) camera.position.z = 4 def animate(): rot = gfx.linalg.Quaternion().set_from_euler(gfx.linalg.Euler(0.0071, 0.01)) obj.rotation.multiply(rot) renderer.render(scene, camera) canvas.request_draw()
def create_object(tex, xpos): material = gfx.MeshPhongMaterial(map=tex, clim=(-0.05, 1)) obj = gfx.Mesh(geometry, material) obj.position.x = xpos scene.add(obj)
( (-50, 0, 0), (0.35, 0, 0, 1), gfx.cylinder_geometry(20, 12, radial_segments=3, height_segments=4, height=10, open_ended=True), ), ((50, 0, -10), (1, 1, 0.75, 1), gfx.cylinder_geometry(1.5, 1.5, height=20)), ((50, 0, 5), (1, 1, 0.75, 1), gfx.cylinder_geometry(4, 0.0, height=10)), ] for pos, color, geometry in cylinders: material = gfx.MeshPhongMaterial(color=color) wobject = gfx.Mesh(geometry, material) wobject.position.set(*pos) scene.add(wobject) material = gfx.MeshNormalLinesMaterial(color=color) wobject = gfx.Mesh(geometry, material) wobject.position.set(*pos) scene.add(wobject) camera = gfx.PerspectiveCamera(70, 16 / 9) camera.position.set(0, -65, 50) controls = gfx.OrbitControls(camera.position.clone()) @canvas.add_event_handler("pointer_down", "pointer_up", "pointer_move",
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( 0.0071, 0.01)) obj1.rotation.multiply(rot) obj2.rotation.multiply(rot) renderer.render(scene, camera)
# Create cubemap texture tex_size = width, height, 6 tex = gfx.Texture(im, dim=2, size=tex_size) view = tex.get_view(view_dim="cube", layer_range=range(6)) # And the background image with the cube texture background = gfx.Background(None, gfx.BackgroundImageMaterial(map=view)) scene.add(background) # Let's add some cubes to make the scene less boring cubes = [] for pos in (-600, 0, -600), (-600, 0, +600), (+600, 0, -600), (+600, 0, +600): clr = (0.5, 0.6, 0.0, 1.0) cube = gfx.Mesh(gfx.box_geometry(200, 200, 200), gfx.MeshPhongMaterial(color=clr)) cube.position.from_array(pos) cubes.append(cube) scene.add(cube) camera = gfx.PerspectiveCamera(70) camera.scale.y = -1 camera.position.z = 0 def animate(): rot = gfx.linalg.Quaternion().set_from_euler(gfx.linalg.Euler(0.01, 0.02)) for cube in cubes: cube.rotation.multiply(rot) rot = gfx.linalg.Quaternion().set_from_euler(gfx.linalg.Euler(0, 0.005))
""" import pygfx as gfx from PySide6 import QtWidgets # Replace PySide6 with PyQt6, PyQt5 or PySide2 from wgpu.gui.qt import WgpuCanvas app = QtWidgets.QApplication([]) canvas = WgpuCanvas() renderer = gfx.renderers.WgpuRenderer(canvas) scene = gfx.Scene() cube = gfx.Mesh( gfx.box_geometry(200, 200, 200), gfx.MeshPhongMaterial(color=(0.2, 0.4, 0.6, 1.0)), ) scene.add(cube) camera = gfx.PerspectiveCamera(70, 16 / 9) camera.position.z = 400 def animate(): rot = gfx.linalg.Quaternion().set_from_euler(gfx.linalg.Euler(0.005, 0.01)) cube.rotation.multiply(rot) renderer.render(scene, camera) canvas.request_draw()
""" Example showing a single geometric cube. """ from wgpu.gui.auto import WgpuCanvas, run import pygfx as gfx canvas = WgpuCanvas() renderer = gfx.renderers.WgpuRenderer(canvas) scene = gfx.Scene() cube = gfx.Mesh( gfx.box_geometry(200, 200, 200), gfx.MeshPhongMaterial(color="#336699"), ) scene.add(cube) camera = gfx.PerspectiveCamera(70, 16 / 9) camera.position.z = 400 def animate(): rot = gfx.linalg.Quaternion().set_from_euler(gfx.linalg.Euler(0.005, 0.01)) cube.rotation.multiply(rot) renderer.render(scene, camera) canvas.request_draw() if __name__ == "__main__": canvas.request_draw(animate)
""" Example showing off the mesh slice material. """ 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, 128, 16) material1 = gfx.MeshPhongMaterial(color=(0.5, 0.5, 0.5, 1.0)) material2 = gfx.MeshSliceMaterial(thickness=8, color=(1, 1, 0, 1), plane=(0, 0, 1, 0)) obj1 = gfx.Mesh(geometry, material1) obj2 = gfx.Mesh(geometry, material2) scene.add(obj1) scene.add(obj2) camera = gfx.PerspectiveCamera(70, 2) camera.position.z = 4 def animate(): dist = material2.plane[3] dist += 0.02 if dist > 1: dist = -1.5
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 def animate(): rot = gfx.linalg.Quaternion().set_from_euler(gfx.linalg.Euler( 0.0071, 0.01)) obj1.rotation.multiply(rot) obj2.rotation.multiply(rot) renderer.render(scene, camera)