Auf dieser Seite

Qt Quick 3D - Beispiel für XR-3D-Interaktion

Veranschaulicht, wie man 3D-Objekte mit „ Qt Quick 3D “ XR manipuliert.

3D-Szene mit bunten Buchstaben und Formen, die im Raum schweben

Dieses Beispiel zeigt, wie Komponenten erstellt werden, die 3D-Objekte in einer Szene bewegen und deren Größe ändern. Es verwendet dieselbe Ray-Picking-Strategie wie das Beispiel „xr_input “.

Controller-Eingabe

In diesem Beispiel erstellen wir eine wiederverwendbare Komponente namens „ AimController “. Diese führt ein Ray-Picking durch, um ein Modell auszuwählen, und ermöglicht es dem Benutzer optional, das ausgewählte Modell zu greifen und zu verschieben.

AimController definiert Signale, mit denen wir benutzerdefinierte Interaktionen implementieren können:

property Model hoveredObject: null
signal objectPressed(obj: Model, pos: vector3d, direction: vector3d)
signal moved(pos: vector3d, direction: vector3d)
signal released()
signal objectGrabbed(obj: Model)

Gadgets

Wir definieren eine abstrakte Komponente namens „ XrGadget “, die über zwei Funktionen verfügt: „ handleControllerPress “ und „ handleControllerMove “. In C++ wären diese Funktionen virtuell gewesen. Da dieses Beispiel vollständig in QML implementiert ist, senden wir stattdessen Signale aus, die in Unterkomponenten verarbeitet werden können.

Beispielsweise bewegt „ TranslateGadget “ das gesteuerte Objekt basierend auf dem Signal „ onMoved “ entlang der Achse des Gadgets:

onMoved: (pos, dir) => {
    let moveDirection = delta.normalized()
    let mapped_axis = controlledObject.mapDirectionToScene(axisDirection).normalized()
    let dot = mapped_axis.dotProduct(moveDirection)
    let offset = mapped_axis.times(delta.length() * dot)
    controlledObject.position = originalPos.plus(offset)
}

Alles miteinander verknüpfen

Wir definieren eine Komponente „ GadgetBox “, die verfolgt, welches Objekt ausgewählt ist, und um das ausgewählte Objekt herum einen durchscheinenden Rahmen anzeigt, zusätzlich zu den Gadgets rund um das Objekt. Wenn ein ausgewähltes Objekt gedrückt wird, wechselt das Signal „ GadgetBox “ zwischen den drei verschiedenen Gadget-Typen (Verschieben, Drehen und Größenänderung).

In „ main.qml “ reagieren wir auf die Signale von „ AimController “ und rufen die Funktionen in „ GadgetBox “ auf:

AimController {
    id: rightAim
    controller: XrController.RightController
    view: xrView
    enableVirtualMouse: true
    enableThumbstickMove: thumbCheckBox.checked

    onObjectPressed: (obj, pos, dir) => {
        gadgetBox.handlePress(obj, pos, dir)
    }
    onHoveredObjectChanged: {
        gadgetBox.handleHover(hoveredObject)
        hapticFeedback.handleHover(hoveredObject)
    }
    onMoved: (pos, dir) => {
        gadgetBox.handleMove(pos, dir)
    }
    onReleased: {
        gadgetBox.handleRelease()
    }
    onObjectGrabbed: (obj) => {
        if (!grabCheckBox.checked)
            return
        const gadget = obj as XrGadget
        if (!gadget)
            startGrab(obj)
        else if (gadget.grabbable)
            startGrab(gadget.controlledObject)
    }
    Model {
        source: "#Cylinder"
        scale: "0.05, 0.1, 0.05"
        z: 5
        eulerRotation.x: 90
        materials: PrincipledMaterial {
            baseColor: "black"
        }
    }
    xrCursor: cursor
}

Außerdem geben wir haptisches Feedback, wenn sich das Objekt oder Gadget, über dem der Mauszeiger schwebt, ändert:

XrHapticFeedback {
    id: hapticFeedback
    controller: XrHapticFeedback.RightController
    hapticEffect: XrSimpleHapticEffect {
        amplitude: 0.5
        duration: 10
        frequency: 200
    }
    property Model prevObj: null
    function handleHover(obj: Model) {
        if (obj && obj !== prevObj)
            start()
        prevObj = obj
    }
}

Beispielprojekt auf 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.