Sur cette page

Qt Quick 3D - Exemple de chargement au moment de l'exécution

Démontre comment les actifs peuvent être chargés au moment de l'exécution.

Modèles de voitures multiples avec instanciation et contrôle par barre d'outils

Cet exemple montre comment mettre en œuvre une visionneuse de ressources simple à l'aide de RuntimeLoader.

Voir la documentation de l'exemple d'introduction pour une explication sur la façon de configurer une scène de base. Une fois la scène configurée, nous pouvons ajouter l'élément RuntimeLoader:

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

Le chargement d'une ressource s'effectue en définissant la propriété source de RuntimeLoader. Dans cet exemple, l'élément source est lié à l'élément importUrl qui sera modifié lorsque l'utilisateur sélectionnera un fichier dans le dialogue des fichiers.

En supposant que la ressource puisse être chargée, le contenu sera créé en tant qu'enfant de RuntimeLoader importNode . Notez que RuntimeLoader est un type Node, et puisqu'il est également le nœud racine de la ressource chargée, toutes les transformations appliquées à importNode affecteront également ses enfants.

Gestion des erreurs

Si le chargement d'un élément échoue, la propriété status de RuntimeLoader sera définie sur Error. La propriété errorString de RuntimeLoader peut alors être interrogée pour obtenir une description plus détaillée de l'erreur.

Dans cet exemple, nous afficherons le message d'erreur dans une boîte de message rouge au milieu de l'écran, comme ceci :

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
    }
}
Déplacement de la caméra

Pour pouvoir modifier la position de la caméra, nous utilisons le module WasdController du module Helpers et le lions à notre caméra, comme ceci :

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

En plus de WasdController, l'exemple utilise WheelHandler et PointerHandler pour mettre le modèle à l'échelle et le faire pivoter.

Instanciation

L'élément RuntimeLoader peut également être utilisé en combinaison avec l'instanciation, comme le montre l'exemple suivant :

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 n'hérite pas de Model, mais il possède sa propre propriété instancing qui nous permet d'instancier un actif importé complexe comme s'il s'agissait d'un simple modèle. Dans ce cas, nous utilisons le composant RandomInstancing du module Helpers pour positionner les éléments de manière aléatoire dans une zone fixe et avec une couleur aléatoire.

Remplacements de matériaux

Parfois, lors du chargement d'une ressource, il est possible qu'elle n'ait pas l'aspect escompté. La propriété materialOverride modifie le rendu de chaque matériau de la scène afin d'afficher une contribution particulière au rendu global. Cela peut s'avérer utile pour déterminer ce qui n'est pas correct dans la ressource, de sorte que la ressource d'origine puisse être ajustée si nécessaire.

Modèle 3D rendu avec une surcharge de matériau de la carte des normales montrant les détails de la surface

Exemple de projet @ code.qt.io

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.