From ab930a71ca076480f78a6a5f42ac2ff5cef24d08 Mon Sep 17 00:00:00 2001 From: Adrian Kummerlaender Date: Sun, 22 Sep 2019 15:56:40 +0200 Subject: Enable mouse-based view rotation --- channel_3d_volumetric_rendering_gl_interop.py | 18 ++++-------------- utility/mouse.py | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+), 14 deletions(-) create mode 100644 utility/mouse.py diff --git a/channel_3d_volumetric_rendering_gl_interop.py b/channel_3d_volumetric_rendering_gl_interop.py index 9e9555a..d3fe485 100644 --- a/channel_3d_volumetric_rendering_gl_interop.py +++ b/channel_3d_volumetric_rendering_gl_interop.py @@ -19,6 +19,7 @@ from geometry.box import Box from geometry.cylinder import Cylinder from utility.opengl import MomentsTexture +from utility.mouse import MouseDragMonitor lattice_x = 256 lattice_y = 64 @@ -286,19 +287,7 @@ def on_reshape(width, height): glViewport(0,0,width,height) projection = get_projection(width, height) -def on_keyboard(key, *args): - global rotation - - x = { - b'w': -numpy.pi/20, - b's': numpy.pi/20 - }.get(key, 0.0) - z = { - b'a': numpy.pi/20, - b'd': -numpy.pi/20 - }.get(key, 0.0) - - rotation.update(x,z) +mouse_monitor = MouseDragMonitor(GLUT_LEFT_BUTTON, lambda dx, dy: rotation.update(0.005*dy, 0.005*dx)) def on_timer(t): glutTimerFunc(t, on_timer, t) @@ -306,7 +295,8 @@ def on_timer(t): glutDisplayFunc(on_display) glutReshapeFunc(on_reshape) -glutKeyboardFunc(on_keyboard) +glutMouseFunc(mouse_monitor.on_mouse) +glutMotionFunc(mouse_monitor.on_mouse_move) glutTimerFunc(10, on_timer, 10) glutMainLoop() diff --git a/utility/mouse.py b/utility/mouse.py new file mode 100644 index 0000000..c36d7e8 --- /dev/null +++ b/utility/mouse.py @@ -0,0 +1,21 @@ +from OpenGL.GLUT import * + +class MouseDragMonitor: + def __init__(self, button, callback): + self.button = button + self.callback = callback + self.active = False + + def on_mouse(self, button, state, x, y): + if button == self.button: + self.active = (state == GLUT_DOWN) + self.last_x = x + self.last_y = y + + def on_mouse_move(self, x, y): + if self.active: + delta_x = self.last_x - x + delta_y = y - self.last_y + self.last_x = x + self.last_y = y + self.callback(delta_x, delta_y) -- cgit v1.2.3