Revision control

Copy as Markdown

// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\example xr_touch
\ingroup quick3d-examples
\ingroup qt3dxr-examples
\title Qt Quick 3D - XR Simple Touch Example
\examplecategory {3D}
\brief Demonstrates hand-tracking input in \qxr.
\image xrtouch-example.jpg
{Virtual screen labeled XR Touch Example with three buttons}
This example shows how to use the hand-tracking API in \qxr to
interact with 2D and 3D objects in the scene. It follows the basic structure of
the \l{Qt Quick 3D - XR Simple Example}{xr_simple} example.
We start by creating a reusable component \c TouchHand that encapsulates all the logic that we need for each hand.
\quotefile xr_touch/TouchHand.qml
The component contains an XrController, giving us the 3D position of the index finger, and an
XrHandModel to show where the hand is. The \c onTouchPositionChanged handler is where the magic happens.
We call \l{XrView::processTouch}{XrView.processTouch()}, which does the heavy lifting: It tries to map the 3D touch position
to a 2D position on an \l XrItem and sends a touch event if it finds an item. It then returns the offset
from the 3D position to the touch point on the 2D surface. We then use that offset to shift the position
of the XrHandModel, to give the illusion that the hand is stopped by the surface.
\note This effect will not work on the Apple Vision Pro since the system shows the real hands of the user,
and the XrHandModel is not shown.
We create two instances of the TouchHand component inside the XrOrigin, one for each hand:
\snippet xr_touch/main.qml origin
Here, \c buttons is a group of 3D buttons that has a \c handleTouch function.
(The implementation is not XR specific, so the details are not documented here.)
We position the XrOrigin 50 centimeters from the origin of the scene, which should be a comfortable
touching distance.
The rest of the scene contains some 3D models and an XrItem that reacts to touch events.
*/