0
点赞
收藏
分享

微信扫一扫

python OpenGLWidget导入多个模型

言诗把酒 2024-09-08 阅读 2

Python中的OpenGLWidget导入多个模型

在计算机图形学中,OpenGL 是一个非常强大的绘图API,广泛用于游戏设计、图形艺术和科学可视化。随着Python的成熟,各种库的出现使得我们可以更轻松地在Python中使用OpenGL。通过 Qt 的 OpenGLWidget,我们可以在一个窗口中渲染多个3D模型。本文将通过代码示例介绍如何使用 Python 的 PyQt5 和 PyOpenGL 来实现这一功能。

环境准备

要开始,我们需要安装PyQt5和PyOpenGL这两个库。如果你的环境尚未安装,可以通过以下命令安装:

pip install PyQt5 PyOpenGL PyOpenGL_accelerate

基本结构

在本文中,我们将定义一个基本的OpenGLWidget类,并在其中加载多个3D模型。3D模型通常以.obj或其他格式存储。为了简化,我们将使用预先准备好的模型文件。

创建OpenGLWidget

首先,我们需要创建一个继承自QOpenGLWidget的类:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget
from PyQt5.QtOpenGL import QOpenGLWidget
from OpenGL.GL import *
from OpenGL.GLU import *

class MyOpenGLWidget(QOpenGLWidget):
    def __init__(self):
        super(MyOpenGLWidget, self).__init__()
        self.models = []  # 用于存储加载的模型

    def initializeGL(self):
        glClearColor(0.1, 0.1, 0.1, 1)  # 背景颜色
        glEnable(GL_DEPTH_TEST)  # 开启深度测试

    def loadModel(self, filename):
        # 这里将加载模型文件并生成显示列表
        # 模型的加载实现通常涉及到文件的读取和解析
        pass  # 具体实现略

    def paintGL(self):
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)  # 清除缓冲区
        for model in self.models:
            model.draw()  # 绘制每个模型

    def resizeGL(self, w, h):
        glViewport(0, 0, w, h)  # 设置视口
        glMatrixMode(GL_PROJECTION)  # 设置投影矩阵
        glLoadIdentity()
        gluPerspective(45, (w / h), 0.1, 100)  # 透视投影
        glMatrixMode(GL_MODELVIEW)  # 设置模型视图矩阵

加载多个模型

loadModel 方法中,你需要解析模型文件,并将模型信息存储到 self.models 列表中。以下是一个加载并添加模型的简化版本:

from OpenGL.GL import *
from OpenGL.GLU import *

class Model:
    def __init__(self, vertices):
        self.vertices = vertices

    def draw(self):
        glBegin(GL_TRIANGLES)
        for vertex in self.vertices:
            glVertex3fv(vertex)
        glEnd()

# 模拟模型加载
def loadModel(self, filename):
    # 通常这部分代码会读取.obj文件
    vertices = [
        # 示例顶点
        (0, 1, 0), (1, -1, 0), (-1, -1, 0),
        (1, -1, 0), (0, 1, 0), (0, 0, 1)
    ]
    model = Model(vertices)
    self.models.append(model)

主窗体和应用程序

最后,我们需要创建一个主窗口来显示我们的 OpenGLWidget:

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setWindowTitle("OpenGL Multiple Models Example")
        self.setGeometry(200, 200, 800, 600)

        self.opengl_widget = MyOpenGLWidget()
        self.opengl_widget.loadModel("model1.obj")
        self.opengl_widget.loadModel("model2.obj")

        layout = QVBoxLayout()
        layout.addWidget(self.opengl_widget)

        container = QWidget()
        container.setLayout(layout)
        self.setCentralWidget(container)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

完整代码示例

以下是整个代码的完整示例:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget
from PyQt5.QtOpenGL import QOpenGLWidget
from OpenGL.GL import *
from OpenGL.GLU import *


class Model:
    def __init__(self, vertices):
        self.vertices = vertices

    def draw(self):
        glBegin(GL_TRIANGLES)
        for vertex in self.vertices:
            glVertex3fv(vertex)
        glEnd()


class MyOpenGLWidget(QOpenGLWidget):
    def __init__(self):
        super(MyOpenGLWidget, self).__init__()
        self.models = []

    def initializeGL(self):
        glClearColor(0.1, 0.1, 0.1, 1)
        glEnable(GL_DEPTH_TEST)

    def loadModel(self, filename):
        vertices = [
            (0, 1, 0), (1, -1, 0), (-1, -1, 0),
            (1, -1, 0), (0, 1, 0), (0, 0, 1)
        ]
        model = Model(vertices)
        self.models.append(model)

    def paintGL(self):
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        for model in self.models:
            model.draw()

    def resizeGL(self, w, h):
        glViewport(0, 0, w, h)
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        gluPerspective(45, (w / h), 0.1, 100)
        glMatrixMode(GL_MODELVIEW)


class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setWindowTitle("OpenGL Multiple Models Example")
        self.setGeometry(200, 200, 800, 600)

        self.opengl_widget = MyOpenGLWidget()
        self.opengl_widget.loadModel("model1.obj")
        self.opengl_widget.loadModel("model2.obj")

        layout = QVBoxLayout()
        layout.addWidget(self.opengl_widget)

        container = QWidget()
        container.setLayout(layout)
        self.setCentralWidget(container)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

结语

通过上述步骤,我们使用 Python 的 PyQt5 和 PyOpenGL 创建了一个简单的 OpenGL 应用程序,可以导入并显示多个3D模型。尽管示例代码中模型加载的具体实现被简化,但这为后续的开发打下了基础。

如果你希望在这个基础上进一步扩展,比如添加纹理、Lighting,甚至进行用户交互,OpenGL 提供了极大的灵活性和功能。初学者可以从这一简单示例开始,逐步深入更复杂的三维图形编程。希望这篇文章能对你有所帮助!

举报

相关推荐

0 条评论