Qt 3D c++ (五):代码汇总

.pro

SOURCES += \
    main.cpp \
    mymodel.cpp
QT += 3dcore 3drender 3dinput 3dextras 3dlogic 3danimation
QT += widgets

HEADERS += \
    mymodel.h
mymodel.h

#ifndef MYMODEL_H
#define MYMODEL_H

#include <QObject>
#include<QEntity>
#include<QTorusMesh>
#include<QTransform>
#include<QPhongMaterial>
class MyModel : public QObject
{
    Q_OBJECT
public:
    explicit MyModel(Qt3DCore::QEntity *rootEntity);
    ~MyModel();
private:
    Qt3DCore::QEntity *m_rootEntity;
    Qt3DExtras::QTorusMesh *m_torus;
    Qt3DCore::QEntity *m_torusEntity;
public slots:
    void enableTorus(bool enabled);
};

#endif // MYMODEL_H
main.cpp


#include <QWidget>
#include <QApplication>

#include <Qt3DWindow>
#include <QForwardRenderer>
#include <QScreen>
#include <QHBoxLayout>
#include <QVBoxLayout>

#include <QInputAspect>
#include <QCamera>
#include <QPointLight>
#include <QFirstPersonCameraController>
#include <QEntity>
#include "mymodel.h"

int main(int argc, char *argv[])
{
    //QCoreApplication a(argc, argv);
    QApplication a(argc, argv);
    QWidget *widget = new QWidget;

    Qt3DExtras::Qt3DWindow *view = new Qt3DExtras::Qt3DWindow();
    view->defaultFrameGraph()->setClearColor(QColor(QRgb(0x81fdff)));
    //创建画布

    QWidget *container = QWidget::createWindowContainer(view);
    QSize screenSize = view->screen()->size();
    container->setMinimumSize(QSize(200, 100));
    container->setMaximumSize(screenSize);
    //创建画布的容器,并将画布作为参数放进容器 QWidget *container = QWidget::createWindowContainer(view);

    QHBoxLayout *hLayout = new QHBoxLayout(widget);
    QVBoxLayout *vLayout = new QVBoxLayout();
    vLayout->setAlignment(Qt::AlignTop);
    hLayout->addWidget(container, 1);
    hLayout->addLayout(vLayout);
    //将画布的容器container放到窗口对象widget中,并添加布局

    //至此 画布添加完毕

    Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity();
    //创建Entity对象,这个Entity将会包含相机参数,光线参数,以及3D模型,最后显示的就是这个rootEntity,Mymodel类的对象也是rootEntity的参数

    Qt3DRender::QCamera *cameraEntity = view->camera();
    //创建相机,必须要有相机才能看到3D对象
    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));
    //设置相机参数

    Qt3DInput::QInputAspect *input = new Qt3DInput::QInputAspect;
    view->registerAspect(input);
    //QInputAspect负责创建物理设备并处理相关的作业,处理前端和后端节点之间的映射,负责根据当前输入设置建立要在特定时间运行的作业的对象。

    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);
    //设置光源

    Qt3DExtras::QFirstPersonCameraController *camController = new Qt3DExtras::QFirstPersonCameraController(rootEntity);
    camController->setCamera(cameraEntity);
    //相机第一人称视角控制

    MyModel *mymodel = new MyModel(rootEntity);
    //创建3D对象
    view->setRootEntity(rootEntity);
    //将3D物体添加到画布上显示

    widget->show();
    widget->resize(1200, 800);
    return a.exec();
}
mymodel.cpp

#include "mymodel.h"


MyModel::MyModel(Qt3DCore::QEntity *rootEntity): m_rootEntity(rootEntity)
{
    m_torus = new Qt3DExtras::QTorusMesh();
    m_torus->setRadius(1.0f);
    m_torus->setMinorRadius(0.4f);
    m_torus->setRings(100);
    m_torus->setSlices(20);
    //设置物体的表面网格

    Qt3DCore::QTransform *torusTransform = new Qt3DCore::QTransform();
    torusTransform->setScale(2.0f);
    torusTransform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(0.0f, 1.0f, 0.0f), 25.0f));
    torusTransform->setTranslation(QVector3D(5.0f, 4.0f, 0.0f));
    //创建缩放,平移和旋转组件并将其添加到QTransform组件中

    Qt3DExtras::QPhongMaterial *torusMaterial = new Qt3DExtras::QPhongMaterial();
    torusMaterial->setDiffuse(QColor(QRgb(0xbeb32b)));
    //更改网格的漫反射颜色,我们创建一个QPhongMaterial并设置其漫反射颜色。

    m_torusEntity = new Qt3DCore::QEntity(m_rootEntity);
    m_torusEntity->addComponent(m_torus);
    m_torusEntity->addComponent(torusMaterial);
    m_torusEntity->addComponent(torusTransform);
    //将圆环添加到实体树中,然后通过QEntity使用父实体创建一个,然后添加先前创建的网格,材质并将组件转换到其中来完成。
}

MyModel::~MyModel()
{

}

void MyModel::enableTorus(bool enabled)
{
     m_torusEntity->setEnabled(enabled);
}

猜你喜欢

转载自www.cnblogs.com/leocc325/p/12983704.html