Qt3D模块使用

Qt3D 模块的使用

在Qt中显示一个简易的立方体,效果如下
Qt3D模块使用_第1张图片

实现原理

1.根据Qt3D的框架,在Qt3D中 所有的类都是以QNode节点作为基础节点;Qt3D框架中,提供了实体(QEntity)和
组件(QComponent )的概念,3D场景中实体有个根实体,在初始化view时,需要给view
(Qt3DExtras::Qt3DWindow)对象设置根实体;后续加载到场景中的实体(QEntity)为根实体的子节点,从而构
成一棵实体树。
2.实体和组件:一个实体又多个组件构成,比如我们立方体实体是由立方体网格(mesh),立方体材质(Material)
以及立方体的位置 三个组件构成了立方体实体。

实现代码

1.Qt官方提供的Qt3d 的实例较少,QWidget的实例更少,通过以下两个函数就能加载一个3D场景到一个QWidget的布局器中
2.初始化3D的场景,一般为固定代码

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.构造立方体实体代码

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);
}

你可能感兴趣的:(Qt,qt,3d,ui)