Skip to content

Instantly share code, notes, and snippets.

@rvanlaar
Last active May 22, 2024 09:45
Show Gist options
  • Save rvanlaar/72c802495ef419de92bd0de6ac897b0f to your computer and use it in GitHub Desktop.
Save rvanlaar/72c802495ef419de92bd0de6ac897b0f to your computer and use it in GitHub Desktop.
Show a cylinder called scene2.png
import pygfx as gfx
import imageio.v3 as iio
from scipy.spatial.transform import Rotation
from wgpu.gui.auto import WgpuCanvas
scene = gfx.Scene()
def create_cylinder() -> gfx.Mesh:
geo = gfx.cylinder_geometry(
height=2, radial_segments=32, height_segments=4, open_ended=True
)
im = iio.imread("scene2.png").astype("float32") / 255
tex = gfx.Texture(im, dim=2)
material = gfx.MeshBasicMaterial(map=tex)
cyl = gfx.Mesh(geo, material)
cyl.local.rotation = Rotation.from_euler("XYZ", [90, 0, 0], degrees=True).as_quat()
return cyl
cylinder = create_cylinder()
scene.add(cylinder)
canvas = None
renderer = None
controller = None
camera = None
before_render = None
after_render = None
draw_function = None
up = (0, 1, 0)
canvas = WgpuCanvas()
renderer = gfx.renderers.WgpuRenderer(canvas)
camera = gfx.PerspectiveCamera(70, 4 / 3)
camera.local.position = (0, 0, 0)
class FixedController(gfx.Controller):
_default_controls = {"mouse1": ("pan", "drag", (1, 1))}
# initial state
horizontal_movement = 0
vertical_movement = 0
def _update_pan(self, delta, *, vecx, vecy):
# These update methods all accept one positional arg: the delta.
# it can additionally require keyword args, from a set of names
# that new actions store. These include:
# rect, screen_pos, vecx, vecy
assert isinstance(delta, tuple) and len(delta) == 2
# print(f"vecx: {vecx} vecy: {vecy}")
# print(f"delta {delta}")
self.horizontal_movement += -vecx[0] * delta[0]
self.vertical_movement += vecy[1] * delta[1]
X = self.vertical_movement
Y = self.horizontal_movement
Z = 0
#print(f"XYZ: {X} {Y} {Z}")
new_rotation = Rotation.from_euler("YXZ", [Y, X, Z], degrees=True)
self._set_camera_state({"rotation": new_rotation.as_quat()})
controller = FixedController(camera, register_events=renderer)
if __name__ == "__main__":
gfx.Display(
canvas,
renderer,
controller,
camera,
before_render,
after_render,
draw_function,
stats=True,
).show(scene, up)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment