Qt通过OBJ文件渲染3D场景
一、包含Qt3D
模块
在pro文件中添加3dextras
,告诉Qt编译器在构建项目时需要包含Qt 3D Extras模块。
QT += core gui 3dextras
二、渲染场景中一些必要的组件
//包含组件的头文件
#include <Qt3DRender/Qt3DRender>
#include <Qt3DExtras/Qt3DExtras>
// 创建一个新的3D窗口
Qt3DExtras::Qt3DWindow *view = new Qt3DExtras::Qt3DWindow();
// 创建一个QWidget,并将Qt3DWindow嵌入,使得可以像管理QWidget一样管理Qt3DWindow
QWidget *container = QWidget::createWindowContainer(view);
// 创建一个根实体,用作场景图的根节点
Qt3DCore::QEntity *scene_root = new Qt3DCore::QEntity();
// 创建一个实体,用于加载场景,作为根实体的子实体
Qt3DCore::QEntity *scene_loader_entity = new Qt3DCore::QEntity(scene_root);
// 实例化一个场景加载器,用于加载3D内容到scene_loader_entity
Qt3DRender::QSceneLoader *scene_loader = new Qt3DRender::QSceneLoader(scene_loader_entity);
// 创建一个轨道相机控制器,用于管理用户通过鼠标和键盘与场景的交互
QOrbitCameraController *camera_controller = new QOrbitCameraController(scene_root);
view->setRootEntity(scene_root); // 设置视图的根实体为scene_root
view->defaultFrameGraph()->setClearColor(QColor(220, 220, 220)); // 设置3D场景背景色
scene_loader_entity->addComponent(scene_loader); // 将scene_loader组件添加到scene_loader_entity实体
// 相机及其控制器配置
camera_controller->setCamera(view->camera());
view->camera()->setProjectionType(Qt3DRender::QCameraLens::PerspectiveProjection); // 设置相机的投影类型为透视投影
三、将container
添加到布局中
ui->container_layout->addWidget(container);
四、加载OBJ
scene_loader->setSource(QUrl::fromLocalFile(file_name));
通过scene_loader
加载的OBJ,会自动解析mtl文件并贴图,只需要将mtl及用到的图片文件放在OBJ统一目录下即可。