您当前的位置: 首页 >  qt

龚建波

暂无认证

  • 5浏览

    0关注

    313博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

OpenGL with QtWidgets:使用Assimp库加载模型

龚建波 发布时间:2021-10-20 00:08:28 ,浏览量:5

(本文是LearnOpenGL的学习笔记, 教程中文翻译地址https://learnopengl-cn.github.io/(备用地址https://learnopengl-cn.readthedocs.io/zh/latest/),写于 2021-10-19)

0.前言

教程加载模型这一章节主要是讲 Assimp 库的基本使用,所以本文就记录下 Assimp 使用 VS2019 编译,以及在 Qt 中的基本使用。

1.Assimp 下载与编译

源码可以直接去 github 下载(搜 assimp):https://github.com/assimp/assimp

里面提供了一些发布版,如当前最新发布版为 5.0.1。当然,用 vcpkg 包管理器也可以直接下载安装。

如果是下源码自己编译,它提供了 CMakeLists.txt。我使用的 VS2019,本身就支持 CMake 构建,所以就不用拿 CMake-gui 来生成工程了。下面说下我的操作步骤:

先使用 VS2019 打开源码顶层目录的 CMakeLists.txt,这时默认会有个 x64-Debug 的配置;

再点菜单栏项目-CMake设置,会生成一个 CMakeSettings.json 的配置文件;

点界面上右上角的编辑 JSON 按钮,进入文本编辑模式;

 

然后将默认的 Debug 直接改成 Release;

这时候直接生成的话他是默认 mt 编译的,如果想设置成 md,可以修改源码 code 目录下的 CMakeLists.txt;

这时点菜单栏生成-全部生成,生成的 dll 会在 out 目录下; 

路径如:F:\Download\assimp-5.0.1\assimp-5.0.1\out\build\x64-Release\code

然后 include 可能只有一个 config.h 文件,我们把它 copy 到源码的 include 文件夹里。

头文件和动态库都有了,就可以丢测试用例里折腾一番了。

2.在 Qt 中的基本使用

使用的话,主要是参照 LearnOpenGL 教程:https://learnopengl-cn.github.io/03%20Model%20Loading/01%20Assimp/

这个库还是比较方便的,读取文件后会生成对应的节点树。

 写了个简单的 Demo,链接:​​​​​​​https://github.com/gongjianbo/MyTestCode/tree/master/Qt/TestQt_20211018_Assimp​​​​​​​

obj 模型我是直接从 Qt 示例里搜来的,效果如下(我没管光照和纹理,只拿顶点和索引测试):

主要代码如下:

#pragma once
#include 
#include 
#include 
#include 
#include 
#include 

#include "assimp/assimp/Importer.hpp"
#include "assimp/assimp/scene.h"
#include "assimp/assimp/postprocess.h"

// 参照LearnOpenGL:https://learnopengl-cn.github.io/03%20Model%20Loading/03%20Model/#3dopengl
class GLView :
        public QOpenGLWidget,
        protected QOpenGLFunctions_3_3_Core
{
    Q_OBJECT
public:
    explicit GLView(QWidget *parent = nullptr);
    ~GLView();

    // 加载模型
    void loadModel(const QString &filepath);
    void processNode(aiNode *node, const aiScene *scene);
    void processMesh(aiMesh *mesh, const aiScene *scene);

protected:
    // 渲染需要实现的三个虚函数
    void initializeGL() override;
    void paintGL() override;
    void resizeGL(int width, int height) override;
    // 点击切换模型
    void mousePressEvent(QMouseEvent *event) override;

private:
    QOpenGLShaderProgram shaderProgram;
    QOpenGLVertexArrayObject vao;
    QOpenGLBuffer vbo;
    QOpenGLBuffer ebo;

    // 定时器旋转模型
    QTimer timer;
    int angle = 0;

    // 存顶点和索引
    QVector vertices;
    QVector indices;
};

#include "GLView.h"
#include 
#include 

GLView::GLView(QWidget *parent)
    : QOpenGLWidget(parent)
{
    loadModel(qApp->applicationDirPath()+"/trefoil.obj");

    connect(&timer, &QTimer::timeout, [=]{
        angle += 2;
        update();
    });
    timer.start(100);
}

GLView::~GLView()
{
    if(!isValid())
        return;
    makeCurrent();
    vao.destroy();
    vbo.destroy();
    ebo.destroy();
    doneCurrent();
}

void GLView::loadModel(const QString &filepath)
{
    Assimp::Importer importer;
    const aiScene* scene = importer.ReadFile(filepath.toUtf8(), aiProcess_Triangulate |
                                             aiProcess_FlipUVs | aiProcess_CalcTangentSpace);
    if (!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE ||
            !scene->mRootNode) {
        qDebug()            
关注
打赏
1655829268
查看更多评论
0.0635s