(本文是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()
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?