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.

Revisions

  1. rvanlaar revised this gist May 22, 2024. 1 changed file with 47 additions and 51 deletions.
    98 changes: 47 additions & 51 deletions qtvr-cylinder.py
    Original file line number Diff line number Diff line change
    @@ -1,47 +1,48 @@
    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
    from wgpu.gui.auto import 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)
    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)
    camera.local.rotation = la.quat_from_euler(np.array([-0.5 * math.pi, 0, 0]))
    camera.local.position = (0, 0, 0)


    class FixedController(gfx.Controller):
    _default_controls = {
    "mouse1": ("pan", "drag", (1, 1))
    }
    _default_controls = {"mouse1": ("pan", "drag", (1, 1))}

    yaw = None
    tilt = None
    # 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

    cam_state = self._get_camera_state()
    rotation = cam_state["rotation"]



    #print(f"vecx: {vecx} vecy: {vecy}")
    print(f"delta {delta}")
    # 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
    self.horizontal_movement += -vecx[0] * delta[0]
    self.vertical_movement += vecy[1] * delta[1]

    X = self.vertical_movement
    Y = self.horizontal_movement
    Z = 0

    # [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)

    #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
    canvas,
    renderer,
    controller,
    camera,
    before_render,
    after_render,
    draw_function,
    stats=True,
    ).show(scene, up)

    #gfx.show(cyl)
  2. rvanlaar created this gist May 21, 2024.
    86 changes: 86 additions & 0 deletions qtvr-cylinder.py
    Original 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)