Qt Quick 3D - RuntimeLoader 示例

演示如何在运行时加载资产。

本示例展示了如何使用 RuntimeLoader 实现一个简单的资产查看器。

有关如何设置基本场景的解释,请参见 入门示例文档。一旦我们设置了场景,我们就可以添加 RuntimeLoader 元素

RuntimeLoader {
    id: importNode
    source: windowRoot.importUrl
    instancing: instancingButton.checked ? instancing : null
    onBoundsChanged: helper.updateBounds(bounds)
}

通过设置 RuntimeLoadersource 属性来加载资产。在本例中,source 绑定到 importUrl,当用户在文件对话框中选择文件时将发生变化。

假设资产可以加载,则内容将被创建为 RuntimeLoaderimportNode 的子元素。请注意,RuntimeLoader 是一个 Node 类型,并且由于它也是加载的资产的根节点,因此应用于 importNode 的任何变换也将影响其子元素。

错误处理

如果资产加载失败,则 RuntimeLoaderstatus 属性将设置为 Error。然后可以通过查询 RuntimeLoadererrorString 获取有关错误的更详细描述。

在本例中,我们将错误消息显示在中间的红色消息框中,如下所示

Rectangle {
    id: messageBox
    visible: importNode.status !== RuntimeLoader.Success
    color: "red"
    width: parent.width * 0.8
    height: parent.height * 0.8
    anchors.centerIn: parent
    radius: Math.min(width, height) / 10
    opacity: 0.6
    Text {
        anchors.fill: parent
        font.pixelSize: 36
        text: "Status: " + importNode.errorString + "\nPress \"Import...\" to import a model"
        color: "white"
        wrapMode: Text.Wrap
        horizontalAlignment: Text.AlignHCenter
        verticalAlignment: Text.AlignVCenter
    }
}
移动相机

为了能够改变相机的位置,我们使用了来自 Helpers 模块的 WasdController 并将其绑定到我们的相机,如下所示

OrbitCameraController {
    id: orbitController
    origin: orbitCameraNode
    camera: orbitCamera
    enabled: helper.orbitControllerEnabled
}
WasdController {
    id: wasdController
    controlledObject: wasdCamera
    enabled: !helper.orbitControllerEnabled
}

除了 WasdController 之外,本例还使用了一个 WheelHandler 和一个 PointerHandler 来缩放和旋转模型。

实例化

如上所示,RuntimeLoader 元素也可以与实例化结合使用。

RandomInstancing {
    id: instancing
    instanceCount: 30
    position: InstanceRange {
        property alias boundsDiameter: helper.boundsDiameter
        from: Qt.vector3d(-3*boundsDiameter, -3*boundsDiameter, -3*boundsDiameter);
        to: Qt.vector3d(3*boundsDiameter, 3*boundsDiameter, 3*boundsDiameter)
    }
    color: InstanceRange { from: "black"; to: "white" }
}

RuntimeLoader 并没有继承自 Model,但它拥有自己的 instancing 属性,这允许我们将复杂的导入资产实例化为一个简单的模型。在这种情况下,我们使用来自 Helpers 模块的 RandomInstancing 组件,在固定区域内随机定位项目,并且具有随机颜色。

材质覆盖

有时在加载资产时,它可能看起来与预期不符。materialOverride 属性将改变场景中每个材质的渲染方式,以显示整体渲染的特定贡献。这有助于确定资产中不正确的地方,以便如有必要可以对原始资产进行调整。

文件

© 2024 QT公司有限公司。包含在此处的文档贡献是各自所有者的版权。此处提供的文档是根据自由软件基金会发布的《GNU自由文档许可协议版本1.3》许可的。Qt及其相关标志是QT公司(芬兰)及其它世界各地公司的商标。所有其他商标均为各自所有者的财产。