qt 用opengl 展示3d模型
时间: 2023-11-30 11:05:01 浏览: 90
基于OpenGL的3D模型显示
可以使用Qt自带的QOpenGLWidget来展示3D模型,具体步骤如下:
1. 创建一个继承自QOpenGLWidget的类,重写其initializeGL、resizeGL和paintGL方法。
2. 在initializeGL方法中初始化OpenGL环境,包括设置OpenGL版本、创建VAO、VBO等。
3. 在resizeGL方法中设置视口和投影矩阵。
4. 在paintGL方法中绘制3D模型,包括设置模型矩阵、绑定纹理、绘制VAO等。
5. 创建一个窗口,将上述自定义的QOpenGLWidget添加到窗口中。
6. 在窗口中加载3D模型文件,通过OpenGL绘制出来。
下面是一个简单的示例代码:
```
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QOpenGLShaderProgram>
#include <QOpenGLBuffer>
class MyOpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
public:
MyOpenGLWidget(QWidget *parent = nullptr);
~MyOpenGLWidget();
protected:
void initializeGL() override;
void resizeGL(int w, int h) override;
void paintGL() override;
private:
QOpenGLShaderProgram m_program;
QOpenGLBuffer m_vbo;
};
MyOpenGLWidget::MyOpenGLWidget(QWidget *parent)
: QOpenGLWidget(parent)
{}
MyOpenGLWidget::~MyOpenGLWidget()
{}
void MyOpenGLWidget::initializeGL()
{
initializeOpenGLFunctions();
m_program.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/vertexShader.glsl");
m_program.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/fragmentShader.glsl");
m_program.link();
m_program.bind();
// 创建VAO和VBO
m_vbo.create();
m_vbo.bind();
m_vbo.allocate(vertices, sizeof(vertices));
m_program.enableAttributeArray(0);
m_program.setAttributeBuffer(0, GL_FLOAT, 0, 3, sizeof(Vertex));
}
void MyOpenGLWidget::resizeGL(int w, int h)
{
glViewport(0, 0, w, h);
// 设置投影矩阵
QMatrix4x4 projection;
projection.perspective(45.0f, GLfloat(w) / h, 0.1f, 100.0f);
m_program.setUniformValue("projection", projection);
}
void MyOpenGLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 设置模型矩阵
QMatrix4x4 model;
model.translate(0.0f, 0.0f, -5.0f);
model.rotate(45.0f, QVector3D(1.0f, 0.0f, 0.0f));
m_program.setUniformValue("model", model);
// 绑定纹理
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_texture);
// 绘制VAO
m_vao.bind();
glDrawArrays(GL_TRIANGLES, 0, 36);
m_vao.release();
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyOpenGLWidget widget;
widget.show();
return app.exec();
}
```
以上是一个简单的OpenGL绘制3D模型的示例,更完整的代码可以参考Qt官方文档和OpenGL官方文档。
阅读全文