Qt Quick 3D - Beispiel für XR-3D-Interaktion
Veranschaulicht, wie man 3D-Objekte mit „ Qt Quick 3D “ XR manipuliert.

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
}
}© 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.