1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
import moderngl_window as mglw
from moderngl_window.scene.camera import KeyboardCamera, OrbitCamera
class CameraWindow(mglw.WindowConfig):
"""Base class with built in 3D camera support"""
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.camera = KeyboardCamera(self.wnd.keys, aspect_ratio=self.wnd.aspect_ratio)
self.camera_enabled = True
def key_event(self, key, action, modifiers):
keys = self.wnd.keys
if self.camera_enabled:
self.camera.key_input(key, action, modifiers)
if action == keys.ACTION_PRESS:
if key == keys.C:
self.camera_enabled = not self.camera_enabled
self.wnd.mouse_exclusivity = self.camera_enabled
self.wnd.cursor = not self.camera_enabled
if key == keys.SPACE:
self.timer.toggle_pause()
def mouse_position_event(self, x: int, y: int, dx, dy):
if self.camera_enabled:
self.camera.rot_state(-dx, -dy)
def resize(self, width: int, height: int):
self.camera.projection.update(aspect_ratio=self.wnd.aspect_ratio)
class OrbitCameraWindow(mglw.WindowConfig):
"""Base class with built in 3D orbit camera support
Move the mouse to orbit the camera around the view point.
"""
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.camera = OrbitCamera(aspect_ratio=self.wnd.aspect_ratio)
self.camera_enabled = True
def key_event(self, key, action, modifiers):
keys = self.wnd.keys
if action == keys.ACTION_PRESS:
if key == keys.C:
self.camera_enabled = not self.camera_enabled
self.wnd.mouse_exclusivity = self.camera_enabled
self.wnd.cursor = not self.camera_enabled
if key == keys.SPACE:
self.timer.toggle_pause()
def mouse_position_event(self, x: int, y: int, dx, dy):
if self.camera_enabled:
self.camera.rot_state(dx, dy)
def mouse_scroll_event(self, x_offset: float, y_offset: float):
if self.camera_enabled:
self.camera.zoom_state(y_offset)
def resize(self, width: int, height: int):
self.camera.projection.update(aspect_ratio=self.wnd.aspect_ratio)
class OrbitDragCameraWindow(mglw.WindowConfig):
"""Base class with drag-based 3D orbit support
Click and drag with the left mouse button to orbit the camera around the view point.
"""
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.camera = OrbitCamera(aspect_ratio=self.wnd.aspect_ratio)
def key_event(self, key, action, modifiers):
keys = self.wnd.keys
if action == keys.ACTION_PRESS:
if key == keys.SPACE:
self.timer.toggle_pause()
def mouse_drag_event(self, x: int, y: int, dx, dy):
self.camera.rot_state(dx, dy)
def mouse_scroll_event(self, x_offset: float, y_offset: float):
self.camera.zoom_state(y_offset)
def resize(self, width: int, height: int):
self.camera.projection.update(aspect_ratio=self.wnd.aspect_ratio)
|