IWSDK Ray Interaction
Choose one interaction branch from measured target components. Ray clicks and distance grabs share aiming but not input duration or movement behavior.
Locate and aim once
- Check XR session state and enter only when inactive.
- Find the named entity or runtime-named UIKit control, then query its
components and transform. For UIKit, prefer the live name assigned through
requireElementById; use a project test hook only when no addressable runtime target exists. - Aim the requested controller with
xr look-at. Do not translate the controller toward a ray target.
Select exactly one branch
Click or UIKit button
For RayInteractable, Pressed, or a UIKit control, use one normal select:
npx iwsdk xr select --input-json '{"device":"controller-right","duration":0.2}'
Use an explicit select-value press/release only when the task needs to inspect the held interval. Query the named application state or control effect after the click; a screenshot alone is not interaction proof.
Distance grab
For DistanceGrabbable, hold trigger button index 0, optionally move the
controller, then release index 0:
{"device":"controller-right","buttons":[{"index":0,"value":1}]}
Check movementMode before deciding whether the object should remain remote or
move toward the hand. Query Grabbed or transform state while held and after
release. Do not substitute squeeze index 1; that is the proximity-grab path.
For MoveFromTarget, do not inspect implementation source. Before pressing,
record controller position P and object position S, and compute the grab
distance d = |S - P|. While trigger is held, call xr look-at with the
requested object destination as target and moveToDistance: d; this preserves
the ray distance while moving its endpoint to the destination. Query the object
before release to confirm the move, then release and query again.
Evidence and stopping
For a task with both a click and a distance grab, locate/aim/click/query the first target, then locate/aim/hold-move-release/query the second. Do not rediscover the CLI family, inspect pointer internals, or guess panel offsets from screenshots.
Capture one runtime image only when visual placement is part of the request.
When the request names an artifact path, save it directly with
npx iwsdk browser screenshot --output-file <path>; do not capture into model
context and then add a copy step.
Stop when the real input and resulting named state are proven, leaving all
buttons released.