Sur cette page

Qt Quick 3D - Exemple de RuntimeLoader

Illustre comment charger des ressources lors de l'exécution.

Plusieurs modèles de voiture avec instanciation et commandes de la barre d'outils

Cet exemple montre comment implémenter une visionneuse de ressources simple à l'aide de l'RuntimeLoader.

Consultez la documentation de l’exemple d’introduction pour savoir comment 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’un élément s’effectue en définissant la propriété « source » de l’ RuntimeLoader. Dans cet exemple, la propriété « source » est liée à la variable « importUrl », qui sera modifiée lorsque l’utilisateur sélectionnera un fichier dans la boîte de dialogue de sélection de fichiers.

En supposant que la ressource puisse être chargée, le contenu sera créé en tant qu’enfants de l’élément RuntimeLoader importNode . Notez que l’ RuntimeLoader est de type Node et que, puisqu’il s’agit également du nœud racine de la ressource chargée, toute transformation appliquée à l’ importNode affectera également ses enfants.

Gestion des erreurs

Si le chargement d’un élément échoue, la propriété ` status ` de l’ RuntimeLoader sera définie sur ` Error`. Il est alors possible d’interroger le ` errorString ` de l’ RuntimeLoader 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 centre 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 permettre de modifier la position de la caméra, nous utilisons l’ WasdController du module Helpers et l’associons à 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 l’ WasdController, l’exemple utilise un WheelHandler et un PointerHandler pour mettre à l’échelle et faire pivoter le modèle.

Instanciation

L’élément RuntimeLoader peut également être utilisé en combinaison avec l’instanciation, comme illustré ici :

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 dispose de sa propre propriété instancing qui nous permet d’instancier un asset importé complexe comme s’il s’agissait d’un modèle simple. Dans ce cas, nous utilisons le composant RandomInstancing du module Helpers pour positionner aléatoirement des éléments dans une zone définie et leur attribuer une couleur aléatoire.

Remplacement des matériaux

Il arrive parfois que, lors du chargement d’un élément, celui-ci ne s’affiche pas comme prévu. La propriété ` materialOverride ` modifie la manière dont chaque matériau de la scène est rendu afin de mettre en évidence sa contribution spécifique au rendu global. Cela peut s’avérer utile pour déterminer précisément ce qui ne va pas avec l’élément, afin de pouvoir ajuster l’élément d’origine si nécessaire.

Modèle 3D rendu avec une surcouche de texture de carte de normales mettant en évidence les détails de la surface

Exemple de projet sur 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.