Qt 例子学习笔记Examples/Qt-6.2.0/qt3d/3d-text

2024-04-13 14:48

本文主要是介绍Qt 例子学习笔记Examples/Qt-6.2.0/qt3d/3d-text,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


#include <QGuiApplication> //QGuiApplication 类管理 GUI 应用程序的控制流和主要设置。
#include <QFontDatabase> //QFontDatabase 类提供有关底层窗口系统中可用字体的信息。
#include <Qt3DCore/Qt3DCore>  //包含作为 Qt 3D 模拟框架基础的类,以及提供使用 Qt 3D 框架进行渲染的能力的类
#include <Qt3DRender/QGeometryRenderer> //封装几何渲染
#include <Qt3DExtras/Qt3DExtras>  //包含来自 Qt3DExtras 模块的类
#include <Qt3DExtras/QExtrudedTextMesh> //3D 挤压文本网格int main(int argc,char *argv[])
{QGuiApplication a(argc,argv);//首先创建一个场景,用于显示你要绘制或者导入模型,关键语句Qt3DExtras::Qt3DWindow *view = new Qt3DExtras::Qt3DWindow();//设置窗口标题view->setTitle(QStringLiteral("3D Text CPP"));//设置场景背景颜色view->defaultFrameGraph()->setClearColor(QColor(210, 210, 220));//构造一个新的 Qt3DCore::QEntity 实例//Qt3DCore::QEntity 对象的行为由它引用的 Qt3DCore::QComponent 对象定义。//每个 Qt3D 后端方面都能够通过识别实体由哪些组件组成来解释和处理实体。auto *root = new Qt3DCore::QEntity();{//planeauto *plane = new Qt3DCore::QEntity(root);auto *planeMesh = new Qt3DExtras::QPlaneMesh(); //方形平面网格auto *planeTransform = new Qt3DCore::QTransform();//QTransform 组件不能在多个 QEntity 之间共享。//变换被保存为 QVector3D 缩放、QQuaternion 旋转和 QVector3D 平移组件。//变换按该顺序应用于网格。当设置 QTransform::matrix 属性时,它被分解为这些变换分量并发出相应的信号。//提供了几个帮助函数来设置 QTransform; fromAxisAndAngle 和 //fromAxesAndAngles 可用于设置围绕特定轴的旋转,fromEulerAngles //可用于设置基于欧拉角的旋转,而rotateAround //可用于相对于本地原点围绕特定点旋转对象。auto *planeMaterial = new Qt3DExtras::QPhongMaterial(root);//QPhongMaterial 类提供 phong 照明效果的默认实现。//这个类已被弃用; 改用 QDiffuseSpecularMaterial。//phong 照明效果基于 3 个照明组件环境、漫反射和镜面反射的组合。 这些组件的相对强度通过它们的反射系数来控制,这些系数被建模为 RGB 三元组://环境光是物体在没有任何其他光源的情况下发出的颜色。//漫反射是为粗糙表面反射而发射的颜色。//镜面反射是光亮表面反射所发出的颜色。//表面的光泽度由浮动属性控制。//此材质使用具有单一渲染通道方法的效果并执行每个片段照明。 为 OpenGL 2、OpenGL 3 或更高版本以及 OpenGL ES 2 提供了技术。planeMesh->setWidth(10);planeMesh->setHeight(10);planeTransform->setTranslation(QVector3D(0,0,0)); // 设置的平移向量planeMaterial->setDiffuse(QColor(150, 150, 150)); //设置漫反射颜色。//添加对组件//注意:如果 Qt3DCore::QComponent 没有父级,则 Qt3DCore::QEntity 将自己设置为其父级,从而获得组件的所有权。plane->addComponent(planeMaterial);plane->addComponent(planeMesh);plane->addComponent(planeTransform);//Qt3DCore::QComponent 提供了一个垂直的行为切片,可以分配给 Qt3DCore::QEntity 实例,有时也可以在它们之间共享。//Qt3DCore::QComponent 子类通常聚合成组,将有用的行为传递给聚合实体。 例如,要拥有一个由 Qt3D 渲染器方面绘制的实体,一个实体很可能会聚合 Qt3DCore::QTransform、Qt3DRender::QMesh 和 Qt3DRender::QMaterial 组件。}auto *textMaterial = new Qt3DExtras::QPhongMaterial(root);{//textint i = 0;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)const QStringList fonts = QFontDatabase::families(); //返回支持writingSystem 的可用字体系列的排序列表。
#elseconst QStringList fonts = QFontDatabase().families();
#endiffor(const QString& family : fonts){auto *text = new Qt3DCore::QEntity(root);auto *textMesh = new Qt3DExtras::QExtrudedTextMesh();//一个 3D Extruded文本//网格的原点是文本基线的左后端。auto *textTransform = new Qt3DCore::QTransform();QFont font(family,32,-1,false);//保存文本的字体。//网格几何体由字体的 pointSize 标准化,因此较大的 pointSize //将导致更平滑的文本,而不是更大的文本。 不应使用像素大小。textTransform->setTranslation(QVector3D(-2.45f, i * .5f, 0));textTransform->setScale(.2f);textMesh->setDepth(.45f); //保存文本的拉伸深度。textMesh->setFont(font);//保存文本的字体。textMesh->setText(family);//保存用于网格的文本。textMaterial->setDiffuse(QColor(111, 150, 255));//设置漫反射颜色。text->addComponent(textMaterial);text->addComponent(textMesh);text->addComponent(textTransform);i++;}}{//Camerafloat aspect = static_cast<float>(view->screen()->size().width()) / view->screen()->size().height();//QCamera 类定义了一个视点,通过该视点渲染场景Qt3DRender::QCamera *camera = view->camera();//返回当前镜头//定义基于 fieldOfView、aspectRatio、nearPlane、farPlane 的透视投影。camera->lens()->setPerspectiveProjection(65.f, aspect, 0.1f, 100.f);//将相机在 3D 空间中的位置设置为 QVector3D(0, 5, 3)camera->setPosition(QVector3D(0, 5, 3));//将相机的视图中心设置为 QVector3D(0, 5, 0)camera->setViewCenter(QVector3D(0, 5, 0));//QOrbitCameraController 类允许沿轨道路径控制场景相机auto *cameraController = new Qt3DExtras::QOrbitCameraController(root);cameraController->setCamera(camera);}view->setRootEntity(root);view->show();return a.exec();
}

控件是:
鼠标左键 当按下鼠标左键时,鼠标沿 x 轴移动会左右移动相机,沿 y 轴移动会上下移动。
鼠标右键 当按下鼠标右键时,鼠标沿 x 轴移动会围绕摄像机视图中心平移摄像机,而沿 y 轴移动会使其围绕摄像机视图中心倾斜。
鼠标左键和右键 当同时按下鼠标左键和右键时,鼠标沿 y 轴移动会放大和缩小相机而不改变视图中心。
鼠标滚轮 在不改变视图中心的情况下放大和缩小相机。
方向键 相对于相机视口垂直和水平移动相机。
向上翻页和向下翻页键 前后移动相机。
Shift 键 更改向上和向下箭头键的行为以在不更改视图中心的情况下放大和缩小相机。 其他移动键被禁用。
ALT键 更改箭头键的行为以围绕视图中心平移和倾斜相机。 禁用向上翻页和向下翻页键。
Escape 移动摄影机,使整个场景在摄影机视口中可见

CMake

cmake_minimum_required(VERSION 3.16.0 FATAL_ERROR)
project(3d-text VERSION 0.1.0 LANGUAGES CXX C)set(CMAKE_INCLUDE_CURRENT_DIR ON)set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)find_package(Qt6 COMPONENTS Core)
find_package(Qt6 COMPONENTS Gui)
find_package(Qt6 COMPONENTS 3DCore)
find_package(Qt6 COMPONENTS 3DRender)
find_package(Qt6 COMPONENTS 3DInput)
find_package(Qt6 COMPONENTS 3DExtras)qt_add_executable(3d-textmain.cpp)set_target_properties(3d-textPROPERTIESWIN32_EXECUTABLE TRUEMACOSX_BUNDLE TRUE
)target_link_libraries(3d-textPUBLICQt::3DCoreQt::3DExtrasQt::3DInputQt::3DRenderQt::CoreQt::Gui
)

在这里插入图片描述

这篇关于Qt 例子学习笔记Examples/Qt-6.2.0/qt3d/3d-text的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/900432

相关文章

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

python与QT联合的详细步骤记录

《python与QT联合的详细步骤记录》:本文主要介绍python与QT联合的详细步骤,文章还展示了如何在Python中调用QT的.ui文件来实现GUI界面,并介绍了多窗口的应用,文中通过代码介绍... 目录一、文章简介二、安装pyqt5三、GUI页面设计四、python的使用python文件创建pytho

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

基于Qt实现系统主题感知功能

《基于Qt实现系统主题感知功能》在现代桌面应用程序开发中,系统主题感知是一项重要的功能,它使得应用程序能够根据用户的系统主题设置(如深色模式或浅色模式)自动调整其外观,Qt作为一个跨平台的C++图形用... 目录【正文开始】一、使用效果二、系统主题感知助手类(SystemThemeHelper)三、实现细节

Qt实现文件的压缩和解压缩操作

《Qt实现文件的压缩和解压缩操作》这篇文章主要为大家详细介绍了如何使用Qt库中的QZipReader和QZipWriter实现文件的压缩和解压缩功能,文中的示例代码简洁易懂,需要的可以参考一下... 目录一、实现方式二、具体步骤1、在.pro文件中添加模块gui-private2、通过QObject方式创建

Qt QWidget实现图片旋转动画

《QtQWidget实现图片旋转动画》这篇文章主要为大家详细介绍了如何使用了Qt和QWidget实现图片旋转动画效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、效果展示二、源码分享本例程通过QGraphicsView实现svg格式图片旋转。.hpjavascript

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06