q3dviewer 1.1.2__tar.gz → 1.1.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. {q3dviewer-1.1.2/q3dviewer.egg-info → q3dviewer-1.1.3}/PKG-INFO +1 -1
  2. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/pyproject.toml +0 -1
  3. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/base_glwidget.py +59 -31
  4. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/custom_items/image_item.py +2 -7
  5. {q3dviewer-1.1.2 → q3dviewer-1.1.3/q3dviewer.egg-info}/PKG-INFO +1 -1
  6. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer.egg-info/requires.txt +0 -1
  7. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/setup.py +1 -2
  8. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/LICENSE +0 -0
  9. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/README.md +0 -0
  10. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/__init__.py +0 -0
  11. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/base_item.py +0 -0
  12. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/custom_items/__init__.py +0 -0
  13. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/custom_items/axis_item.py +0 -0
  14. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/custom_items/cloud_io_item.py +0 -0
  15. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/custom_items/cloud_item.py +0 -0
  16. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/custom_items/frame_item.py +0 -0
  17. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/custom_items/gaussian_item.py +0 -0
  18. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/custom_items/grid_item.py +0 -0
  19. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/custom_items/line_item.py +0 -0
  20. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/custom_items/text_item.py +0 -0
  21. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/glwidget.py +0 -0
  22. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/shaders/cloud_frag.glsl +0 -0
  23. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/shaders/cloud_vert.glsl +0 -0
  24. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/shaders/gau_frag.glsl +0 -0
  25. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/shaders/gau_prep.glsl +0 -0
  26. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/shaders/gau_vert.glsl +0 -0
  27. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/shaders/sort_by_key.glsl +0 -0
  28. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/tools/__init__.py +0 -0
  29. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/tools/cloud_viewer.py +0 -0
  30. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/tools/example_viewer.py +0 -0
  31. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/tools/film_maker.py +0 -0
  32. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/tools/gaussian_viewer.py +0 -0
  33. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/tools/lidar_calib.py +0 -0
  34. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/tools/lidar_cam_calib.py +0 -0
  35. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/tools/ros_viewer.py +0 -0
  36. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/utils/__init__.py +0 -0
  37. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/utils/cloud_io.py +0 -0
  38. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/utils/convert_ros_msg.py +0 -0
  39. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/utils/gl_helper.py +0 -0
  40. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/utils/maths.py +0 -0
  41. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/utils/range_slider.py +0 -0
  42. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer/viewer.py +0 -0
  43. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer.egg-info/SOURCES.txt +0 -0
  44. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer.egg-info/dependency_links.txt +0 -0
  45. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer.egg-info/entry_points.txt +0 -0
  46. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/q3dviewer.egg-info/top_level.txt +0 -0
  47. {q3dviewer-1.1.2 → q3dviewer-1.1.3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: q3dviewer
3
- Version: 1.1.2
3
+ Version: 1.1.3
4
4
  Summary: A library designed for quickly deploying a 3D viewer.
5
5
  Home-page: https://github.com/scomup/q3dviewer
6
6
  Author: Liu Yang
@@ -9,7 +9,6 @@ python = "^3.8"
9
9
  numpy = "^1.21"
10
10
  pyside6 = "^6.2"
11
11
  PyOpenGL = "^3.1"
12
- pillow = "^8.3"
13
12
  meshio = "^4.4"
14
13
  pypcd4 = "^0.1"
15
14
  pye57 = "^0.1"
@@ -25,7 +25,7 @@ class BaseGLWidget(QtOpenGLWidgets.QOpenGLWidget):
25
25
  self.active_keys = set()
26
26
  self.show_center = False
27
27
  self.enable_show_center = True
28
- self.view_need_update = True
28
+ self.need_recalc_view = True
29
29
  self.view_matrix = self.get_view_matrix()
30
30
  self.projection_matrix = self.get_projection_matrix()
31
31
 
@@ -98,7 +98,7 @@ class BaseGLWidget(QtOpenGLWidgets.QOpenGLWidget):
98
98
 
99
99
  def set_view_matrix(self, view_matrix):
100
100
  self.view_matrix = view_matrix
101
- self.view_need_update = False
101
+ self.need_recalc_view = False
102
102
 
103
103
  def mouseReleaseEvent(self, ev):
104
104
  if hasattr(self, 'mousePos'):
@@ -106,13 +106,13 @@ class BaseGLWidget(QtOpenGLWidgets.QOpenGLWidget):
106
106
 
107
107
  def set_dist(self, dist):
108
108
  self.dist = dist
109
- self.view_need_update = True
109
+ self.need_recalc_view = True
110
110
 
111
111
  def update_dist(self, delta):
112
112
  self.dist += delta
113
113
  if self.dist < 0.1:
114
114
  self.dist = 0.1
115
- self.view_need_update = True
115
+ self.need_recalc_view = True
116
116
 
117
117
  def wheelEvent(self, ev):
118
118
  delta = ev.angleDelta().x()
@@ -121,6 +121,24 @@ class BaseGLWidget(QtOpenGLWidgets.QOpenGLWidget):
121
121
  self.update_dist(-delta * self.dist * 0.001)
122
122
  self.show_center = True
123
123
 
124
+
125
+ def rotate_keep_cam_pos(self, rx=0, ry=0, rz=0):
126
+ """
127
+ Rotate the camera while keeping the current camera position.
128
+ This updates both the Euler angles and the center point.
129
+ """
130
+ new_euler = self.euler + np.array([rx, ry, rz])
131
+ new_euler = (new_euler + np.pi) % (2 * np.pi) - np.pi
132
+
133
+ Rwc_old = euler_to_matrix(self.euler)
134
+ tco = np.array([0, 0, self.dist])
135
+ twc = self.center + Rwc_old @ tco
136
+
137
+ Rwc_new = euler_to_matrix(new_euler)
138
+ self.center = twc - Rwc_new @ tco
139
+ self.euler = new_euler
140
+ self.need_recalc_view = True
141
+
124
142
  def mouseMoveEvent(self, ev):
125
143
  lpos = ev.localPos()
126
144
  if not hasattr(self, 'mousePos'):
@@ -131,24 +149,26 @@ class BaseGLWidget(QtOpenGLWidgets.QOpenGLWidget):
131
149
  rot_speed = 0.2
132
150
  dyaw = radians(-diff.x() * rot_speed)
133
151
  droll = radians(-diff.y() * rot_speed)
134
- self.rotate(droll, 0, dyaw)
152
+ if ev.modifiers() & QtCore.Qt.ShiftModifier:
153
+ self.rotate_keep_cam_pos(droll, 0, dyaw)
154
+ else:
155
+ self.rotate(droll, 0, dyaw)
135
156
  elif ev.buttons() == QtCore.Qt.MouseButton.LeftButton:
136
157
  Rwc = euler_to_matrix(self.euler)
137
158
  Kinv = np.linalg.inv(self.get_K())
138
159
  dist = max(self.dist, 0.5)
139
- self.center += Rwc @ Kinv @ np.array([-diff.x(), diff.y(), 0]) * dist
160
+ self.translate(Rwc @ Kinv @ np.array([-diff.x(), diff.y(), 0]) * dist)
140
161
  self.show_center = True
141
- self.view_need_update = True
142
162
 
143
163
  def set_center(self, center):
144
164
  self.center = center
145
- self.view_need_update = True
165
+ self.need_recalc_view = True
146
166
 
147
167
  def paintGL(self):
148
168
  # if the camera is moved, update the model view matrix.
149
- if self.view_need_update:
169
+ if self.need_recalc_view:
150
170
  self.view_matrix = self.get_view_matrix()
151
- self.view_need_update = False
171
+ self.need_recalc_view = False
152
172
  self.update_model_view()
153
173
 
154
174
  # set the background color
@@ -192,45 +212,48 @@ class BaseGLWidget(QtOpenGLWidgets.QOpenGLWidget):
192
212
  return
193
213
  rot_speed = 0.5
194
214
  trans_speed = max(self.dist * 0.005, 0.1)
215
+ shift_pressed = QtCore.Qt.Key_Shift in self.active_keys
195
216
  # Handle rotation keys
196
217
  if QtCore.Qt.Key_Up in self.active_keys:
197
- self.rotate(radians(rot_speed), 0, 0)
198
- self.view_need_update = True
218
+ if shift_pressed:
219
+ self.rotate_keep_cam_pos(radians(rot_speed), 0, 0)
220
+ else:
221
+ self.rotate(radians(rot_speed), 0, 0)
199
222
  if QtCore.Qt.Key_Down in self.active_keys:
200
- self.rotate(radians(-rot_speed), 0, 0)
201
- self.view_need_update = True
223
+ if shift_pressed:
224
+ self.rotate_keep_cam_pos(radians(-rot_speed), 0, 0)
225
+ else:
226
+ self.rotate(radians(-rot_speed), 0, 0)
202
227
  if QtCore.Qt.Key_Left in self.active_keys:
203
- self.rotate(0, 0, radians(rot_speed))
204
- self.view_need_update = True
228
+ if shift_pressed:
229
+ self.rotate_keep_cam_pos(0, 0, radians(rot_speed))
230
+ else:
231
+ self.rotate(0, 0, radians(rot_speed))
205
232
  if QtCore.Qt.Key_Right in self.active_keys:
206
- self.rotate(0, 0, radians(-rot_speed))
207
- self.view_need_update = True
233
+ if shift_pressed:
234
+ self.rotate_keep_cam_pos(0, 0, radians(-rot_speed))
235
+ else:
236
+ self.rotate(0, 0, radians(-rot_speed))
208
237
  # Handle zoom keys
209
238
  xz_keys = {QtCore.Qt.Key_Z, QtCore.Qt.Key_X}
210
239
  if self.active_keys & xz_keys:
211
240
  Rwc = euler_to_matrix(self.euler)
212
241
  if QtCore.Qt.Key_Z in self.active_keys:
213
- self.center += Rwc @ np.array([0, 0, -trans_speed])
214
- self.view_need_update = True
242
+ self.translate(Rwc @ np.array([0, 0, -trans_speed]))
215
243
  if QtCore.Qt.Key_X in self.active_keys:
216
- self.center += Rwc @ np.array([0, 0, trans_speed])
217
- self.view_need_update = True
244
+ self.translate(Rwc @ np.array([0, 0, trans_speed]))
218
245
  # Handle translation keys on the z plane
219
246
  dir_keys = {QtCore.Qt.Key_W, QtCore.Qt.Key_S, QtCore.Qt.Key_A, QtCore.Qt.Key_D}
220
247
  if self.active_keys & dir_keys:
221
248
  Rz = euler_to_matrix([0, 0, self.euler[2]])
222
249
  if QtCore.Qt.Key_W in self.active_keys:
223
- self.center += Rz @ np.array([0, trans_speed, 0])
224
- self.view_need_update = True
250
+ self.translate(Rz @ np.array([0, trans_speed, 0]))
225
251
  if QtCore.Qt.Key_S in self.active_keys:
226
- self.center += Rz @ np.array([0, -trans_speed, 0])
227
- self.view_need_update = True
252
+ self.translate(Rz @ np.array([0, -trans_speed, 0]))
228
253
  if QtCore.Qt.Key_A in self.active_keys:
229
- self.center += Rz @ np.array([-trans_speed, 0, 0])
230
- self.view_need_update = True
254
+ self.translate(Rz @ np.array([-trans_speed, 0, 0]))
231
255
  if QtCore.Qt.Key_D in self.active_keys:
232
- self.center += Rz @ np.array([trans_speed, 0, 0])
233
- self.view_need_update = True
256
+ self.translate(Rz @ np.array([trans_speed, 0, 0]))
234
257
 
235
258
  def update_model_view(self):
236
259
  glMatrixMode(GL_MODELVIEW)
@@ -259,7 +282,7 @@ class BaseGLWidget(QtOpenGLWidgets.QOpenGLWidget):
259
282
 
260
283
  def set_euler(self, euler):
261
284
  self.euler = euler
262
- self.view_need_update = True
285
+ self.need_recalc_view = True
263
286
 
264
287
  def set_color(self, color):
265
288
  self.color = color
@@ -303,6 +326,11 @@ class BaseGLWidget(QtOpenGLWidgets.QOpenGLWidget):
303
326
  self.euler[2] = (self.euler[2] + np.pi) % (2 * np.pi) - np.pi
304
327
  self.euler[1] = (self.euler[1] + np.pi) % (2 * np.pi) - np.pi
305
328
  self.euler[0] = np.clip(self.euler[0], 0, np.pi)
329
+ self.need_recalc_view = True
330
+
331
+ def translate(self, trans):
332
+ self.center += trans
333
+ self.need_recalc_view = True
306
334
 
307
335
  def change_show_center(self, state):
308
336
  self.enable_show_center = state
@@ -7,7 +7,6 @@ from q3dviewer.base_item import BaseItem
7
7
  from OpenGL.GL import *
8
8
  import numpy as np
9
9
  from OpenGL.GL import shaders
10
- from PIL import Image as PIL_Image
11
10
  from PySide6.QtWidgets import QLabel, QSpinBox, QCheckBox
12
11
 
13
12
 
@@ -108,12 +107,8 @@ class ImageItem(BaseItem):
108
107
  glBindVertexArray(0)
109
108
 
110
109
  def set_data(self, data):
111
- if isinstance(data, np.ndarray):
112
- pass
113
- elif isinstance(data, PIL_Image.Image):
114
- data = np.array(data)
115
- else:
116
- print("not support image type")
110
+ if not isinstance(data, np.ndarray):
111
+ print("The image type is not supported.")
117
112
  raise NotImplementedError
118
113
 
119
114
  if data.ndim == 2: # Grayscale image
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: q3dviewer
3
- Version: 1.1.2
3
+ Version: 1.1.3
4
4
  Summary: A library designed for quickly deploying a 3D viewer.
5
5
  Home-page: https://github.com/scomup/q3dviewer
6
6
  Author: Liu Yang
@@ -4,7 +4,6 @@ imageio[ffmpeg]
4
4
  laspy
5
5
  meshio
6
6
  numpy
7
- pillow
8
7
  pye57
9
8
  pypcd4
10
9
  pyside6
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
 
3
3
  setup(
4
4
  name='q3dviewer',
5
- version='1.1.2',
5
+ version='1.1.3',
6
6
  author="Liu Yang",
7
7
  description="A library designed for quickly deploying a 3D viewer.",
8
8
  long_description=open("README.md").read(),
@@ -22,7 +22,6 @@ setup(
22
22
  'numpy',
23
23
  'pyside6',
24
24
  'PyOpenGL',
25
- 'pillow',
26
25
  'meshio',
27
26
  'pypcd4',
28
27
  'pye57',
File without changes
File without changes
File without changes
File without changes