Last active
May 22, 2024 09:45
-
-
Save rvanlaar/72c802495ef419de92bd0de6ac897b0f to your computer and use it in GitHub Desktop.
Show a cylinder called scene2.png
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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