Qt3D的简单应用之一:加载外部3D模型

之前项目工作中需要实现一个功能:在控制软件中通过3D的方式显示我们的设备,使其能够更随设备位置的变化而变化。由于控制软件我使用的Qt进行的开发,那么自然就可以使用Qt3D来实现这个功能。我使用的开发环境为Qt Creator,Qt版本为Qt5.10.1。

首先看看Qt官方有没有什么合适的例子吧,在Qt的示例代码中搜索“3D”,就可以看到这样一个工程"Qt 3D: Basic Shapes C++ Example "。这是一个非常好的例子,通过这个例子我们可以对Qt3D有个大致的了解。比如:如果要支持3D显示,需要在pro文件中添加哪些东西,需要包含哪些头文件,以及显示一个3D模型的基本过程。

首先是pro文件中需要添加对3D显示的支持   QT += 3dcore 3drender 3dinput 3dextras

然后就可以添加对应的头文件并添加和显示3D图形了。下面的代码是我摘抄Basic Shapes C++ Example中部分的代码,并加上了注释

#include "scenemodifier.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    Qt3DExtras::Qt3DWindow *view = new Qt3DExtras::Qt3DWindow(); //首先创建一个场景,用于显示你要绘制或者导入模型
    view->defaultFrameGraph()->setClearColor(QColor(QRgb(0x4d4d4f)));//设置场景背景颜色

    QWidget *container = QWidget::createWindowContainer(view);//如果将3d放置在界面中,则需要创建一个widget来“装”它
    QSize screenSize = view->screen()->size();//设置场景大小
    container->setMinimumSize(QSize(200, 100));//当你缩小对话框时,你希望它最小是多少
    container->setMaximumSize(screenSize);//当你缩小对话框时,你希望它最大是多少

    QWidget *widget = new QWidget;
    QHBoxLayout *hLayout = new QHBoxLayout(widget);
    QVBoxLayout *vLayout = new QVBoxLayout();
    vLayout->setAlignment(Qt::AlignTop);
    hLayout->addWidget(container, 1);//将3d场景veiw放到widget中
    hLayout->addLayout(vLayout);

    widget->setWindowTitle(QStringLiteral("Basic shapes"));

    //注册了一个input,不知道干啥用的
    Qt3DInput::QInputAspect *input = new Qt3DInput::QInputAspect;
    view->registerAspect(input);

    // Root entity
    Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity();//创建根实体,我理解就是创建一个基础实体,然后用它来创建其他的实体

    // Camera
    Qt3DRender::QCamera *cameraEntity = view->camera();// 创建相机,设置视角

    cameraEntity->lens()->setPerspectiveProjection(45.0f, 16.0f/9.0f, 0.1f, 1000.0f);//观测视角
    cameraEntity->setPosition(QVector3D(0, 0, 20.0f));//相机放哪里?
    cameraEntity->setUpVector(QVector3D(0, 1, 0));
    cameraEntity->setViewCenter(QVector3D(0, 0, 0));//视角中心在哪里?

    Qt3DCore::QEntity *lightEntity = new Qt3DCore::QEntity(rootEntity);
    Qt3DRender::QPointLight *light = new Qt3DRender::QPointLight(lightEntity);
    light->setColor("white");//设置白光
    light->setIntensity(1);//设置光的强度
    lightEntity->addComponent(light);

    Qt3DCore::QTransform *lightTransform = new Qt3DCore::QTransform(lightEntity);
    lightTransform->setTranslation(cameraEntity->position());
    lightEntity->addComponent(lightTransform);

    // For camera controls
    // 设置相机控制,什么第一视场什么的,不是很懂,待补充。
    Qt3DExtras::QFirstPersonCameraController *camController = new Qt3DExtras::QFirstPersonCameraController(rootEntity);
    camController->setCamera(cameraEntity);

    // Scenemodifier
    //场景修改?
    SceneModifier *modifier = new SceneModifier(rootEntity);

    // Set root object of the scene
    view->setRootEntity(rootEntity);// 关键语句,将这么多实体加载进view当中...


    //下面这些都是本例中的一些具体操作,这里就省略不写了,大家可以自己看Qt Creator中的例子
    //这个例子中它把要显示的内容都放到SceneModifier这个类中了,只要看看需要显示的东东要
    //设置哪些参数就可以了,后面自己做的时候照葫芦画瓢即可。
    //...................
    //....................
    // Show window
    widget->show();
    widget->resize(1200, 800);

    return app.exec();
}

上面都是最基础的部分,把上面的内容搞明白了,才能继续。

上面的例子只是在场景中创建一些常见的3D模型,那么如何导入一些我们自己的模型了?很遗憾我在Qt官方提供的例子中没有找到。后来经过高人指点,终于知道该如何导入外部的模型。

首先,我的模型最初是来自机械工程师提供的原图,他们提供的原图为后缀名stl的图(我也不知道这是啥格式,反正就是原始的机械图纸),得到这个图之后需要通过3ds Max转换为后缀名为obj格式的文件。这里需要注意的是转换的时候要看看不能把一些细节的部分给转换没了,并且让机械工程师把原始3D文件中内部的一些机械结构(也就是slt文件中),统统给删了,反正我们也用不着显示内部的细节,有外部的框架就可以了,这样可以减少文件的大小。得到这个obj文件就可以把它作为Qt的属性文件加载到工程中去了!然后用Qt3DRender::QMesh *mesh这个对象的setSource方法就可以把模型加载进去了!

你可能感兴趣的:(Qt)