Last active
May 22, 2024 09:45
-
-
Save rvanlaar/72c802495ef419de92bd0de6ac897b0f to your computer and use it in GitHub Desktop.
Revisions
-
rvanlaar revised this gist
May 22, 2024 . 1 changed file with 47 additions and 51 deletions.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -1,47 +1,48 @@ 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. @@ -51,36 +52,31 @@ def _update_pan(self, delta, *, 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) -
rvanlaar created this gist
May 21, 2024 .There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,86 @@ import pygfx as gfx import imageio.v3 as iio import pylinalg as la import numpy as np import math from scipy.spatial.transform import Rotation from wgpu.gui.auto import run, WgpuCanvas scene = gfx.Scene() 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) scene.add(cyl) canvas=None renderer=None controller=None camera=None before_render=None after_render=None draw_function = None up = (0,1,0) one_degree = 1 * (math.pi/180) canvas = WgpuCanvas() renderer = gfx.renderers.WgpuRenderer(canvas) camera = gfx.PerspectiveCamera(70, 4 / 3) camera.local.position = (0,0,0) camera.local.rotation = la.quat_from_euler(np.array([-0.5 * math.pi, 0, 0])) class FixedController(gfx.Controller): _default_controls = { "mouse1": ("pan", "drag", (1, 1)) } yaw = None tilt = None 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 cam_state = self._get_camera_state() rotation = cam_state["rotation"] #print(f"vecx: {vecx} vecy: {vecy}") print(f"delta {delta}") if self.yaw is None or self.pitch is None: rotation_scipy = Rotation.from_quat(rotation) in_euler = rotation_scipy.as_euler("XYZ", degrees=True) X,Y,Z = in_euler self.yaw = X self.pitch = Y # [X, Y, Z] self.pitch += -vecx[0] * delta[0] self.yaw += vecy[2] * delta[1] #print(f"new rotation: {new_rotation_euler}") new_rotation = Rotation.from_euler("XYZ", [self.yaw, self.pitch, 0], 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) #gfx.show(cyl)