经常有淘宝客户咨询 Qt 3d 相关的问题
但其实,不同行业咨询的 Qt 3d 问题是大相径庭的
今天想专门谈一下这类问题
演示:


代码说明:
这是 Qt 官方 demo RobotArm,演示了 QtQuick3D 的能力
典型需求:
客户发来一个 .fbx 或 .gltf 格式的模型(比如机械臂、AGV小车、或者一套流水线设备)。
需求通常是:
加载模型并显示。
鼠标控制旋转、平移、缩放。
核心交互:能够控制模型中的某个“子部件”(如机械臂的关节)进行旋转或平移。
需要绚丽的材质和灯光效果。
误区:
很多开发者第一反应是去啃 Qt3D (C++ 模块) 或者直接撸原生 OpenGL。前者文档晦涩学习曲线极陡,后者开发效率太低。
最佳实践:Qt Quick 3D + QWidget 嵌入
对于偏重“展示”和“动画”的场景,Qt Quick 3D 是目前的版本之子。它拥有基于物理的渲染(PBR),且处理层级结构(Node hierarchy)非常容易。
技术核心:利用 Qt Quick 3D 的场景图(Scene Graph)自动处理子节点的变换矩阵。你不需要自己算矩阵乘法,只需要修改 Node.eulerRotation.x 即可。
工程架构:
由于大部分工业软件还是基于 QWidget 的框架,我们可以通过 QQuickWidget 将 Qt Quick 3D 的界面无缝嵌入到传统的 C++ 工程中。
x// 伪代码示例:在 QWidget 中嵌入 3D 场景QQuickWidget *view = new QQuickWidget;view->setSource(QUrl("qrc:/main.qml")); // 加载包含 View3D 的 QMLview->setResizeMode(QQuickWidget::SizeRootObjectToView);// C++ 与 QML 交互// 通过 QQuickItem 获取 3D 模型节点,直接控制其属性QQuickItem *robotArm = view->rootObject()->findChild<QQuickItem*>("robotArmNode");robotArm->setProperty("eulerRotation", QVector3D(0, 45, 0));
演示1:

代码下载:
https://thinkinginqt.com/20251125_thinkinginqt/testVTK1.zip
代码说明:
用的是 VTK9.0、Qt5 和 VisualStudio,只提供了 release 版本
没有用 CMake,用的是老的 .pro 工程,因为是 2020 年的工程
在 QtCreator 编译时记得把 shadow build 的 √ 取消掉
演示2:

代码下载:
https://thinkinginqt.com/20251125_thinkinginqt/testVTK2.zip
代码说明:
用的是 VTK8.2、Qt5 和 VisualStudio,只提供了 release 版本
是 2022 年的时候淘宝客户提供的代码,主要功能就是加载 STL 文件
主要亮点就是制作了 vtk.pri,让 *.pro 文件变得更干净
在 QtCreator 编译时记得把 shadow build 的 √ 取消掉
典型需求:
客户是做激光雷达(LiDAR)、毫米波雷达或者深度相机的。
需求通常是:
实时接收传感器数据。
渲染百万级甚至千万级的点云(Point Cloud)。
对点云进行着色(根据高度或强度)。
三维重建(如人脸识别、SLAM 室内建模)。
误区:
Qt Quick 3D 或原生的 QScatterSeries 在处理海量点时性能会迅速崩溃。这些引擎是为少量的 Mesh(网格)设计的,而不是为海量的 Points(离散点)设计的。
最佳实践:VTK (Visualization Toolkit) + QWidget
VTK 是科学可视化领域的霸主。在处理科学数据、标量场、矢量场以及点云数据上,它是标准答案。
技术核心:使用 VTK 强大的 Pipeline 机制(Source -> Filter -> Mapper -> Actor)。VTK 对海量点云的渲染做了极深的优化(如 LOD 技术),且自带大量算法(如 Delaunay 三角剖分、Marching Cubes 等面绘制算法)。
工程架构:
使用 QVTKOpenGLNativeWidget。这是 VTK 专门为 Qt 提供的桥接控件,它继承自 QOpenGLWidget,可以直接在 Qt Designer 中提升(Promote)使用,非常稳定。
xxxxxxxxxx// 伪代码思路:VTK PipelinevtkNew<vtkPoints> points;// ... 填充百万个点 ...vtkNew<vtkPolyData> polyData;polyData->SetPoints(points);vtkNew<vtkPolyDataMapper> mapper;mapper->SetInputData(polyData);vtkNew<vtkActor> actor;actor->SetMapper(mapper);// 嵌入 Qt 界面ui->qvtkWidget->renderWindow()->AddRenderer(renderer);
演示:
代码下载:
https://thinkinginqt.com/20251125_thinkinginqt/testOCC.zip
代码说明:
D:/vcpkg 通过 .\vcpkg.exe install opencascade[vtk]
项目来源 https://github.com/Open-Cascade-SAS/OCCT/tree/master/samples/qt/Tutorial
github 里的代码是 Qt5 的,我把它升级优化到 Qt6.9 了
典型需求:
这是最硬核的领域。客户做船舶设计、有限元分析(FEA)、或者数控加工路径生成。
需求通常是:
加载 STEP/IGES 等工业标准 CAD 格式。
模型不仅仅是“看”的,更是“算”的(需要精确的布尔运算、剖切、倒角)。
网格剖分(Meshing):将几何体切割成四面体或六面体网格用于仿真计算。
交互式选点、选边、选面。
误区:
前两种方案在这里完全失效。因为它们只有“皮囊”(显示网格),没有“灵魂”(拓扑结构和几何参数)。你无法在 Qt Quick 3D 里对一个圆柱体进行精确的“打孔”运算。
最佳实践:OpenCascade (OCC) + QWidget
OpenCascade 是开源界唯一的工业级 CAD 内核。它负责“几何”与“拓扑”。
技术核心:
OCC (内核):负责读取 STP 文件,进行布尔运算(交并差),计算表面积、体积,以及生成有限元网格。
VTK (渲染):虽然 OCC 自带渲染引擎(AIS Context),但很多现代软件倾向于“OCC 算,VTK 画”。将 OCC 的几何数据(TopoDS_Shape)离散化后喂给 VTK 进行渲染,因为 VTK 的显示效果和交互更加现代化。
工程架构:
通常需要编写一个转换器,将 OCC 的 TopoDS_Shape 转换为 VTK 的 vtkPolyData。这种组合既拥有了 CAD 的精度,又拥有了科学可视化的渲染能力。
| 维度 | 方案一:Qt Quick 3D | 方案二:VTK | 方案三:OCC |
|---|---|---|---|
| 核心关键词 | 展示、动画、UI | 数据、点云、重建 | 几何、仿真、结构 |
| 典型行业 | 智能家居、机械控制面板、大屏展示 | 自动驾驶、医疗影像、地理测绘 | 船舶设计、建筑结构、有限元分析 |
| 数据来源 | 设计师给的 FBX/GLTF | 传感器给的 raw data (xyz) | 工程师给的 STP/IGES |
| 几何能力 | 弱(只有网格,无几何参数) | 中(主要处理离散数据) | 强(包含精确拓扑和参数) |
| 开发难度 | ⭐⭐ (QML 很容易上手) | ⭐⭐⭐⭐ (Pipeline 机制复杂) | ⭐⭐⭐⭐⭐ (数学要求极高) |