Qt Quick Ejemplo de interacción 3D - XR 3D
Demuestra cómo manipular objetos 3D con Qt Quick 3D XR.

Este ejemplo muestra cómo crear componentes que mueven y redimensionan objetos 3D en una escena. Utiliza la misma estrategia de selección de rayos que el ejemplo xr_input.
Controlador de entrada
En este ejemplo, creamos un componente reutilizable llamado AimController. Este componente realiza la selección de rayos para seleccionar un modelo y, opcionalmente, permite al usuario coger el modelo seleccionado y moverlo.
AimController define señales que nos permiten implementar interacciones personalizadas:
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
Definimos un componente abstracto, XrGadget, que tiene dos funciones: handleControllerPress y handleControllerMove. En C++, estas funciones habrían sido virtuales. Dado que este ejemplo se implementa completamente en QML, en su lugar emitimos señales que pueden ser manejadas en subcomponentes.
Por ejemplo, TranslateGadget mueve el objeto controlado a lo largo del eje del gadget basándose en la señal onMoved:
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) }
Componentes reutilizables
Colocamos el AimController y los gadgets en el subproyecto separado xr_shared, para poder reutilizarlos en futuros ejemplos. (xr_shared también incluye el componente FreeformTeleporter del ejemplo de teletransporte de forma libre).
Unirlo todo
Definimos un componente GadgetBox que realiza un seguimiento de qué objeto está seleccionado y muestra una caja translúcida alrededor del objeto seleccionado, además de mostrar gadgets alrededor del objeto. Cuando se pulsa un objeto seleccionado, GadgetBox alternará entre los tres tipos diferentes de gadgets (traducir, rotar y redimensionar).
En main.qml reaccionamos a las señales de AimController y llamamos a las funciones de GadgetBox:
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 }
También proporcionamos retroalimentación háptica cuando el objeto o gadget sobre el que pasamos el ratón cambia:
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.