Qt 3D是一个用于构建交互式3D图形应用的库,它是Qt库的一
部分。Qt 3D提供了一组C++和QMLAPI,帮助开发者快速构
建3D应用程序。
一、核心模块
-
Qt3DCore
- 功能:提供3D场景中的基本概念,如实体(Entity)、组件(Component)、节点(Node)等。这些基本类构成了Qt 3D中的场景树(Scene Tree),用于描述3D世界中的对象及其属性。
- 关键类:QEntity(表示3D场景中的一个实体,可以包含多个组件)、QComponent(实体的组成部分,如变换、几何形状、材质等)、QNode(场景树中的基本元素,代表一个对象或属性)、QTransform(用于定义实体的位置、旋转和缩放)等。
-
Qt3DRender
- 功能:负责处理渲染管道、材质、光源等渲染相关的功能。
- 关键类:QCamera(定义观察3D场景的摄像机)、QMesh(表示3D模型,包含顶点、法线、纹理坐标等信息)、QMaterial(定义3D对象的材质属性,如颜色、纹理等)、QTechnique(定义渲染技术,如OpenGL版本、着色器等)、QRenderSettings(设置渲染参数,如渲染策略、帧率等)、QLight(表示光源,用于照亮场景中的物体,如点光源、平行光和聚光灯)、QRenderAspect(管理渲染过程,包括管线设置、资源加载和帧更新)、QFrameGraphNode(定义渲染过程中的各个阶段,构成渲染帧图)、QRenderPass(表示渲染过程中的一个阶段,如几何处理或光照计算)、QShaderProgram(管理顶点着色器、片段着色器和几何着色器等)、QShaderProgramBuilder(用于构建着色器程序)、QParameter(用于向着色器传递参数,如材质属性、光源信息和变换矩阵等)等。
-
Qt3DInput
- 功能:用于处理用户输入,如键盘、鼠标和触摸屏输入。
- 关键类:QInputAspect(管理输入事件的处理,如键盘、鼠标和触摸屏等)、QInputSettings(配置输入设备)、QMouseDevice(表示鼠标设备)、QKeyboardDevice(表示键盘设备)、QMouseHandler(处理鼠标事件)、QKeyboardHandler(处理键盘事件)等。
-
Qt3DAnimation
- 功能:提供关键帧、骨骼动画和变形动画等功能。
- 关键类:QAnimationAspect(负责管理和驱动场景中的动画效果)、QAbstractAnimationClip(表示一个动画片段,包含一组关键帧)、QAbstractClipAnimator(用于将动画片段应用到实体上)、QChannelMapper(将动画片段的通道映射到实体的属性上)等。
-
Qt3DLogic
- 功能:用于处理游戏逻辑和事件系统。
- 关键类:QLogicAspect(处理逻辑更新,如物理模拟、动画等)等。
-
Qt3DExtras
- 功能:提供了一些实用的预制组件和功能,如简单几何体、摄像机控制器等。
- 关键类:QConeMesh(创建圆锥几何形状)、QCylinderMesh(创建圆柱几何形状)、QSphereMesh(创建球体几何形状)、QPhongMaterial(使用Phong光照模型的材质,提供了漫反射、镜面反射和环境光效果)、QGoochMaterial(使用Gooch光照模型的材质,适用于非真实感渲染(NPR))、QNormalDiffuseMapMaterial(使用法线贴图和漫反射贴图的材质,可以实现更真实的表面细节效果)等。
二、相机的设置与控制
在Qt 3D中,相机的设置和控制是通过Qt3DRender::QCamera类实现的。QCamera类提供了多种属性和方法,可以方便地设置相机的视角、位置和朝向等参数。以下是一些常用的方法:
- setProjectionType():设置投影类型,如透视投影(PerspectiveProjection)和正交投影(OrthographicProjection)。
- setFieldOfView():设置视场角(仅对透视投影有效)。
- setAspectRatio():设置宽高比。
- setNearPlane()和setFarPlane():设置相机的近裁剪平面和远裁剪平面。
- setPosition()和setViewCenter():设置相机的位置和观察中心点。
- setUpVector():设置相机的上向量,用于确定相机的朝向。
三、构建基本的三维场景
以下是使用Qt 3D构建一个基本三维场景的步骤:
- 创建场景根节点:通常使用QEntity作为根节点,它将包含场景中的所有实体。
- 添加实体:为场景添加几何形状、光源、摄像机等实体。这些实体通常包含多个组件,如QMesh、QMaterial、QLight等。
- 设置变换:为实体添加QTransform组件,设置它们在场景中的位置、旋转和缩放等属性。
- 配置摄像机:设置摄像机的位置、朝向和投影矩阵,以控制渲染的视角和视野。
- 处理输入事件:使用Qt3DInput模块中的类来捕捉和处理用户输入,如键盘、鼠标和触摸屏等。
#include <QVBoxLayout>
#include <Qt3DExtras/Qt3DWindow>
#include <Qt3DRender/QCamera>
#include <Qt3DCore/QEntity>
#include <Qt3DRender/QMesh>
#include <Qt3DExtras/QPhongMaterial>
#include <Qt3DCore/QTransform>
#include <Qt3DInput/QInputAspect>
#include <QForwardRenderer>
#include <QScreen>
#include <Qt3DRender/QCameraLens>
#include <QOrbitCameraController>
#include <Qt3DAnimation>int main(int argc, char *argv[])
{QApplication a(argc, argv);QWidget *mainWindow = new QWidget;QVBoxLayout *layout = new QVBoxLayout(mainWindow);Qt3DExtras::Qt3DWindow *view = new Qt3DExtras::Qt3DWindow();view->defaultFrameGraph()->setClearColor(QColor(QRgb(0x4d4d4f)));QWidget *container = QWidget::createWindowContainer(view);QSize screenSize = view->screen()->size();container->setMinimumSize(QSize(708,574));container->setMaximumSize(screenSize);layout->addWidget(container);mainWindow->show();Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity;Qt3DRender::QCamera *camera = view->camera();camera->lens()->setPerspectiveProjection(40.0f, 708.0f / 574.0f, 0.1f, 1000.0f);camera->setPosition(QVector3D(0,13.5,16.65f));camera->setViewCenter(QVector3D(0,0, -3.35));camera->setUpVector(QVector3D(0.0, 1.0, 0.0));camera->setProjectionType(Qt3DRender::QCameraLens::PerspectiveProjection);Qt3DCore::QEntity *cubeEntity = new Qt3DCore::QEntity(rootEntity);Qt3DRender::QMesh *cubeMesh = new Qt3DRender::QMesh;cubeMesh->setSource(QUrl::fromLocalFile((":/res/zhiche.obj")));Qt3DExtras::QPhongMaterial *cubeMaterial = new Qt3DExtras::QPhongMaterial;cubeMaterial->setDiffuse(QColor(QRgb(0xffffff)));//0xbeb32bQt3DCore::QTransform *cubeTransform = new Qt3DCore::QTransform;cubeTransform->setScale(0.1f);//cubeTransform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(0,1,0), 45.0f));cubeTransform->setTranslation(QVector3D(0.0f, -80.0f, -100.0f));// 定时器每帧更新旋转QTimer *timer = new QTimer();QObject::connect(timer, &QTimer::timeout, [=]() {static float angle = 0.0f;angle += 1.0f; // 每次增加 1 度if (angle >= 360.0f) {angle = 0.0f; // 重置到 0}cubeTransform->setRotation(QQuaternion::fromEulerAngles(0, angle, 0)); // 绕 Y 轴旋转});timer->start(16); // 每 16ms 更新一次(约60fps)cubeEntity->addComponent(cubeMesh);cubeEntity->addComponent(cubeMaterial);cubeEntity->addComponent(cubeTransform);view->setRootEntity(rootEntity);// InputhandlingQt3DInput::QInputAspect *input = new Qt3DInput::QInputAspect;view->registerAspect(input);Qt3DExtras::QOrbitCameraController *cameraController = new Qt3DExtras::QOrbitCameraController(rootEntity);cameraController->setCamera(camera);cameraController->setLinearSpeed(50.0f);cameraController->setLookSpeed(180.0f);mainWindow->setLayout(layout);mainWindow->show();return a.exec();
}
DEMO下载:点击跳转
qq群交流:698593923
觉得有帮助的话,打赏一下呗。。