How To Use
Short video tutorial explaining how to implement user interface using OctoXR
Drag and drop OctoHand_Left and OctoHand_Right prefabs as a child of TrackingSpace.
Reference (for Oculus) OVRCameraRig to InputRoot of MultiSourceInputDataProvider for each hand.
Drag and drop OctoInputModule prefab somewhere in scene hierarchy. Make sure that there are no other input modules or event systems in the scene.
Drag and drop UIPointer prefab as a child of OctoHand_Left and OctoHand_Right.
UIPointer has two child game objects, pointer for hand tracking and pointer for controller tracking.
Reference Pointer and PointerSelected from OctoInputModule.
Reference corresponding input providers, skeletons and marker palm center for each hand.
Style your ray using RayVisuals.
Use pinch gestures to operate UI elements
UIPointer uses GraphicRaycaster to manipulate the canvas which means that canvas needs graphic elements. This can lead to unwanted behavior when no graphical elements are found on canvas. Make sure that every canvas has an Image that covers whole width and height of the canvas. You can make that picture transparent. Then your UIPointer will recognize the whole canvas.
Never rotate your UI elements by 180 degrees around Y axis, rather scale your element to negative value on X axis. That is because Z axis needs to point away from canvas!