Qt文档阅读笔记-Qt 3D: Simple C++ Example解析

x33g5p2x  于2022-01-04 转载在 C/C++  
字(3.0k)|赞(0)|评价(0)|浏览(330)

本节官方Demo,使用Qt3D渲染场景

在main.cpp文件中,设置scene。

为了能使用相关的类和函数,需要include、Qt3DCore、Qt3D、Qt3DExtras模块。

#include <Qt3DCore/QEntity>
 #include <Qt3DRender/QCamera>
 #include <Qt3DRender/QCameraLens>
 #include <Qt3DCore/QTransform>
 #include <Qt3DCore/QAspectEngine>

 #include <Qt3DInput/QInputAspect>

 #include <Qt3DRender/QRenderAspect>
 #include <Qt3DExtras/QForwardRenderer>
 #include <Qt3DExtras/QPhongMaterial>
 #include <Qt3DExtras/QCylinderMesh>
 #include <Qt3DExtras/QSphereMesh>
 #include <Qt3DExtras/QTorusMesh>

首先需要设置场景,和指定的root实体

Qt3DCore::QEntity *createScene()
 {
     Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity;

再使用PhongRendering为root实体指定material

Qt3DRender::QMaterial *material = new Qt3DExtras::QPhongMaterial(rootEntity);

在root实体上创建圆环实体,旋转、以及material组建等:

Qt3DCore::QEntity *torusEntity = new Qt3DCore::QEntity(rootEntity);
     Qt3DExtras::QTorusMesh *torusMesh = new Qt3DExtras::QTorusMesh;
     torusMesh->setRadius(5);
     torusMesh->setMinorRadius(1);
     torusMesh->setRings(100);
     torusMesh->setSlices(20);

     Qt3DCore::QTransform *torusTransform = new Qt3DCore::QTransform;
     torusTransform->setScale3D(QVector3D(1.5, 1, 0.5));
     torusTransform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(1, 0, 0), 45.0f));

     torusEntity->addComponent(torusMesh);
     torusEntity->addComponent(torusTransform);
     torusEntity->addComponent(material);

指定各个sphere的实体及他们的部件:

Qt3DCore::QEntity *sphereEntity = new Qt3DCore::QEntity(rootEntity);
     Qt3DExtras::QSphereMesh *sphereMesh = new Qt3DExtras::QSphereMesh;
     sphereMesh->setRadius(3);

     Qt3DCore::QTransform *sphereTransform = new Qt3DCore::QTransform;
     OrbitTransformController *controller = new OrbitTransformController(sphereTransform);
     controller->setTarget(sphereTransform);
     controller->setRadius(20.0f);

     QPropertyAnimation *sphereRotateTransformAnimation = new QPropertyAnimation(sphereTransform);
     sphereRotateTransformAnimation->setTargetObject(controller);
     sphereRotateTransformAnimation->setPropertyName("angle");
     sphereRotateTransformAnimation->setStartValue(QVariant::fromValue(0));
     sphereRotateTransformAnimation->setEndValue(QVariant::fromValue(360));
     sphereRotateTransformAnimation->setDuration(10000);
     sphereRotateTransformAnimation->setLoopCount(-1);
     sphereRotateTransformAnimation->start();

     sphereEntity->addComponent(sphereMesh);
     sphereEntity->addComponent(sphereTransform);
     sphereEntity->addComponent(material);

使用了一个属性来实现动画的效果。

最后,创建Qt3D窗口:

int main(int argc, char* argv[])
 {
     QGuiApplication app(argc, argv);
     Qt3DExtras::Qt3DWindow view;

     Qt3DCore::QEntity *scene = createScene();

     // Camera
     Qt3DRender::QCamera *camera = view.camera();
     camera->lens()->setPerspectiveProjection(45.0f, 16.0f/9.0f, 0.1f, 1000.0f);
     camera->setPosition(QVector3D(0, 0, 40.0f));
     camera->setViewCenter(QVector3D(0, 0, 0));

     // For camera controls
     Qt3DExtras::QOrbitCameraController *camController = new Qt3DExtras::QOrbitCameraController(scene);
     camController->setLinearSpeed( 50.0f );
     camController->setLookSpeed( 180.0f );
     camController->setCamera(camera);

     view.setRootEntity(scene);
     view.show();

     return app.exec();
 }

相关文章

微信公众号

最新文章

更多