Qt3D 模块的使用
在Qt中显示一个简易的立方体,效果如下
实现原理
1.根据Qt3D的框架,在Qt3D中 所有的类都是以QNode节点作为基础节点;Qt3D框架中,提供了实体(QEntity)和
组件(QComponent )的概念,3D场景中实体有个根实体,在初始化view时,需要给view
(Qt3DExtras::Qt3DWindow)对象设置根实体;后续加载到场景中的实体(QEntity)为根实体的子节点,从而构
成一棵实体树。
2.实体和组件:一个实体又多个组件构成,比如我们立方体实体是由立方体网格(mesh),立方体材质(Material)
以及立方体的位置 三个组件构成了立方体实体。
实现代码
1.Qt官方提供的Qt3d 的实例较少,QWidget的实例更少,通过以下两个函数就能加载一个3D场景到一个QWidget的布局器中
2.初始化3D的场景,一般为固定代码文章来源:https://www.toymoban.com/news/detail-511761.html
void Qt3DCubePane::init3D()
{
//step1 创建一个3d 得view
Qt3DExtras::Qt3DWindow* view = new Qt3DExtras::Qt3DWindow();
//此颜色设置view的背景色,内部即glClearColor()的颜色
view->defaultFrameGraph()->setClearColor(QColor(QRgb(0x4d4d4f)));
//如果要将 3DWidnow 嵌入到widget中,需要一个widget来装它
QWidget* container = QWidget::createWindowContainer(view);
QSize screenSize = view->screen()->size();
container->setMinimumSize(QSize(200, 100));
container->setMaximumSize(screenSize);
ui->horizontalLayout_2->addWidget(container);
//创建一个跟实体
dPtr->mRootEntity = new Qt3DCore::QEntity;
//相机相关的属性控制
Qt3DRender::QCamera* camEntity = view->camera();
camEntity->lens()->setPerspectiveProjection(45.0f, 16.0f / 9.0f, 0.1f, 1000.0f);
camEntity->setPosition(QVector3D(0, 0, 10.0f));
camEntity->setUpVector(QVector3D(0, 1, 0));
camEntity->setViewCenter(QVector3D(0, 0, 0));
//加一个Camera的 轨道控制器
Qt3DExtras::QOrbitCameraController *camController = new Qt3DExtras::QOrbitCameraController(dPtr->mRootEntity);
camController->setCamera(camEntity);
//创建一个点光源
Qt3DCore::QEntity *lightEntity = new Qt3DCore::QEntity(dPtr->mRootEntity);
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(camEntity->position());
lightEntity->addComponent(lightTransform);
view->setRootEntity(dPtr->mRootEntity);
}
3.构造立方体实体代码文章来源地址https://www.toymoban.com/news/detail-511761.html
void Qt3DCubePane::addTestGeoMesh()
{
//添加一个TestMesh; Mesh 中有两个立方体,
QEntity* ent1 = new QEntity(dPtr->mRootEntity);
QEntity* ent2 = new QEntity(ent1);
Qt3DExtras::QCuboidMesh* mesh1 = new Qt3DExtras::QCuboidMesh(ent1);
Qt3DExtras::QPhongMaterial *material1 = new Qt3DExtras::QPhongMaterial();
material1->setDiffuse(QColor("#FFFF00")); //漫反射颜色
material1->setShininess(0.0f);
Qt3DCore::QTransform *objTransformMesh1 = new Qt3DCore::QTransform();
objTransformMesh1->setTranslation(QVector3D(-4.0f, 0.0f, 0.0f));
//objTransformMesh1->setRotationX(45.0f);
ent1->addComponent(mesh1);
ent1->addComponent(material1);
ent1->addComponent(objTransformMesh1);
Qt3DExtras::QPhongMaterial *material2 = new Qt3DExtras::QPhongMaterial();
material2->setShininess(0.0f);
material2->setDiffuse(QColor("#FF0000")); //漫反射颜色
Qt3DExtras::QCuboidMesh* mesh2 = new Qt3DExtras::QCuboidMesh();
Qt3DCore::QTransform *objTransformMesh = new Qt3DCore::QTransform();
objTransformMesh->setTranslation(QVector3D(4.0f, 0.0f, 0.0f));
//objTransformMesh->setRotationX(45.0f);
ent2->addComponent(mesh2);
ent2->addComponent(objTransformMesh);
ent2->addComponent(material2);
}
到了这里,关于Qt3D模块使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!