QML 3D 基本示例

Posted

技术标签:

【中文标题】QML 3D 基本示例【英文标题】:QML 3D basic example 【发布时间】:2019-03-05 06:50:07 【问题描述】:

我正在尝试创建一个基本的 QML 应用程序,该应用程序将从 .obj 文件加载 3D 模型并将其显示在屏幕上,并能够在运行时沿其轴旋转它。我浏览了一些 Qt 示例并提出了以下代码——其中大部分是从工作示例中借来的。但是当我运行它时,模型没有正确渲染。

实际模型如下:

目前我的应用显示为

.

这是 QML 代码 -

import Qt3D.Core 2.12
import Qt3D.Render 2.12
import Qt3D.Extras 2.12

Entity 
    id: sceneRoot

    Camera 
        id: camera
        projectionType: CameraLens.PerspectiveProjection
        fieldOfView: 45
        aspectRatio: 1820 / 1080
        nearPlane: 0.1
        farPlane: 1000.0
        position: Qt.vector3d(0.014, 0.956, 2.178)
        upVector: Qt.vector3d(0.0, 1.0, 0.0)
        viewCenter: Qt.vector3d(0.0, 0.7, 0.0)
    

    Entity 
        components: [
            DirectionalLight 
                intensity: 0.9
                worldDirection: Qt.vector3d(0, 0.6, -1)
            
        ]
    

    RenderSettings 
        id: external_forward_renderer
        activeFrameGraph: ForwardRenderer 
            camera: camera
            clearColor: "transparent"
        
    

    Mesh 
        id: roboMesh
        source: "images/robo-obj-pose4/source/d2f0cff60afc40f5afe79156ec7db657.obj"
    

    Entity 
        id: circleEntity
        property Material roboMaterial: PhongAlphaMaterial 
            alpha: 0.4
            ambient: "black"
            diffuse: "black"
            specular: "black"
            shininess: 10000
        

        components: [roboMesh, roboMaterial]
    

我在这里缺少什么?很抱歉提出一个非常愚蠢的问题,但我对 Qt3D 完全陌生,并且对我的代码中还需要添加什么感到困惑。

【问题讨论】:

obj 文件不存储与材质或纹理相关的数据。它们只存储几何数据。 .mtl 文件中定义了对网格不同部分的材质的引用。您应该提供 .obj、.mtl 和所有纹理文件。 纹理(一堆 png 文件)已经存在于同一文件夹路径 - images/robo-obj-pose4/textures 中。我是否也需要在 QML 代码中的某处添加此路径?此外,在我的情况下,我没有看到任何 .mtl 文件。它只是 obj 和纹理。 我不确定 Qt3D 是否会自动加载 mtl 中提供的材料。无论如何,我认为您应该在 qml 代码中提供 mtl 文件或定义自定义材料实体。 【参考方案1】:

您不一定需要 cmets 建议的材料文件,您可以按照自己的方式分配通用材料,只是代码存在一些其他问题。

首先,您需要将RenderSettings 作为组件添加到 root 实体中,如下所示:

Entity 
    id: sceneRoot

    components: [external_forward_renderer]

    ...

其次,"transparent" 不是有效的透明色。使用 Qt.rgba(0, 0.5, 1, 1) 之类的东西。

第三,您需要将file:// 添加到网格 URL 的开头,除非您将文件包含在资源文件中。至少我需要那个前缀,也许你不需要。您可以通过查看 QtCreator 中的应用程序输出来检查这一点。如果显示“文件不存在”,则添加此前缀。

如果您仍然看不到网格,请尝试添加 InputSettings(也必须作为组件添加)和 OrbitCameraController

InputSettings 
    id: inputSettings


OrbitCameraController
    camera: camera

【讨论】:

感谢您的广泛回复。我按照建议进行了更改,但我仍然得到相同的输出 - 一个空白的白色屏幕。这就是最终代码的样子——pastebin.com/9aFtx9d6(由于这里的字符有限,使用 pastebin)在旁注中,我在 main.qml 的 Rectangle 中显示根实体——这就是它的样子——pastebin.com/ySmZ1Bxg。这应该是个问题吗? 好的,从矩形内部显示它可能是另一个问题。看看 QtCreator 中的 QML 示例 Scene 3D,看看他们是如何做到的。 好的,看起来我缺少了一个 Scene3D 元素,因此模型现在出现了。现在我可以显示模型了。最终代码看起来像这样 - pastebin.com/qKq18kVF 有没有办法在显示以适应其父窗口或其他东西时调整此模型的大小?目前显示器太小了。我想动态调整它的大小,并且能够沿着它的轴旋转它。 如果我的回答对您有帮助,您可以接受它作为解决方案。我不确定您评论中的问题是什么意思。但是 cmets 在那里,人们可以要求您澄清您的问题等,所以如果您有其他问题,请提出另一个问题 :)

以上是关于QML 3D 基本示例的主要内容,如果未能解决你的问题,请参考以下文章

如何在 3D 中对 QML 旋转变换进行动画处理和属性插值

QML下的OpenGL

QT3D Multiview - 小部件中的单一视图

QML从文件加载组件简单示例

C ++中的Qt3d输入

Qt 6.x中Qt Quick简介及示例