使用trimesh加载点云,使用pyrender设置场景,显示在PyQt5的QOpenGLWidget窗口中,并且可以通过‘文件’->‘打开’选择点云文件加载
时间: 2024-05-03 10:21:43 浏览: 285
以下是一个实现上述功能的示例代码:
```python
import os
import trimesh
import pyrender
from PyQt5 import QtWidgets, QtGui, QtCore, QtOpenGL
from PyQt5.QtWidgets import QFileDialog
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("PyQt5 + Pyrender Example")
self.create_widgets()
self.create_menu()
self.mesh = None
def create_widgets(self):
self.glWidget = GLWidget(self)
self.setCentralWidget(self.glWidget)
def create_menu(self):
menu_bar = self.menuBar()
file_menu = menu_bar.addMenu("文件")
open_action = QtWidgets.QAction("打开", self)
open_action.triggered.connect(self.open_file_dialog)
file_menu.addAction(open_action)
def open_file_dialog(self):
file_path, _ = QFileDialog.getOpenFileName(self, "选择点云文件", "", "点云文件 (*.ply *.obj)")
if file_path:
self.load_mesh(file_path)
def load_mesh(self, file_path):
if os.path.isfile(file_path):
self.mesh = trimesh.load(file_path)
self.glWidget.set_mesh(self.mesh)
class GLWidget(QtOpenGL.QGLWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.scene = pyrender.Scene()
self.camera = pyrender.PerspectiveCamera(yfov=45.0, aspectRatio=1.0)
self.view_matrix = self.camera.get_projection_matrix()
def set_mesh(self, mesh):
if self.scene is not None:
self.scene.clear()
if mesh is not None:
mesh_node = pyrender.Mesh.from_trimesh(mesh)
self.scene.add(mesh_node)
self.update()
def paintGL(self):
pyrender.Viewer(self.scene, use_raymond_lighting=True, viewport_size=(self.width(), self.height()))
def resizeGL(self, width, height):
self.camera.viewport_width = width
self.camera.viewport_height = height
self.view_matrix = self.camera.get_projection_matrix()
def initializeGL(self):
pass
if __name__ == "__main__":
app = QtWidgets.QApplication([])
window = MainWindow()
window.showMaximized()
app.exec_()
```
在这个示例代码中,我们创建了一个`MainWindow`类和一个`GLWidget`类。`MainWindow`类继承自`QMainWindow`,用于创建窗口和菜单栏,以及处理文件打开操作。`GLWidget`类继承自`QGLWidget`,用于显示3D场景。
在`MainWindow`类中,我们使用`trimesh`库加载点云文件,并将其传递给`GLWidget`类的`set_mesh`方法。在`GLWidget`类中,我们使用`pyrender`库创建一个场景,并在`paintGL`方法中使用`pyrender.Viewer`类将场景渲染到OpenGL窗口中。在`resizeGL`方法中,我们更新摄像机的视口大小,以便在窗口大小发生变化时更新OpenGL窗口。在`initializeGL`方法中,我们不需要执行任何操作,因为我们的场景是在`paintGL`方法中渲染的。
阅读全文