【Qt】分享一个Qt3D开发小案列

一、开篇

当在软件界面中加入3D元素,能够使软件的设计用途和效果更加具体,用户的视觉体验效果也较好,例如下图所示的界面效果:
在这里插入图片描述

本文以上图为效果原图为目标,分享Qt 3D开发的步骤和过程总结。

二、实现过程总结

(2-1)效果
请添加图片描述

(2-2)核心思路

1、使用3D建模软件进行人物模型制作,并将模型导出为xxx.obj的文件格式,如下图所示:

在这里插入图片描述
2、在QtCreator工程中,创建3D相关的类对象,核心代码如下:

#include "meshloader.h"

MeshObjWidget::MeshObjWidget(QWidget *parent)
    : QWidget(parent)
{
    initializate3DView();
}


MeshObjWidget::~MeshObjWidget()
{
    SAFE_DELETE(objs.m_windowOn3D)
    SAFE_DELETE(objs.m_rootEntity)
    SAFE_DELETE(objs.m_material)
    SAFE_DELETE(objs.m_trans)
    SAFE_DELETE(objs.m_input)
}


void MeshObjWidget::initializate(const QString & mesh_url)
{
    QWidget *container = QWidget::createWindowContainer(objs.m_windowOn3D);

    objs.m_windowOn3D->defaultFrameGraph()->setClearColor(QColor(0,191,255));
    container->setMinimumSize(QSize(200, 100));


    QHBoxLayout *hLayout = new QHBoxLayout(this);
    QVBoxLayout *vLayout = new QVBoxLayout();
    vLayout->setAlignment(Qt::AlignTop);
    hLayout->addWidget(container, 1);
    hLayout->addLayout(vLayout);

    objs.m_windowOn3D->registerAspect(objs.m_input);


    // 设置观测视角
    objs.m_windowOn3D->camera()->lens()->setPerspectiveProjection(45.0f, 16.0f / 9.0f, 0.1f, 1000.0f);
    // 设置相机位置
    objs.m_windowOn3D->camera()->setPosition(QVector3D(0, 0, 20.0f));
    objs.m_windowOn3D->camera()->setUpVector(QVector3D(0, 1, 0));
    // 设置视角中心
    objs.m_windowOn3D->camera()->setViewCenter(QVector3D(0, 0, 0));

    Qt3DCore::QEntity *lightEntity = new Qt3DCore::QEntity(objs.m_rootEntity);
    Qt3DRender::QPointLight *light = new Qt3DRender::QPointLight(lightEntity);
    light->setColor(QColor(119,136,153));
    light->setIntensity(1);
    lightEntity->addComponent(light);

    Qt3DCore::QTransform *lightTransform = new Qt3DCore::QTransform(lightEntity);
    lightTransform->setTranslation(objs.m_windowOn3D->camera()->position());
    lightEntity->addComponent(lightTransform);

    objs.m_trans->setScale(0.04f);
    objs.m_trans->setTranslation(QVector3D(0.0f, 0.0f, 19.45f));

    //创建Mesh
    Qt3DRender::QMesh *mesh = new Qt3DRender::QMesh();
    //设置Mesh路径
    mesh->setSource(QUrl(mesh_url));

    Qt3DExtras::QPhongMaterial *material = new Qt3DExtras::QPhongMaterial(objs.m_rootEntity);

    objs.m_rootEntity->addComponent(mesh);
    objs.m_rootEntity->addComponent(material);
    objs.m_rootEntity->addComponent(objs.m_trans);

    Qt3DExtras::QFirstPersonCameraController *camController = new Qt3DExtras::QFirstPersonCameraController(objs.m_rootEntity);
    camController->setCamera(objs.m_windowOn3D->camera());

    objs.m_windowOn3D->setRootEntity(objs.m_rootEntity);

    this->setStyleSheet("background:#00BFFF;");
}

void MeshObjWidget::initializate3DView()
{
    objs.m_windowOn3D   = new Qt3DWindow();
    objs.m_rootEntity   = new QtEntity();
    objs.m_material     = new QtMaterial();
    objs.m_trans        = new QtTransform();
    objs.m_input        = new QtInputAspect();
}

3、将导出的xxx.obj文件加载进软件中:

 QString curDir = QGuiApplication::applicationDirPath();
 objWidget.initializate(QString("file:%1").arg(curDir)+"/mesh/hbm.obj");

这一步需要注意:
(1)xxx.obj文件的路径可以是文件的绝对路径

(2)不要把xxx.obj文件放入Qt的资源系统中,因为3D文件往往很大,当Qt在进行编译构建时,如果将3D文件放入资源系统中,编译出的中间文件较大且生成的exe文件也较大;如果达到几十兆的3D文件,可能会直接编译崩溃退出,无法完成编译构建!!!

(3)路径前面的file字符串是必须的,可参考QUrl类。


搜索关注【嵌入式小生】wx公众号,回复【1071】即可获取本文源码工程,也可获取更多精彩内容。
请添加图片描述

  • 4
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
这是一个比较复杂的任务,需要涉及到许多3D图形学和计算机图形学的知识,但我们可以提供一个大体的思路和一些需要用到的基础知识。 1. 了解3D点云的表示方式和存储格式。3D点云通常表示为由许多点组成的点集,每个点的坐标表示其在3D空间中的位置。 2. 熟悉Qt的图形界面开发,包括Qt的信号槽机制和事件处理。 3. 了解OpenGL或者VTK等3D图形库的基本知识,包括如何创建3D场景、如何绘制3D对象、如何进行渲染等。 4. 实时渲染3D点云需要使用到GPU的计算资源,因此需要熟悉OpenGL或者Vulkan等GPU编程技术。 5. 对于大规模3D点云的渲染,需要使用到3D点云数据的分割和剪裁技术,以保证实时性和渲染质量。 基于以上的知识,我们可以提供一个简单的Qt应用程序实现实时渲染3D点云的基本框架: 1. 创建Qt窗口,并在窗口中添加OpenGL或者VTK的3D视图窗口。 2. 读取3D点云数据,并将其加载到程序中。 3. 在OpenGL或者VTK的3D场景中创建点云对象,并将读取到的点云数据绑定到该对象上。 4. 使用OpenGL或者VTK的渲染管线对点云对象进行渲染,将其在3D视图窗口中显示出来。 5. 启动一个定时器,定时更新点云对象的位置和姿态,并重新进行渲染,以实现实时渲染3D点云的效果。 需要注意的是,实时渲染3D点云需要考虑性能和渲染效果两个方面,因此需要对程序进行优化和调试,以达到最佳的效果。同时,还需要遵循相关法律法规和隐私保护原则,保护用户的数据和隐私权益。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iriczhao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值