您当前的位置: 首页 >  ui

龚建波

暂无认证

  • 5浏览

    0关注

    312博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Qt Quick 3D学习:模型加载

龚建波 发布时间:2022-06-04 18:14:02 ,浏览量:5

(注意,开源版的 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

关注
打赏
1655829268
查看更多评论
立即登录/注册

微信扫码登录

0.7438s