(注意,开源版的 Qt Quick 3D 是狗都不用的 GPL 协议)
Qt Quick 3D 模块提供了 Model 类型用于 3D 模型加载,通过设置 source 的资源路径来加载对应的 3D 模型:
Model {
//Qt内置的几种几何模型
//"#Rectangle" 矩形
//"#Sphere" 球体
//"#Cube" 立方体
//"#Cone" 锥体
//"#Cylinder" 圆柱体
source: "#Sphere"
//加载mesh 3D模型资源文件
//source: "qrc:/model/teapot.mesh"
//或者这样写
//source: "teapot.mesh"
//材质设置
materials: [ DefaultMaterial {
diffuseColor: "blue"
}
]
}
除了设置 source 指定模型,还可以设置 geometry 自定义图形。
Qt Quick 3D Model 加载的模型类型和 Qt 3D 不一样,不是直接加载 obj、fbx 等格式的文件,而是先转换成 mesh 格式。文档如是说,直接在应用中引用这些交换格式没有意义,因为需要大量资源来解析和调整资源内容,然后才能用于实时渲染,所以采用先转换为有效的运行时格式的方式。
Qt 提供了一个名叫 balsam 的可以执行程序将 obj 等 3D 模型文件转换为 mesh 文件,该工具位于 Qt 安装目录下:
可以通过命令行调用(指定模型路径和导出目录):
E:\Qt\QtOnline\5.15.2\msvc2019_64\bin>balsam.exe "E:\Qt\QtOnline\Examples\Qt-5.15.2\qt3d\exampleresources\assets\obj\trefoil.obj" -o "E:\Qt\QtOnline\Examples\Qt-5.15.2\qt3d\exampleresources\assets\obj"
generated file: "E:/Qt/QtOnline/Examples/Qt-5.15.2/qt3d/exampleresources/assets/obj\\Trefoil.qml"
也可以直接将 obj 文件拖到 balsam.exe 上,就会自动在 obj 所在目录生成一个包含 mesh 文件的 meshs 文件夹(一个 obj 可能会产生多个 mesh 文件),和一个 obj 同名的 qml 文件(把这些 mesh 文件的调用封装为了一个组件,我们可以直接使用这个 qml 文件,也可以只是参考里面的代码) 。
对 Qt 示例的 trefoil.obj 进行转换得到:
其中 qml 文件里就是对 mesh 的引用:
import QtQuick 2.15
import QtQuick3D 1.15
Node {
id: trefoil_obj
Model {
id: torus_Knot
source: "meshes/torus_Knot.mesh"
DefaultMaterial {
id: none_material
diffuseColor: "#ff999999"
}
materials: [
none_material
]
}
}
现在,将 mesh 引入到我们的工程中,就能用 Model 加载这个模型了。有的 Qt Creator 版本可以通过设计中的 3D Editor 预览 3D 模型(有的版本有 BUG),Qt Design Studio 设计工具也有对应支持。Qt Creator 的 QML 设计器在我使用的 7.0 版本需要在插件设置里打开:
下面是简单的效果演示和代码:
import QtQuick 2.15
import QtQuick3D 1.15
View3D {
id: control
//背景
environment: SceneEnvironment {
clearColor: "green"
backgroundMode: SceneEnvironment.Color
}
//观察相机
PerspectiveCamera {
z: 100
}
//光照
DirectionalLight {
eulerRotation.y: 45
}
//模型加载
Model {
position: Qt.vector3d(0, 0, 0)
source: "qrc:/model/trefoil.mesh"
scale: Qt.vector3d(10, 10, 10)
materials: [
DefaultMaterial {
diffuseColor: "red"
}
]
}
}
本文参考
Qt文档:https://doc.qt.io/qt-5/qml-qtquick3d-model.html
Qt文档:https://doc.qt.io/qt-5/qtquick3d-tool-balsam.html