qt 3D编程

Qt 3D是一个用于构建交互式3D图形应用的库,它是Qt库的一
部分。Qt 3D提供了一组C++和QMLAPI,帮助开发者快速构
建3D应用程序。

一、核心模块

  1. Qt3DCore

    • 功能:提供3D场景中的基本概念,如实体(Entity)、组件(Component)、节点(Node)等。这些基本类构成了Qt 3D中的场景树(Scene Tree),用于描述3D世界中的对象及其属性。
    • 关键类:QEntity(表示3D场景中的一个实体,可以包含多个组件)、QComponent(实体的组成部分,如变换、几何形状、材质等)、QNode(场景树中的基本元素,代表一个对象或属性)、QTransform(用于定义实体的位置、旋转和缩放)等。
  2. Qt3DRender

    • 功能:负责处理渲染管道、材质、光源等渲染相关的功能。
    • 关键类:QCamera(定义观察3D场景的摄像机)、QMesh(表示3D模型,包含顶点、法线、纹理坐标等信息)、QMaterial(定义3D对象的材质属性,如颜色、纹理等)、QTechnique(定义渲染技术,如OpenGL版本、着色器等)、QRenderSettings(设置渲染参数,如渲染策略、帧率等)、QLight(表示光源,用于照亮场景中的物体,如点光源、平行光和聚光灯)、QRenderAspect(管理渲染过程,包括管线设置、资源加载和帧更新)、QFrameGraphNode(定义渲染过程中的各个阶段,构成渲染帧图)、QRenderPass(表示渲染过程中的一个阶段,如几何处理或光照计算)、QShaderProgram(管理顶点着色器、片段着色器和几何着色器等)、QShaderProgramBuilder(用于构建着色器程序)、QParameter(用于向着色器传递参数,如材质属性、光源信息和变换矩阵等)等。
  3. Qt3DInput

    • 功能:用于处理用户输入,如键盘、鼠标和触摸屏输入。
    • 关键类:QInputAspect(管理输入事件的处理,如键盘、鼠标和触摸屏等)、QInputSettings(配置输入设备)、QMouseDevice(表示鼠标设备)、QKeyboardDevice(表示键盘设备)、QMouseHandler(处理鼠标事件)、QKeyboardHandler(处理键盘事件)等。
  4. Qt3DAnimation

    • 功能:提供关键帧、骨骼动画和变形动画等功能。
    • 关键类:QAnimationAspect(负责管理和驱动场景中的动画效果)、QAbstractAnimationClip(表示一个动画片段,包含一组关键帧)、QAbstractClipAnimator(用于将动画片段应用到实体上)、QChannelMapper(将动画片段的通道映射到实体的属性上)等。
  5. Qt3DLogic

    • 功能:用于处理游戏逻辑和事件系统。
    • 关键类:QLogicAspect(处理逻辑更新,如物理模拟、动画等)等。
  6. Qt3DExtras

    • 功能:提供了一些实用的预制组件和功能,如简单几何体、摄像机控制器等。
    • 关键类:QConeMesh(创建圆锥几何形状)、QCylinderMesh(创建圆柱几何形状)、QSphereMesh(创建球体几何形状)、QPhongMaterial(使用Phong光照模型的材质,提供了漫反射、镜面反射和环境光效果)、QGoochMaterial(使用Gooch光照模型的材质,适用于非真实感渲染(NPR))、QNormalDiffuseMapMaterial(使用法线贴图和漫反射贴图的材质,可以实现更真实的表面细节效果)等。

二、相机的设置与控制

在Qt 3D中,相机的设置和控制是通过Qt3DRender::QCamera类实现的。QCamera类提供了多种属性和方法,可以方便地设置相机的视角、位置和朝向等参数。以下是一些常用的方法:

  1. setProjectionType():设置投影类型,如透视投影(PerspectiveProjection)和正交投影(OrthographicProjection)。
  2. setFieldOfView():设置视场角(仅对透视投影有效)。
  3. setAspectRatio():设置宽高比。
  4. setNearPlane()和setFarPlane():设置相机的近裁剪平面和远裁剪平面。
  5. setPosition()和setViewCenter():设置相机的位置和观察中心点。
  6. setUpVector():设置相机的上向量,用于确定相机的朝向。

三、构建基本的三维场景

以下是使用Qt 3D构建一个基本三维场景的步骤:

  1. 创建场景根节点:通常使用QEntity作为根节点,它将包含场景中的所有实体。
  2. 添加实体:为场景添加几何形状、光源、摄像机等实体。这些实体通常包含多个组件,如QMesh、QMaterial、QLight等。
  3. 设置变换:为实体添加QTransform组件,设置它们在场景中的位置、旋转和缩放等属性。
  4. 配置摄像机:设置摄像机的位置、朝向和投影矩阵,以控制渲染的视角和视野。
  5. 处理输入事件:使用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)));//0xbeb32b
    Qt3DCore::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);
    // Inputhandling
    Qt3DInput::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

觉得有帮助的话,打赏一下呗。。

           

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值