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

71 篇文章 4 订阅

#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();

	{
		//plane
		auto *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);
	{//text
		int i = 0;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
		const QStringList fonts = QFontDatabase::families(); 
		//返回支持writingSystem 的可用字体系列的排序列表。
#else
        const QStringList fonts = QFontDatabase().families();
#endif
        for(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++;
        }
	}

	{
		//Camera
		float 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-text
	main.cpp)

set_target_properties(3d-text
	PROPERTIES
    WIN32_EXECUTABLE TRUE
    MACOSX_BUNDLE TRUE
)

target_link_libraries(3d-text
	PUBLIC
    Qt::3DCore
    Qt::3DExtras
    Qt::3DInput
    Qt::3DRender
    Qt::Core
    Qt::Gui
)

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值