@vincentt-xr/sdk 2.0.0-alpha.7 → 2.0.0-alpha.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/GROUNDING.md +5651 -82
- package/README.md +1 -0
- package/dist/CanonicalHeadFrame-BHcWyaiK.js +1506 -0
- package/dist/CanonicalHeadFrame-D-_T1OMU.cjs +1 -0
- package/dist/DebuggerUI-7ngnJsBe.js +275 -0
- package/dist/DebuggerUI-CoglgKdO.cjs +1 -0
- package/dist/FaceRetouch-CLoTfrcs.js +1071 -0
- package/dist/FaceRetouch-J1lC1WbS.cjs +134 -0
- package/dist/FaceSurface-CHAMEeG1.cjs +1 -0
- package/dist/FaceSurface-DmP9AEeC.js +27 -0
- package/dist/SegmentationOverlay-D_FWkcyP.cjs +35 -0
- package/dist/SegmentationOverlay-vn5x_knv.js +6237 -0
- package/dist/SkeletonUtils-C2r90MtN.js +21 -0
- package/dist/SkeletonUtils-CddIup1F.cjs +1 -0
- package/dist/TextLabel-XE0rQSDn.cjs +2 -0
- package/dist/TextLabel-c9BCucOI.js +961 -0
- package/dist/assets/cache.d.ts +99 -0
- package/dist/assets/estimate.d.ts +11 -0
- package/dist/assets/gltfLoader.d.ts +16 -0
- package/dist/assets/index.d.ts +7 -0
- package/dist/assets/loaders.d.ts +43 -0
- package/dist/assets/react.d.ts +33 -0
- package/dist/body-pose/index.d.ts +521 -0
- package/dist/body-trigger/__fixtures__/syntheticBody.d.ts +83 -0
- package/dist/body-trigger/frame.d.ts +88 -0
- package/dist/body-trigger/index.d.ts +6 -0
- package/dist/body-trigger/moves.d.ts +235 -0
- package/dist/body-trigger/trigger.d.ts +75 -0
- package/dist/calibration/calibration.d.ts +75 -0
- package/dist/calibration/index.d.ts +6 -0
- package/dist/calibration/storage.d.ts +13 -0
- package/dist/calibration/types.d.ts +53 -0
- package/dist/calibration/useXRCalibration.d.ts +46 -0
- package/dist/camera/CameraPermissionGate.d.ts +26 -0
- package/dist/camera/devices.d.ts +26 -0
- package/dist/camera/index.d.ts +8 -0
- package/dist/camera/permission.d.ts +86 -0
- package/dist/camera/useCameraPermission.d.ts +35 -0
- package/dist/canonicalFace-BHwyCx1c.js +9 -0
- package/dist/canonicalFace-C83I225R.cjs +1 -0
- package/dist/capabilities/detect.d.ts +45 -0
- package/dist/capabilities/index.d.ts +5 -0
- package/dist/capabilities/types.d.ts +120 -0
- package/dist/capabilities/useXRCapabilities.d.ts +18 -0
- package/dist/compat/environment.d.ts +5 -0
- package/dist/compat/index.d.ts +4 -0
- package/dist/compat/run.d.ts +18 -0
- package/dist/compat/scenarios.d.ts +10 -0
- package/dist/compat/types.d.ts +101 -0
- package/dist/components/BodyInstruction/BodyPoseHint.d.ts +63 -0
- package/dist/components/BodyInstruction/index.d.ts +69 -0
- package/dist/components/BodyInstruction/useBodyPose.d.ts +23 -0
- package/dist/components/BodyTracker/index.d.ts +17 -0
- package/dist/components/BodyTrigger/index.d.ts +49 -0
- package/dist/components/Debugger/DebuggerProvider.d.ts +14 -1
- package/dist/components/Debugger/DebuggerUI.d.ts +3 -1
- package/dist/components/FaceAtlas/FaceAtlasLayer.d.ts +114 -0
- package/dist/components/FaceAtlas/MadeUpCamera.d.ts +80 -0
- package/dist/components/FaceAtlas/constants.d.ts +8 -0
- package/dist/components/FaceAtlas/index.d.ts +7 -0
- package/dist/components/FaceAtlas/useFaceAtlasSurface.d.ts +84 -0
- package/dist/components/FaceAtlas/useFaceSkin.d.ts +84 -0
- package/dist/components/FaceCharacter/ExternalFaceMesh.d.ts +109 -0
- package/dist/components/FaceCharacter/FaceExpressionController.d.ts +53 -0
- package/dist/components/FaceCharacter/FaceMorph.d.ts +71 -0
- package/dist/components/FaceCharacter/FacePiercing.d.ts +65 -0
- package/dist/components/FaceCharacter/FaceReprojection.d.ts +85 -0
- package/dist/components/FaceCharacter/FaceRig.d.ts +38 -0
- package/dist/components/FaceCharacter/FaceSurface.d.ts +49 -0
- package/dist/components/FaceCharacter/FaceSurfaceOccluder.d.ts +39 -0
- package/dist/components/FaceCharacter/PinToFaceMesh.d.ts +68 -0
- package/dist/components/FaceCharacter/index.d.ts +18 -0
- package/dist/components/FaceCharacter/useFaceReprojector.d.ts +10 -0
- package/dist/components/FaceInset/FaceInset.d.ts +68 -0
- package/dist/components/FaceInset/frame.d.ts +94 -0
- package/dist/components/FaceInset/index.d.ts +6 -0
- package/dist/components/FaceInset/material.d.ts +40 -0
- package/dist/components/FaceInset/useFaceInsetTexture.d.ts +37 -0
- package/dist/components/FaceInstruction/FaceExpressionHint.d.ts +43 -0
- package/dist/components/FaceInstruction/index.d.ts +56 -0
- package/dist/components/FaceInstruction/useFaceExpression.d.ts +20 -0
- package/dist/components/FaceLiquify/FaceLiquify.d.ts +49 -0
- package/dist/components/FaceLiquify/debug.d.ts +37 -0
- package/dist/components/FaceLiquify/frame.d.ts +55 -0
- package/dist/components/FaceLiquify/index.d.ts +10 -0
- package/dist/components/FaceLiquify/material.d.ts +39 -0
- package/dist/components/FaceLiquify/pass.d.ts +49 -0
- package/dist/components/FaceLiquify/presence.d.ts +25 -0
- package/dist/components/FaceLiquify/presets.d.ts +82 -0
- package/dist/components/FaceLiquify/selfTest.d.ts +66 -0
- package/dist/components/FaceLiquify/target.d.ts +85 -0
- package/dist/components/FaceLiquify/warp.d.ts +72 -0
- package/dist/components/FaceMesh/canonical/CanonicalFaceMeshRenderer.d.ts +37 -5
- package/dist/components/FaceMesh/canonical/geometryGroups.d.ts +21 -0
- package/dist/components/FaceMesh/canonical/parseCanonicalFaceModel.d.ts +21 -0
- package/dist/components/FaceMesh/canonical/shaders.d.ts +1 -1
- package/dist/components/FaceMesh/index.d.ts +2 -2
- package/dist/components/FaceRetouch/Background.d.ts +3 -1
- package/dist/components/FaceRetouch/FaceRetouch.d.ts +5 -0
- package/dist/components/FaceRetouch/renderState.d.ts +19 -0
- package/dist/components/FaceSwap/FaceMirror.d.ts +46 -0
- package/dist/components/FaceSwap/FaceSwap.d.ts +58 -0
- package/dist/components/FaceSwap/FaceTextureLayer.d.ts +72 -0
- package/dist/components/FaceSwap/faceSwapPlan.d.ts +91 -0
- package/dist/components/FaceSwap/index.d.ts +13 -0
- package/dist/components/FaceSwap/settings.d.ts +300 -0
- package/dist/components/FaceSwap/useFaceTexture.d.ts +35 -0
- package/dist/components/FaceSwap/useLiveFace.d.ts +38 -0
- package/dist/components/FaceSwap/useLiveFaceTexture.d.ts +31 -0
- package/dist/components/FaceWarp3D/FaceWarp3D.d.ts +50 -0
- package/dist/components/FaceWarp3D/index.d.ts +2 -3
- package/dist/components/Faceless/Faceless.d.ts +51 -0
- package/dist/components/Faceless/index.d.ts +2 -0
- package/dist/components/GestureListener/index.d.ts +11 -0
- package/dist/components/HairLock/HairLock.d.ts +39 -0
- package/dist/components/HairLock/index.d.ts +2 -0
- package/dist/components/HairLock/lockGeometry.d.ts +15 -0
- package/dist/components/HandCutout/index.d.ts +35 -0
- package/dist/components/HandInstruction/HandGestureHint.d.ts +70 -0
- package/dist/components/HandInstruction/index.d.ts +74 -0
- package/dist/components/HandInstruction/useHandGesture.d.ts +22 -0
- package/dist/components/HandRig/ForearmOccluder.d.ts +29 -0
- package/dist/components/HandRig/HandAttachment.d.ts +34 -0
- package/dist/components/HandRig/HandOccluder.d.ts +55 -0
- package/dist/components/HandRig/HandTattoo.d.ts +61 -0
- package/dist/components/HandRig/WristAttachment.d.ts +34 -0
- package/dist/components/HandRig/index.d.ts +101 -0
- package/dist/components/HandRig/useArmMask.d.ts +29 -0
- package/dist/components/HandRig/wristSolve.d.ts +69 -0
- package/dist/components/HandTouch/HandTouch.d.ts +62 -0
- package/dist/components/HandTouch/Touchable.d.ts +36 -0
- package/dist/components/HandTouch/index.d.ts +2 -0
- package/dist/components/HandTracker/index.d.ts +10 -0
- package/dist/components/HeadBinding/index.d.ts +14 -0
- package/dist/components/HeadOccluder/CanonicalHeadFrame.d.ts +22 -0
- package/dist/components/HeadOccluder/Earrings.d.ts +55 -0
- package/dist/components/HeadOccluder/HeadAttachment.d.ts +38 -0
- package/dist/components/HeadOccluder/NeckOccluder.d.ts +64 -0
- package/dist/components/HeadOccluder/earringPlacement.d.ts +31 -0
- package/dist/components/HeadOccluder/headAttachmentPoints.d.ts +69 -0
- package/dist/components/HeadOccluder/index.d.ts +57 -3
- package/dist/components/HeadOccluder/useCanonicalHeadFit.d.ts +36 -0
- package/dist/components/HeadOccluder/useLandmarkPoseFit.d.ts +80 -0
- package/dist/components/HolisticTracker/index.d.ts +69 -0
- package/dist/components/HolisticTracker/settings.d.ts +58 -0
- package/dist/components/HolisticTracker/signals.d.ts +49 -0
- package/dist/components/Instruction/HintStage.d.ts +29 -0
- package/dist/components/Instruction/InstructionCue.d.ts +126 -0
- package/dist/components/Instruction/gestureHold.d.ts +20 -0
- package/dist/components/Instruction/ghost.d.ts +129 -0
- package/dist/components/Instruction/hintBlend.d.ts +19 -0
- package/dist/components/Instruction/hintLook.d.ts +81 -0
- package/dist/components/Instruction/hintLoop.d.ts +36 -0
- package/dist/components/Instruction/index.d.ts +41 -0
- package/dist/components/Instruction/useGhostModel.d.ts +33 -0
- package/dist/components/Instruction/useInstructionHold.d.ts +72 -0
- package/dist/components/IrisEffect/IrisMaterial.d.ts +73 -0
- package/dist/components/IrisEffect/index.d.ts +51 -0
- package/dist/components/IrisEffect/settings.d.ts +117 -0
- package/dist/components/LipEffect/LipEffect.d.ts +27 -1
- package/dist/components/LipEffect/LipEffectMaterial.d.ts +95 -7
- package/dist/components/LipEffect/LipEffects.d.ts +12 -0
- package/dist/components/LipEffect/defaults.d.ts +46 -4
- package/dist/components/LipEffect/index.d.ts +11 -3
- package/dist/components/LipEffect/lipShading.d.ts +73 -0
- package/dist/components/LipEffect/settings.d.ts +375 -0
- package/dist/components/LipEffect/shader.d.ts +39 -0
- package/dist/components/LipEffect/types.d.ts +128 -9
- package/dist/components/LipEffect/useLipDesignTextures.d.ts +17 -0
- package/dist/components/LipEffect/uvGuide.d.ts +74 -0
- package/dist/components/Makeup/Blush.d.ts +18 -0
- package/dist/components/Makeup/Brows.d.ts +20 -0
- package/dist/components/Makeup/Contour.d.ts +17 -0
- package/dist/components/Makeup/Eyeliner.d.ts +20 -0
- package/dist/components/Makeup/Eyeshadow.d.ts +20 -0
- package/dist/components/Makeup/Highlighter.d.ts +18 -0
- package/dist/components/Makeup/MakeupDesign.d.ts +37 -0
- package/dist/components/Makeup/MakeupRegion.d.ts +132 -0
- package/dist/components/Makeup/constants.d.ts +44 -0
- package/dist/components/Makeup/design.d.ts +106 -0
- package/dist/components/Makeup/designSamples.d.ts +42 -0
- package/dist/components/Makeup/eyes.d.ts +114 -0
- package/dist/components/Makeup/fields.d.ts +10 -0
- package/dist/components/Makeup/geometry.d.ts +106 -0
- package/dist/components/Makeup/index.d.ts +26 -0
- package/dist/components/Makeup/looks.d.ts +28 -0
- package/dist/components/Makeup/material.d.ts +239 -0
- package/dist/components/Makeup/settings.d.ts +54 -0
- package/dist/components/Makeup/shades.d.ts +143 -0
- package/dist/components/Makeup/shapes.d.ts +27 -0
- package/dist/components/Makeup/skinTone.d.ts +135 -0
- package/dist/components/Makeup/types.d.ts +110 -0
- package/dist/components/Makeup/useMakeupSkinTone.d.ts +40 -0
- package/dist/components/Necklace/Necklace.d.ts +44 -0
- package/dist/components/Necklace/index.d.ts +1 -0
- package/dist/components/ParticleEmitter/ParticleEmitter.d.ts +69 -0
- package/dist/components/ParticleEmitter/index.d.ts +1 -0
- package/dist/components/PersonCutout/index.d.ts +50 -0
- package/dist/components/PersonCutout/personCutout.d.ts +16 -0
- package/dist/components/ScreenImage/components/ScreenImageBody.d.ts +1 -1
- package/dist/components/ScreenImage/index.d.ts +3 -1
- package/dist/components/ScreenImage/materials/ScreenImageBlendMaterial.d.ts +1 -1
- package/dist/components/ScreenImage/materials/ScreenImageMaskMaterial.d.ts +11 -0
- package/dist/components/ScreenImage/source.d.ts +6 -0
- package/dist/components/ScreenImage/types.d.ts +18 -0
- package/dist/components/SegmentationOverlay/SegmentationOverlay.d.ts +37 -0
- package/dist/components/SegmentationOverlay/SegmentationOverlayMaterial.d.ts +31 -0
- package/dist/components/SegmentationOverlay/index.d.ts +9 -0
- package/dist/components/SegmentationOverlay/maskTexture.d.ts +23 -0
- package/dist/components/SegmentationOverlay/providers.d.ts +72 -0
- package/dist/components/SegmentationOverlay/settings.d.ts +65 -0
- package/dist/components/ShoulderOccluder/index.d.ts +43 -0
- package/dist/components/ShoulderOccluder/useCanonicalTorsoFit.d.ts +24 -0
- package/dist/components/SpringSwing/SpringSwing.d.ts +22 -0
- package/dist/components/SpringSwing/index.d.ts +1 -0
- package/dist/components/XRProvider/index.d.ts +16 -2
- package/dist/components/XRScene/renderOutputTarget.d.ts +12 -0
- package/dist/components/XRViewport/hooks/useViewportExternalFaces.d.ts +1 -1
- package/dist/components/XRViewport/hooks/useViewportMediaSource.d.ts +1 -1
- package/dist/components/XRViewport/hooks/useViewportPipeline.d.ts +1 -1
- package/dist/components/index.d.ts +11 -0
- package/dist/config/index.d.ts +0 -1
- package/dist/constants/index.d.ts +4 -1
- package/dist/context-DTxSQvp4.js +13 -0
- package/dist/context-hA0Rb2Xa.cjs +1 -0
- package/dist/contexts-BH7PdKFS.cjs +1 -0
- package/dist/contexts-jak8-tND.js +667 -0
- package/dist/coordinates/feed.d.ts +52 -0
- package/dist/coordinates/index.d.ts +7 -0
- package/dist/coordinates/side.d.ts +40 -0
- package/dist/coordinates/spaces.d.ts +49 -0
- package/dist/coordinates/viewport.d.ts +22 -0
- package/dist/coordinates/world.d.ts +15 -0
- package/dist/debug-ui/default-setting.cjs +2 -2
- package/dist/debug-ui/face-swap-settings/index.d.ts +22 -0
- package/dist/debug-ui/gesture-settings/index.d.ts +14 -0
- package/dist/debug-ui/hierarchy-panel/index.d.ts +3 -2
- package/dist/debug-ui/holistic-tracker-settings/index.d.ts +16 -0
- package/dist/debug-ui/index.d.ts +18 -3
- package/dist/debug-ui/iris-effect-settings/index.d.ts +12 -0
- package/dist/debug-ui/lip-effect-settings/index.d.ts +15 -0
- package/dist/debug-ui/media-source/index.d.ts +1 -1
- package/dist/debug-ui/media-source/session.d.ts +30 -2
- package/dist/debug-ui/media-source.cjs +1 -1
- package/dist/debug-ui/media-source.js +1 -1
- package/dist/debug-ui/object-inspector-panel/index.d.ts +3 -2
- package/dist/debug-ui/product-hotspots/index.d.ts +25 -0
- package/dist/debug-ui/scene-editor/hierarchy-panel.d.ts +3 -1
- package/dist/debug-ui/scene-editor/inspector-panel.d.ts +3 -1
- package/dist/debug-ui/screen-image-settings/index.d.ts +3 -1
- package/dist/debug-ui/screen-text-settings/ScreenTextSettingsPanel.d.ts +1 -1
- package/dist/debug-ui/screen-text-settings/types.d.ts +2 -0
- package/dist/debug-ui/segmentation-overlay-settings/index.d.ts +12 -0
- package/dist/debug-ui/settings-panel/index.d.ts +6 -1
- package/dist/debug-ui/shared/debugWindow.d.ts +51 -0
- package/dist/debug-ui/xr-diagnostics/index.d.ts +26 -0
- package/dist/debug-ui.cjs +3 -3
- package/dist/debug-ui.js +2695 -2547
- package/dist/detector-K8aej4MB.js +59 -0
- package/dist/detector-ijypGtse.cjs +1 -0
- package/dist/entries/all.d.ts +3 -1
- package/dist/entries/core.d.ts +20 -2
- package/dist/entries/face-effects.d.ts +123 -9
- package/dist/entries/instructions.d.ts +48 -0
- package/dist/entries/internal.d.ts +2 -1
- package/dist/entries/low-level.d.ts +49 -3
- package/dist/entries/particles.d.ts +11 -0
- package/dist/entries/product.d.ts +11 -0
- package/dist/entries/tracking.d.ts +60 -2
- package/dist/face-atlas/attributes.d.ts +30 -0
- package/dist/face-atlas/eyes.d.ts +272 -0
- package/dist/face-atlas/faceAtlas.generated.d.ts +46 -0
- package/dist/face-atlas/glsl/atlasVertex.d.ts +46 -0
- package/dist/face-atlas/glsl/common.d.ts +55 -0
- package/dist/face-atlas/glsl/design.d.ts +49 -0
- package/dist/face-atlas/glsl/eyes.d.ts +73 -0
- package/dist/face-atlas/glsl/finish.d.ts +24 -0
- package/dist/face-atlas/glsl/format.d.ts +4 -0
- package/dist/face-atlas/glsl/index.d.ts +59 -0
- package/dist/face-atlas/glsl/shading.d.ts +15 -0
- package/dist/face-atlas/glsl/shapes.d.ts +66 -0
- package/dist/face-atlas/glsl/sparkle.d.ts +19 -0
- package/dist/face-atlas/glsl/uniforms.d.ts +106 -0
- package/dist/face-atlas/guide.d.ts +51 -0
- package/dist/face-atlas/index.d.ts +25 -0
- package/dist/face-atlas/lead.d.ts +117 -0
- package/dist/face-atlas/madeUpCamera.d.ts +125 -0
- package/dist/face-atlas/masks.d.ts +53 -0
- package/dist/face-atlas/obj.d.ts +69 -0
- package/dist/face-atlas/polylines.d.ts +63 -0
- package/dist/face-atlas/probe/FaceSkinProbe.d.ts +208 -0
- package/dist/face-atlas/probe/__fixtures__/emulate.d.ts +9 -0
- package/dist/face-atlas/probe/__fixtures__/face.d.ts +24 -0
- package/dist/face-atlas/probe/constants.d.ts +137 -0
- package/dist/face-atlas/probe/glsl.d.ts +43 -0
- package/dist/face-atlas/probe/lightFit.d.ts +108 -0
- package/dist/face-atlas/probe/schedule.d.ts +44 -0
- package/dist/face-atlas/probe/selfTest.d.ts +87 -0
- package/dist/face-atlas/probe/stats.d.ts +143 -0
- package/dist/face-atlas/probe/targets.d.ts +70 -0
- package/dist/face-atlas/probe/unwrap.d.ts +76 -0
- package/dist/face-atlas/quality.d.ts +28 -0
- package/dist/face-atlas/regions.d.ts +31 -0
- package/dist/face-atlas/registry.d.ts +252 -0
- package/dist/face-atlas/renderState.d.ts +86 -0
- package/dist/face-atlas/selfOcclusion.d.ts +62 -0
- package/dist/face-atlas/shading.d.ts +406 -0
- package/dist/face-atlas/shapes.d.ts +86 -0
- package/dist/face-atlas/sides.d.ts +41 -0
- package/dist/face-atlas/skinMask.d.ts +35 -0
- package/dist/face-atlas/surface.d.ts +155 -0
- package/dist/face-atlas/topology.d.ts +44 -0
- package/dist/face-character/__fixtures__/faceImageDetections.d.ts +25 -0
- package/dist/face-character/__fixtures__/faceNode.d.ts +22 -0
- package/dist/face-character/bindFaceModel.d.ts +106 -0
- package/dist/face-character/canonicalFace.d.ts +17 -0
- package/dist/face-character/canonicalFaceGeometry.d.ts +11 -0
- package/dist/face-character/canonicalFacePositions.d.ts +7 -0
- package/dist/face-character/driveFaceModel.d.ts +57 -0
- package/dist/face-character/expressionOutputs.d.ts +45 -0
- package/dist/face-character/faceExpressions.d.ts +104 -0
- package/dist/face-character/faceImageLandmarker.d.ts +93 -0
- package/dist/face-character/faceMeshBinding.d.ts +62 -0
- package/dist/face-character/faceMorph.d.ts +77 -0
- package/dist/face-character/faceMorphs.d.ts +46 -0
- package/dist/face-character/facePhoto.d.ts +138 -0
- package/dist/face-character/facePiercings.d.ts +116 -0
- package/dist/face-character/facePin.d.ts +131 -0
- package/dist/face-character/faceReprojection.d.ts +273 -0
- package/dist/face-character/faceReprojector.d.ts +171 -0
- package/dist/face-character/faceRig.d.ts +176 -0
- package/dist/face-character/faceSwapPresence.d.ts +85 -0
- package/dist/face-character/faceTexture.d.ts +169 -0
- package/dist/face-character/faceTextureBaker.d.ts +86 -0
- package/dist/face-character/faceTextureGuide.d.ts +106 -0
- package/dist/face-character/faceTextureStats.d.ts +298 -0
- package/dist/face-character/faceTransfer.d.ts +396 -0
- package/dist/face-character/faceTransferGeometry.d.ts +109 -0
- package/dist/face-character/faceTransferSelfTest.d.ts +94 -0
- package/dist/face-character/faceWarp3D.d.ts +101 -0
- package/dist/face-character/faceless.d.ts +79 -0
- package/dist/face-character/featureWarp.d.ts +28 -0
- package/dist/face-character/liveFaceRegistry.d.ts +370 -0
- package/dist/face-character/liveValue.d.ts +12 -0
- package/dist/face-character/memo.d.ts +15 -0
- package/dist/face-effects.cjs +2324 -1
- package/dist/face-effects.js +14208 -2268
- package/dist/face-expression/index.d.ts +182 -0
- package/dist/face-info/landmarks.d.ts +17 -3
- package/dist/face-info/types.d.ts +20 -3
- package/dist/gestures/definitions.d.ts +98 -0
- package/dist/gestures/detector.d.ts +87 -0
- package/dist/gestures/index.d.ts +8 -0
- package/dist/gestures/measures.d.ts +114 -0
- package/dist/gestures/settings.d.ts +49 -0
- package/dist/getFaceInfo-B1otSDMX.cjs +1 -0
- package/dist/getFaceInfo-Cu4xDWiL.js +62 -0
- package/dist/hand/armFit.d.ts +46 -0
- package/dist/hand/armMask.d.ts +178 -0
- package/dist/hand/handCutout.d.ts +23 -0
- package/dist/hand/handCutoutRegistry.d.ts +7 -0
- package/dist/hand/handGestures.d.ts +524 -0
- package/dist/hand/handPose.d.ts +98 -0
- package/dist/hand/handRigSolver.d.ts +159 -0
- package/dist/hand/handTattoo.d.ts +81 -0
- package/dist/hand/handTouch.d.ts +240 -0
- package/dist/hand/wrist.d.ts +44 -0
- package/dist/hand/wristFilter.d.ts +44 -0
- package/dist/hooks/selectors.d.ts +76 -1
- package/dist/hooks/useCalibrationFaceTracker.d.ts +1 -1
- package/dist/hooks/useFaceInfo.d.ts +13 -1
- package/dist/hooks/useFaceInfos.d.ts +1 -1
- package/dist/hooks/useFaceModelAcquisition.d.ts +38 -0
- package/dist/hooks/useGesture.d.ts +32 -0
- package/dist/hooks/useIrisTracking.d.ts +45 -0
- package/dist/hooks/useTrackerContext.d.ts +6 -0
- package/dist/hooks/useXRDiagnostics.d.ts +81 -0
- package/dist/hooks/useXRModel.d.ts +7 -0
- package/dist/hooks/useXRSession/facade.d.ts +42 -2
- package/dist/hooks/useXRSession/index.d.ts +2 -2
- package/dist/hooks/useXRSession/reason.d.ts +3 -1
- package/dist/hooks/useXRSession/registry.d.ts +14 -0
- package/dist/hooks/useXRSession/store.d.ts +52 -3
- package/dist/index-B1_TzJaI.js +1104 -0
- package/dist/index-BavF06C6.js +190 -0
- package/dist/index-BfFmpddl.cjs +21 -0
- package/dist/index-BuBzneeW.cjs +46 -0
- package/dist/index-CGsQWodV.cjs +1 -0
- package/dist/index-CIe7eCMH.js +3200 -0
- package/dist/index-CfSF8LXa.cjs +1 -0
- package/dist/index-D5GTzOzD.cjs +1 -0
- package/dist/index-DBhQzvVa.js +314 -0
- package/dist/index-DE17y0ZI.cjs +1 -0
- package/dist/index-JII7huPk.js +442 -0
- package/dist/index-tpCr9CLj.cjs +1 -0
- package/dist/index-w1S7fI2B.js +1432 -0
- package/dist/index-zGaqrz_K.js +188 -0
- package/dist/instructions.cjs +30 -0
- package/dist/instructions.js +1507 -0
- package/dist/{internal-Dmk1cTXq.js → internal-B90P-clC.js} +138 -119
- package/dist/internal-Cjinca64.cjs +1 -0
- package/dist/internal.cjs +1 -1
- package/dist/internal.js +15 -10
- package/dist/iris/compute.d.ts +27 -0
- package/dist/iris/index.d.ts +4 -0
- package/dist/iris/lead.d.ts +19 -0
- package/dist/iris/types.d.ts +89 -0
- package/dist/landmarkMask-BFDyBnKM.js +224 -0
- package/dist/landmarkMask-u7es2k4X.cjs +1 -0
- package/dist/landmarks-BlUqf5MZ.cjs +1 -0
- package/dist/landmarks-bftdwq6Z.js +76 -0
- package/dist/loaders-BGAUACsd.js +363 -0
- package/dist/loaders-BJ1_QCHt.cjs +1 -0
- package/dist/low-level.cjs +1 -1
- package/dist/low-level.js +1190 -675
- package/dist/main.cjs +1 -1
- package/dist/main.js +1190 -452
- package/dist/models/Base/index.d.ts +49 -0
- package/dist/models/Body/index.d.ts +3 -1
- package/dist/models/Face/constants.d.ts +8 -0
- package/dist/models/Face/index.d.ts +4 -12
- package/dist/models/Face/rotation.d.ts +18 -3
- package/dist/models/Hand/GestureTracking.d.ts +1 -1
- package/dist/models/Hand/HandTracking.d.ts +17 -1
- package/dist/models/Holistic/index.d.ts +49 -0
- package/dist/models/Holistic/result.d.ts +68 -0
- package/dist/models/Segmentation/index.d.ts +2 -0
- package/dist/models/SemanticSegmentation/index.d.ts +31 -0
- package/dist/models/SemanticSegmentation/presets.d.ts +28 -0
- package/dist/models/index.d.ts +2 -0
- package/dist/models/nodeSource.d.ts +9 -0
- package/dist/particles/emission.d.ts +24 -0
- package/dist/particles/eyes.d.ts +24 -0
- package/dist/particles/glsl.d.ts +14 -0
- package/dist/particles/index.d.ts +10 -0
- package/dist/particles/motion.d.ts +42 -0
- package/dist/particles/presets.d.ts +12 -0
- package/dist/particles/ring.d.ts +58 -0
- package/dist/particles/selfTest.d.ts +53 -0
- package/dist/particles/settings.d.ts +127 -0
- package/dist/particles/shapes.d.ts +29 -0
- package/dist/particles/spawner.d.ts +60 -0
- package/dist/particles/system.d.ts +64 -0
- package/dist/particles.cjs +122 -0
- package/dist/particles.js +774 -0
- package/dist/product/ProductDimensions.d.ts +16 -0
- package/dist/product/ProductHotspot.d.ts +16 -0
- package/dist/product/ProductViewer.d.ts +9 -0
- package/dist/product/details.d.ts +53 -0
- package/dist/product/index.d.ts +14 -0
- package/dist/product/loadModelViewer.d.ts +4 -0
- package/dist/product/types.d.ts +71 -0
- package/dist/product/useProductAr.d.ts +37 -0
- package/dist/product/useProductDetails.d.ts +60 -0
- package/dist/product.cjs +1 -0
- package/dist/product.js +414 -0
- package/dist/providers-C8rE26Uf.js +366 -0
- package/dist/providers-DHsrhDI2.cjs +62 -0
- package/dist/quality/XRQualityController.d.ts +25 -0
- package/dist/quality/controller.d.ts +33 -0
- package/dist/quality/index.d.ts +6 -0
- package/dist/quality/types.d.ts +100 -0
- package/dist/quality/useXRQuality.d.ts +28 -0
- package/dist/render/renderPasses.d.ts +8 -0
- package/dist/render/sceneBeforeRender.d.ts +12 -0
- package/dist/{renderGroups-KZk6eRiY.js → renderGroups-B38pUaX2.js} +1 -1
- package/dist/{renderGroups-80H3DpTl.cjs → renderGroups-Cb_4Ar1Q.cjs} +1 -1
- package/dist/renderPasses-B6l8IpJv.js +1290 -0
- package/dist/renderPasses-dqmkft4P.cjs +158 -0
- package/dist/renderState-CJNmj5jz.js +39 -0
- package/dist/renderState-apSfg4eR.cjs +1 -0
- package/dist/scene-object.cjs +1 -1
- package/dist/scene-object.js +2 -2
- package/dist/segmentation-Cb3ouK6Z.js +1758 -0
- package/dist/segmentation-D9pYO6aR.cjs +1 -0
- package/dist/segmentation2d/faceMemory.d.ts +28 -0
- package/dist/segmentation2d/faceRegions.d.ts +24 -0
- package/dist/segmentation2d/index.d.ts +9 -0
- package/dist/segmentation2d/maskUv.d.ts +23 -0
- package/dist/segmentation2d/rasterize.d.ts +14 -0
- package/dist/segmentation2d/types.d.ts +52 -0
- package/dist/select-Ck5LGz-J.cjs +1 -0
- package/dist/select-pYRo_win.js +233 -0
- package/dist/selectors-C4X71aoD.cjs +1 -0
- package/dist/selectors-DmNaKIwE.js +196 -0
- package/dist/session-BrH8G7iJ.cjs +31 -0
- package/dist/session-DgA_z6O1.js +418 -0
- package/dist/settings-BJ7FMBsO.js +111 -0
- package/dist/settings-C63FMBlF.cjs +1 -0
- package/dist/similarityFit-BFqHND2e.cjs +1 -0
- package/dist/similarityFit-Bbz-R8AY.js +91 -0
- package/dist/spring/index.d.ts +2 -0
- package/dist/spring/spring.d.ts +69 -0
- package/dist/spring/swing.d.ts +54 -0
- package/dist/subjects/index.d.ts +2 -0
- package/dist/subjects/select.d.ts +62 -0
- package/dist/subjects/types.d.ts +55 -0
- package/dist/tracking-config/apply.d.ts +57 -0
- package/dist/tracking-config/index.d.ts +7 -0
- package/dist/tracking-config/resolve.d.ts +25 -0
- package/dist/tracking-config/storage.d.ts +8 -0
- package/dist/tracking-config/types.d.ts +106 -0
- package/dist/tracking-config/useXRTrackingConfig.d.ts +38 -0
- package/dist/tracking.cjs +10 -1
- package/dist/tracking.js +1326 -506
- package/dist/trigger-D0Pm9noT.cjs +49 -0
- package/dist/trigger-IQeys0oS.js +2128 -0
- package/dist/types/compositor.d.ts +21 -0
- package/dist/types/face.d.ts +20 -1
- package/dist/types/hand-tracking.d.ts +9 -0
- package/dist/types/holistic.d.ts +121 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/model.d.ts +22 -2
- package/dist/types/nodes.d.ts +47 -3
- package/dist/types/segmentation.d.ts +24 -0
- package/dist/types/session.d.ts +41 -3
- package/dist/updateThrottle-BseecYag.js +4 -0
- package/dist/updateThrottle-Of5Y4SVa.cjs +1 -0
- package/dist/useFaceInfo-BHDNCvsJ.cjs +1 -0
- package/dist/useFaceInfo-J4x7LsqL.js +76 -0
- package/dist/useFaceResultReader-BvEo5REG.js +61 -0
- package/dist/useFaceResultReader-DuaL1KJG.cjs +1 -0
- package/dist/useInstructionHold-DOu-RpCM.js +53 -0
- package/dist/useInstructionHold-DwJY1Alr.cjs +1 -0
- package/dist/useLandmarkPoseFit-Bg-h9BPb.cjs +1 -0
- package/dist/useLandmarkPoseFit-Bmb3h6Mw.js +87 -0
- package/dist/useXRCapabilities-Cr3RzuAW.cjs +1 -0
- package/dist/useXRCapabilities-Cxmlmpbd.js +30 -0
- package/dist/utils/canonicalRigidLandmarks.d.ts +8 -0
- package/dist/utils/fns.d.ts +6 -3
- package/dist/utils/headOccluderFit.d.ts +42 -0
- package/dist/utils/integrity.d.ts +21 -1
- package/dist/utils/resolveNumFaces.d.ts +13 -0
- package/dist/utils/shoulderOccluderFit.d.ts +38 -0
- package/dist/utils/similarityFit.d.ts +23 -0
- package/dist/utils/updateThrottle.d.ts +2 -0
- package/dist/utils/useStableUniforms.d.ts +18 -0
- package/dist/uv-BMFt19bg.cjs +1 -0
- package/dist/{index-ByoNj0QP.js → uv-DJU_XfmN.js} +15 -247
- package/docs/SDK_DOCUMENTATION.md +1 -2
- package/docs/api/adaptive-quality.mdx +104 -0
- package/docs/api/asset-lifecycle.mdx +78 -0
- package/docs/api/body-instructions.mdx +285 -0
- package/docs/api/body-triggers.mdx +234 -0
- package/docs/api/camera-permission.mdx +142 -0
- package/docs/api/coordinate-spaces.mdx +168 -0
- package/docs/api/cross-camera.mdx +89 -0
- package/docs/api/debug-ui-scene-editor.mdx +23 -2
- package/docs/api/diagnostics-calibration.mdx +97 -0
- package/docs/api/external-face-mesh.mdx +231 -0
- package/docs/api/face-actions.mdx +20 -16
- package/docs/api/face-attribute-expression.mdx +1 -1
- package/docs/api/face-binding-anchors.mdx +4 -2
- package/docs/api/face-character.mdx +157 -0
- package/docs/api/face-effects.mdx +9 -0
- package/docs/api/face-expression-controller.mdx +153 -0
- package/docs/api/face-info.mdx +17 -11
- package/docs/api/face-inset.mdx +204 -0
- package/docs/api/face-instructions.mdx +183 -0
- package/docs/api/face-liquify.mdx +196 -0
- package/docs/api/face-mesh.mdx +8 -9
- package/docs/api/face-morph.mdx +117 -0
- package/docs/api/face-painting.mdx +7 -0
- package/docs/api/face-reprojection.mdx +154 -0
- package/docs/api/face-retouching.mdx +18 -10
- package/docs/api/face-swap.mdx +350 -0
- package/docs/api/face-warp-3d.mdx +166 -0
- package/docs/api/faceless.mdx +143 -0
- package/docs/api/gestures.mdx +209 -0
- package/docs/api/hair.mdx +97 -0
- package/docs/api/hand-instructions.mdx +222 -0
- package/docs/api/hand-rig.mdx +535 -0
- package/docs/api/hand-touch.mdx +162 -0
- package/docs/api/head-occluder.mdx +563 -0
- package/docs/api/holistic-tracker.mdx +164 -0
- package/docs/api/instructions.mdx +323 -0
- package/docs/api/iris-tracking.mdx +247 -0
- package/docs/api/made-up-camera.mdx +131 -0
- package/docs/api/makeup-skin-tone.mdx +135 -0
- package/docs/api/makeup.mdx +353 -0
- package/docs/api/multi-subject.mdx +98 -0
- package/docs/api/particles.mdx +155 -0
- package/docs/api/person-cutout.mdx +136 -0
- package/docs/api/pin-to-face-mesh.mdx +274 -0
- package/docs/api/product-ar.mdx +114 -0
- package/docs/api/product-details.mdx +78 -0
- package/docs/api/screen-space-coordinates.mdx +4 -1
- package/docs/api/segmentation-overlay.mdx +301 -0
- package/docs/api/session-lifecycle.mdx +136 -0
- package/docs/api/trackers.mdx +5 -0
- package/docs/api/tracking-config.mdx +108 -0
- package/docs/docs.json +51 -1
- package/docs/examples/lip-shaders.mdx +273 -0
- package/docs/guides/face-atlas-template.svg +1 -0
- package/docs/guides/face-atlas-textures.mdx +186 -0
- package/docs/guides/face-texture-template.svg +1 -0
- package/docs/guides/harness-debug-ui.mdx +4 -4
- package/docs/guides/lip-effect-textures.mdx +368 -0
- package/docs/guides/lip-uv-template.png +0 -0
- package/docs/guides/lip-uv-template.svg +1 -0
- package/docs/guides/makeup-design-textures.mdx +109 -0
- package/docs/introduction.mdx +1 -2
- package/package.json +23 -1
- package/dist/DebuggerUI-B6bP6P9r.cjs +0 -1
- package/dist/DebuggerUI-BjOMr8q_.js +0 -269
- package/dist/FaceMeshRenderer-C5l6VLdO.cjs +0 -155
- package/dist/FaceMeshRenderer-wjAHrJzP.js +0 -1270
- package/dist/FaceRetouch-BkJzoA79.cjs +0 -134
- package/dist/FaceRetouch-DwbKQJAN.js +0 -551
- package/dist/components/FaceWarp3D/FaceWarp3DHead.d.ts +0 -15
- package/dist/components/FaceWarp3D/defaults.d.ts +0 -37
- package/dist/components/FaceWarp3D/warp.d.ts +0 -13
- package/dist/contexts-ByhzppYl.js +0 -663
- package/dist/contexts-Dr62It_K.cjs +0 -1
- package/dist/debug-ui/face-warp-3d/index.d.ts +0 -6
- package/dist/getFaceInfo-C4QpCQIY.js +0 -118
- package/dist/getFaceInfo-fA1bFBub.cjs +0 -1
- package/dist/index-9dlAQAhy.js +0 -1462
- package/dist/index-BjmTe9eM.cjs +0 -1
- package/dist/index-BpEf2BBb.cjs +0 -1
- package/dist/index-CyUUurQT.cjs +0 -1
- package/dist/index-DCiMbxC3.cjs +0 -1
- package/dist/index-DXT3WccE.js +0 -2089
- package/dist/index-DpI-qo5X.cjs +0 -17
- package/dist/index-DyVF4vEW.js +0 -111
- package/dist/index-VJ0SJwmG.js +0 -214
- package/dist/internal-Cq-TEQ5Y.cjs +0 -1
- package/dist/renderLayers-lDtL0_43.cjs +0 -1
- package/dist/renderLayers-zrK2pv5O.js +0 -13
- package/dist/renderPasses-BOoBSr8z.cjs +0 -21
- package/dist/renderPasses-BcquyVtu.js +0 -1500
- package/dist/selectors-B8H97CKA.js +0 -59
- package/dist/selectors-CZLKT2Iv.cjs +0 -1
- package/dist/session-CpkiK5YA.cjs +0 -31
- package/dist/session-DLFN_VII.js +0 -363
- package/dist/useFaceInfo-BJ8-_MOs.cjs +0 -1
- package/dist/useFaceInfo-Dk426LTu.js +0 -62
- package/dist/useFaceResults-CtetsO9M.js +0 -19
- package/dist/useFaceResults-wBJF3zyp.cjs +0 -1
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Gestures"
|
|
3
|
+
description: "Reusable face, hand and body gesture detection with thresholds, hysteresis, confidence, cooldown and lifecycle events."
|
|
4
|
+
sidebarTitle: "Gestures"
|
|
5
|
+
icon: "hand-sparkles"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
`useGesture` turns raw tracking into stable gesture events: pinch, grab,
|
|
9
|
+
open palm, wave, hand raise, nod, head shake, mouth open, smile, blink,
|
|
10
|
+
brow raise, arm raise and T-pose, plus your own. One engine handles the
|
|
11
|
+
thresholds, hysteresis, hold, cooldown, confidence and tracking loss, so
|
|
12
|
+
scenes stop re-implementing them. For full-body poses and moves (jump,
|
|
13
|
+
squat, wave, clap, punch, kick, steps, march) use
|
|
14
|
+
[Body Triggers](/api/body-triggers), which run on the same engine.
|
|
15
|
+
|
|
16
|
+
```tsx
|
|
17
|
+
import { GestureListener, useGesture } from "@vincentt-xr/sdk/tracking";
|
|
18
|
+
|
|
19
|
+
// Hook: React state that changes only when the gesture's state changes.
|
|
20
|
+
const pinch = useGesture("pinch", { hand: "right", onBegin: () => grab(), onEnd: () => drop() });
|
|
21
|
+
if (pinch.active) {
|
|
22
|
+
/* … */
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Declarative: mount and act on events.
|
|
26
|
+
<GestureListener gesture="headNod" onBegin={() => confirm()} />;
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Each gesture acquires the shared face, hand or body model it needs; no
|
|
30
|
+
second detector starts. Mount gesture hooks once above scene switches, like
|
|
31
|
+
any tracker.
|
|
32
|
+
|
|
33
|
+
## Built-in gestures
|
|
34
|
+
|
|
35
|
+
| Name | Kind | Measures | Default enter / exit / hold / cooldown |
|
|
36
|
+
| ---------------------------------- | ---- | -------------------------------------------------------------------------------------- | -------------------------------------- |
|
|
37
|
+
| `mouthOpen` | face | `jawOpen` blendshape | 0.5 / 0.35 / 0 / 0 |
|
|
38
|
+
| `smile` | face | mean of `mouthSmileLeft` / `mouthSmileRight` | 0.4 / 0.25 / 0 / 0 |
|
|
39
|
+
| `blink` | face | both eyes closed (min of the `eyeBlink` blendshapes) | 0.55 / 0.4 / 50 ms / 0 |
|
|
40
|
+
| `browRaise` | face | max of the brow-up blendshapes | 0.45 / 0.3 / 0 / 0 |
|
|
41
|
+
| `headNod` | face | pitch oscillation: 3 turning points ≥ 0.12 rad within 1.5 s | 0.99 / 0.3 / 0 / 600 ms |
|
|
42
|
+
| `headShake` | face | yaw oscillation: 3 turning points ≥ 0.15 rad within 1.5 s | 0.99 / 0.3 / 0 / 600 ms |
|
|
43
|
+
| `pinch` | hand | thumb–index tip gap relative to palm size (1 = touching) | 0.75 / 0.5 / 0 / 0 |
|
|
44
|
+
| `grab` | hand | mean curl of index..pinky (1 = fist) | 0.7 / 0.45 / 0 / 0 |
|
|
45
|
+
| `openPalm` | hand | mean extension of index..pinky | 0.7 / 0.45 / 0 / 0 |
|
|
46
|
+
| `handRaised` | hand | wrist height in the frame (0 bottom, 1 top) | 0.7 / 0.6 / 0 / 0 |
|
|
47
|
+
| `oneFinger` | hand | index extended, middle..pinky curled (pointing) | 0.65 / 0.45 / 0 / 0 |
|
|
48
|
+
| `peaceSign` | hand | index + middle extended, ring + pinky curled | 0.65 / 0.45 / 0 / 0 |
|
|
49
|
+
| `threeFingers` | hand | index + middle + ring extended, pinky curled | 0.65 / 0.45 / 0 / 0 |
|
|
50
|
+
| `fourFingers` | hand | index..pinky extended, thumb tucked | 0.65 / 0.45 / 0 / 0 |
|
|
51
|
+
| `fist` | hand | all four curled and the thumb tucked | 0.65 / 0.45 / 0 / 0 |
|
|
52
|
+
| `palm` | hand | all four extended and the thumb out | 0.65 / 0.45 / 0 / 0 |
|
|
53
|
+
| `thumbUp` / `thumbDown` | hand | thumb out and pointing up / down, fingers curled | 0.6 / 0.4 / 0 / 0 |
|
|
54
|
+
| `wave` | hand | wrist x oscillation: 3 turning points ≥ 0.08 within 1.2 s | 0.99 / 0.3 / 0 / 600 ms |
|
|
55
|
+
| `armRaisedLeft` / `armRaisedRight` | body | the person's own left / right wrist above its shoulder, in shoulder widths, every feed | 0.3 / 0.15 / 0 / 0 |
|
|
56
|
+
| `armRaised` / `bothArmsRaised` | body | either / both wrists above their shoulders | 0.3 / 0.15 / 0 / 0 |
|
|
57
|
+
| `tPose` | body | both arms level and outstretched by a shoulder width | 0.6 / 0.4 / 150 ms / 0 |
|
|
58
|
+
|
|
59
|
+
Hand measures are scale-free (divided by the palm size) and body measures
|
|
60
|
+
are in shoulder widths, so distance from the camera does not change the
|
|
61
|
+
thresholds. `GESTURES[name].description` carries each line of the table.
|
|
62
|
+
|
|
63
|
+
The finger-count signs score the _weakest_ required finger, so a pattern is
|
|
64
|
+
1 only when every finger agrees: `peaceSign` needs index and middle extended
|
|
65
|
+
_and_ ring and pinky curled. `grab` and `openPalm` are the softer, mean-curl
|
|
66
|
+
versions of `fist` and `palm` that ignore the thumb; `measureFingerPattern`
|
|
67
|
+
builds any other pattern (`{ fingers: [true, null, null, false], thumb: true }`
|
|
68
|
+
uses `null` for "either").
|
|
69
|
+
|
|
70
|
+
## The engine contract
|
|
71
|
+
|
|
72
|
+
Every frame the definition measures a `{ value, confidence }` sample (or
|
|
73
|
+
`null` when the tracker has no subject). The detector then applies, in order:
|
|
74
|
+
|
|
75
|
+
1. **Confidence gate**: a sample below `minConfidence` (default 0.5), or no
|
|
76
|
+
sample, is tracking loss.
|
|
77
|
+
2. **Loss grace**: an active gesture survives loss for `lostGraceMs`
|
|
78
|
+
(default 250, the SDK's hold window) with its value frozen, then ends
|
|
79
|
+
with `endReason: "lost"`. An inactive gesture just resets its hold timer.
|
|
80
|
+
3. **Hysteresis**: inactive → `begin` when `value >= enterThreshold`;
|
|
81
|
+
active → `end` (`endReason: "released"`) when `value <= exitThreshold`.
|
|
82
|
+
The band between them is where the gesture is stable; the default exit is
|
|
83
|
+
0.15 below enter.
|
|
84
|
+
4. **Hold**: the value must stay at or above enter for `holdMs` before
|
|
85
|
+
`begin`; a dip resets the clock.
|
|
86
|
+
5. **Cooldown**: after `end`, no `begin` for `cooldownMs`.
|
|
87
|
+
|
|
88
|
+
A `begin` is always followed by at least one `stay` frame, so a one-frame
|
|
89
|
+
gesture still surfaces both edges to an effect that watches `justBegan` and
|
|
90
|
+
`justEnded`.
|
|
91
|
+
|
|
92
|
+
`GestureState`: `active`, `value`, `confidence`, `tracked`, `phase`
|
|
93
|
+
(`begin` | `stay` | `end` | `none`), `justBegan`, `justEnded`, `endReason`
|
|
94
|
+
(`released` | `lost` | null), `startedAtMs`, `durationMs`, `count`. The hook
|
|
95
|
+
publishes a new state only when one of these changes, and `durationMs` is
|
|
96
|
+
excluded from that comparison so an active gesture does not re-render every
|
|
97
|
+
frame: it reads as of the last published change (an ending gesture carries
|
|
98
|
+
its full length). Derive a live duration from `startedAtMs`.
|
|
99
|
+
|
|
100
|
+
Confidence is presence-based for the face, hand and body trackers, which
|
|
101
|
+
report no per-landmark score: 1 while the subject is tracked. A custom
|
|
102
|
+
definition can supply a real score (the holistic result's `confidence`, for
|
|
103
|
+
example).
|
|
104
|
+
|
|
105
|
+
## Options
|
|
106
|
+
|
|
107
|
+
`useGesture(gesture, options)` takes the detector options above plus
|
|
108
|
+
`active`, `faceIndex` / `numFaces` (face), `hand` / `handIndex` (hand),
|
|
109
|
+
`bodyIndex` (body), `targetFps`, and `onBegin` / `onEnd` / `onChange`
|
|
110
|
+
callbacks, which fire from the frame loop with that frame's state.
|
|
111
|
+
|
|
112
|
+
```tsx
|
|
113
|
+
const nod = useGesture("headNod", { faceIndex: 1, numFaces: 2, cooldownMs: 1000 });
|
|
114
|
+
const wave = useGesture("wave", { hand: "left", lostGraceMs: 400 });
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Per-gesture defaults are the ones in the table; `resolveGestureDetectorOptions(overrides, defaults)`
|
|
118
|
+
is what the hook applies.
|
|
119
|
+
|
|
120
|
+
## Custom gestures
|
|
121
|
+
|
|
122
|
+
```ts
|
|
123
|
+
import { defineGesture, HAND_JOINTS } from "@vincentt-xr/sdk/tracking";
|
|
124
|
+
|
|
125
|
+
// A "thumbs up": thumb tip well above the wrist while the other fingers curl.
|
|
126
|
+
const thumbsUp = defineGesture({
|
|
127
|
+
name: "thumbsUp",
|
|
128
|
+
kind: "hand",
|
|
129
|
+
description: "Thumb up, fingers curled.",
|
|
130
|
+
defaults: { enterThreshold: 0.7, exitThreshold: 0.5 },
|
|
131
|
+
measure: (hand) => {
|
|
132
|
+
if (!hand || hand.length < 21) return null;
|
|
133
|
+
const lift = hand[HAND_JOINTS.thumbTip].y - hand[HAND_JOINTS.wrist].y;
|
|
134
|
+
return { value: Math.min(1, Math.max(0, lift / 0.3)), confidence: 1 };
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
const up = useGesture(thumbsUp);
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Temporal gestures add `createMemory` and read it in `measure`; the built-in
|
|
142
|
+
`OscillationTracker` (on `/low-level`) counts direction reversals for nods,
|
|
143
|
+
shakes and waves.
|
|
144
|
+
|
|
145
|
+
**Sides.** `measure(input, memory, nowMs, context)` also gets the feed
|
|
146
|
+
(`GestureContext` `{ mirrored }`). Body input keeps MediaPipe's labels
|
|
147
|
+
(`POSE_JOINTS.leftWrist` is MediaPipe's left: the person's right on the
|
|
148
|
+
mirrored webcam), so read a person's side through the feed:
|
|
149
|
+
|
|
150
|
+
```ts
|
|
151
|
+
import { personSide } from "@vincentt-xr/sdk";
|
|
152
|
+
import { POSE_JOINTS } from "@vincentt-xr/sdk/low-level";
|
|
153
|
+
import { defineGesture } from "@vincentt-xr/sdk/tracking";
|
|
154
|
+
|
|
155
|
+
const leftHandOnHead = defineGesture({
|
|
156
|
+
name: "leftHandOnHead",
|
|
157
|
+
kind: "body",
|
|
158
|
+
description: "The person's own left wrist above the nose.",
|
|
159
|
+
measure: (pose, _memory, _now, context) => {
|
|
160
|
+
if (!pose || pose.length < 33) return null;
|
|
161
|
+
const label = personSide("left", context?.mirrored ?? false);
|
|
162
|
+
const wrist = pose[label === "left" ? POSE_JOINTS.leftWrist : POSE_JOINTS.rightWrist];
|
|
163
|
+
return { value: wrist.y > pose[0].y ? 1 : 0, confidence: 1 };
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Face input is a `FaceInfo`, which carries `mirrored`; hand input is already
|
|
169
|
+
the person's hand (`hand: "left"`).
|
|
170
|
+
|
|
171
|
+
## Relation to the other gesture APIs
|
|
172
|
+
|
|
173
|
+
- `<GestureTrigger>` fires once on a **named static hand pose** from the
|
|
174
|
+
gesture-recognizer model (`victory`, `thumb_up`, …). Use it for "show ✌️ to
|
|
175
|
+
start". `useGesture` measures **continuous and temporal** gestures from the
|
|
176
|
+
landmark trackers with thresholds you can tune.
|
|
177
|
+
- `useFaceAction` is the face-only predecessor with the same hysteresis idea;
|
|
178
|
+
the face gestures here reuse its measurements, and add cooldown,
|
|
179
|
+
confidence, loss grace and the temporal nod / shake.
|
|
180
|
+
- `<BodyTrigger>` / `useBodyTrigger` fire on **full-body poses and moves**
|
|
181
|
+
with this same lifecycle: BodyInstruction's poses (T-pose, hands up, hands
|
|
182
|
+
on hips, arms crossed, squat …) and moves over time (jump, squat reps, wave,
|
|
183
|
+
clap, punch, arm flap, kick, step left / right, march). Left / right are the
|
|
184
|
+
person's own sides on every camera, and leg moves need the whole body in
|
|
185
|
+
view. See [Body Triggers](/api/body-triggers).
|
|
186
|
+
|
|
187
|
+
## Tracking loss and confidence
|
|
188
|
+
|
|
189
|
+
Losing the subject never leaves a gesture stuck: within `lostGraceMs` the
|
|
190
|
+
state holds (value frozen, `tracked: false`), after it the gesture ends with
|
|
191
|
+
`endReason: "lost"` so an effect can clean up differently from a deliberate
|
|
192
|
+
release. A subject that reappears starts cold: hold timers restart and
|
|
193
|
+
temporal memories reset, so a nod half-done before the dropout does not
|
|
194
|
+
complete on return.
|
|
195
|
+
|
|
196
|
+
## Manual validation
|
|
197
|
+
|
|
198
|
+
Run `/gestures`:
|
|
199
|
+
|
|
200
|
+
| Case | Steps | Expect |
|
|
201
|
+
| ------------- | --------------------------------------- | ----------------------------------------------------------------------------------------- |
|
|
202
|
+
| Hysteresis | hold a half pinch around the threshold | Row stays active until the value drops below the exit threshold |
|
|
203
|
+
| Hold | set hold 300 ms on `pinch`, tap quickly | No begin for taps shorter than 300 ms |
|
|
204
|
+
| Cooldown | `headNod`, nod twice quickly | One begin; the second counts after 600 ms |
|
|
205
|
+
| Tracking loss | cover the hand mid-pinch | Row shows "lost" then ends with `lost` after the grace window |
|
|
206
|
+
| Confidence | set min confidence above 1 | Gesture never begins |
|
|
207
|
+
| Body | "Person Fullbody" clip, raise an arm | `armRaised` / side rows activate |
|
|
208
|
+
| Body sides | webcam, raise your real left arm | `armRaisedLeft` activates, not `armRaisedRight`; same on a clip for the person's left arm |
|
|
209
|
+
| Body triggers | see [Body Triggers](/api/body-triggers) | The "body triggers" section lights and counts poses and moves |
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Hair (experimental)"
|
|
3
|
+
description: "Locks of hair that swing with the head: pigtails, ponytails, strands, on spring chains, rooted on the tracked head, with the real hair's mask beside them."
|
|
4
|
+
sidebarTitle: "Hair"
|
|
5
|
+
icon: "wind"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
`HairLock` adds a lock of hair to a tracked head: a pigtail, a ponytail, a strand. It swings as the
|
|
9
|
+
head turns and nods, then settles.
|
|
10
|
+
|
|
11
|
+
- **Procedural.** No model to make: a tapered tube along a chain of springs, its colour, length,
|
|
12
|
+
thickness and swing all props.
|
|
13
|
+
- **On the head.** Rooted in the canonical head frame, in centimetres; a `HeadBinding`'s occluder
|
|
14
|
+
hides the part that passes behind the head.
|
|
15
|
+
- **With the head.** It hangs along the head's own down, so a head tilt tilts it; only motion swings
|
|
16
|
+
it.
|
|
17
|
+
|
|
18
|
+
Experimental: its props and look may change in a later alpha. Import from
|
|
19
|
+
`@vincentt-xr/sdk/face-effects`.
|
|
20
|
+
|
|
21
|
+
## Quick start: pigtails
|
|
22
|
+
|
|
23
|
+
```tsx
|
|
24
|
+
import { VideoBackground, XRScene } from "@vincentt-xr/sdk";
|
|
25
|
+
import { HairLock, HeadBinding } from "@vincentt-xr/sdk/face-effects";
|
|
26
|
+
|
|
27
|
+
<XRScene>
|
|
28
|
+
<VideoBackground />
|
|
29
|
+
<HeadBinding faceIndex={0}>
|
|
30
|
+
<HairLock position={[8, 8.5, -3.5]} direction={[0.55, -0.7, -0.45]} />
|
|
31
|
+
<HairLock position={[-8, 8.5, -3.5]} direction={[-0.55, -0.7, -0.45]} />
|
|
32
|
+
</HeadBinding>
|
|
33
|
+
</XRScene>;
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
A high ponytail, rising over the crown before it falls (it shows from the front):
|
|
37
|
+
|
|
38
|
+
```tsx
|
|
39
|
+
<HairLock position={[0, 12.8, -6.5]} direction={[0, 0.8, -0.6]} length={26} segments={10} />
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Placing a lock
|
|
43
|
+
|
|
44
|
+
The head frame: centimetres, +X MediaPipe's left (the screen's right on an unmirrored feed), +Y up,
|
|
45
|
+
+Z out of the face; the ears are at x ≈ ±8.8, the crown at y ≈ 13.3 (`HEAD_ATTACHMENT_POINTS`).
|
|
46
|
+
`position` is the root, `direction` the way the lock leaves it; from there it curves down toward its
|
|
47
|
+
tip. Put roots on or just outside the head: inside it, the occluder hides them.
|
|
48
|
+
|
|
49
|
+
## Props
|
|
50
|
+
|
|
51
|
+
| Prop | Default | Meaning |
|
|
52
|
+
| ---------------------------------- | ------------- | -------------------------------------------------------------------- |
|
|
53
|
+
| `position` | `[0, 0, 0]` | The root, head centimetres |
|
|
54
|
+
| `direction` | `[0, -1, 0]` | The way it leaves the root (head frame) |
|
|
55
|
+
| `length` | 16 | Length, cm |
|
|
56
|
+
| `segments` | 8 | Joints along it (2–32): more is smoother and floppier |
|
|
57
|
+
| `thickness` | `[1.2, 0.3]` | Radius at the root and the tip, cm (one number: even) |
|
|
58
|
+
| `color` | `"#3b2416"` | Any three.js colour |
|
|
59
|
+
| `frequency`, `damping`, `maxAngle` | 1.4, 0.45, 25 | The swing: swings per second, how fast it settles, degrees per joint |
|
|
60
|
+
| `enabled` | true | False: it hangs still |
|
|
61
|
+
| `faceIndex` | 0 | The face, when it runs its own head fit |
|
|
62
|
+
|
|
63
|
+
Inside a `CanonicalHeadFrame` (a `HeadBinding`) it reuses that fit; anywhere else under a
|
|
64
|
+
`FaceTracker` it runs its own. It is hidden while the face is lost and until the first fit.
|
|
65
|
+
|
|
66
|
+
The swing is the shared spring solver (`SpringChain`, the same as swinging earrings and necklace
|
|
67
|
+
pendants): see [Head occluder → Swinging](/api/head-occluder).
|
|
68
|
+
|
|
69
|
+
## The real hair
|
|
70
|
+
|
|
71
|
+
`useHairMask()` (MediaPipe's hair segmenter) with `SegmentationOverlay label="hair"` shows where the
|
|
72
|
+
person's real hair is, as a 2D layer: see [Segmentation overlay](/api/segmentation-overlay).
|
|
73
|
+
|
|
74
|
+
## Limits
|
|
75
|
+
|
|
76
|
+
- A smooth tube, no strands or texture; flat colour.
|
|
77
|
+
- Locks pass through each other and through the shoulders; only the head occluder hides them.
|
|
78
|
+
- The swing follows the head, not gravity: lying down, the locks still hang along the head.
|
|
79
|
+
|
|
80
|
+
## Example
|
|
81
|
+
|
|
82
|
+
`/hair` in the SDK playground: pigtails, a high ponytail or both; swing on or off; the hair mask;
|
|
83
|
+
and a customise panel (colour, length, thickness, joints, swing) with the JSX to paste. Settings are
|
|
84
|
+
in the URL: `?style=both`, `?mask=1`, `?lock={"color":"#c0392b","lengthScale":1.5}`.
|
|
85
|
+
|
|
86
|
+
## Manual visual test plan
|
|
87
|
+
|
|
88
|
+
Open `/hair` on the webcam.
|
|
89
|
+
|
|
90
|
+
1. **Pigtails**: they hang beside your head; shake your head and nod: they swing and settle within
|
|
91
|
+
a couple of seconds; tilt: they tilt with you.
|
|
92
|
+
2. **Occlusion**: turn your head: the part behind the head hides.
|
|
93
|
+
3. **Ponytail**: it rises over the crown and swings out to the sides as you turn.
|
|
94
|
+
4. **Hair mask**: your real hair turns pink; the locks draw over it.
|
|
95
|
+
5. **Customise**: change colour, length, thickness and swing; the code shown matches what you see;
|
|
96
|
+
reset brings the start back.
|
|
97
|
+
6. **Phone**: about 30 fps on a mid-range phone with both styles on.
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Hand Instructions"
|
|
3
|
+
description: "Ask for a hand gesture with a 3D hint hand and your own copy, detect it on the tracked hands, and complete when it is held."
|
|
4
|
+
sidebarTitle: "Hand Instructions"
|
|
5
|
+
icon: "hand-peace"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
`HandInstruction` asks the person for a hand gesture and waits for it. A looping, translucent 3D hand
|
|
9
|
+
demonstrates the gesture, your copy sits under it, and holding the gesture for `holdMs` completes it.
|
|
10
|
+
There is no card and no progress bar. The pieces underneath are exported too: `useHandGesture` (the
|
|
11
|
+
detection alone) and `HandGestureHint` (the hand alone). For face expressions, see [Face Instructions](/api/face-instructions):
|
|
12
|
+
same layout and feedback.
|
|
13
|
+
|
|
14
|
+
Import from `@vincentt-xr/sdk/instructions`. Everything is customisable: your own gestures, detection
|
|
15
|
+
logic, thresholds, hint look and motion, text style, or a fully custom prompt. See
|
|
16
|
+
[Instructions](/api/instructions).
|
|
17
|
+
|
|
18
|
+
## Quick start
|
|
19
|
+
|
|
20
|
+
```tsx
|
|
21
|
+
import { useLoader } from "@react-three/fiber";
|
|
22
|
+
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";
|
|
23
|
+
import { HandInstruction } from "@vincentt-xr/sdk/instructions";
|
|
24
|
+
|
|
25
|
+
const PeaceToStart = ({ onStart }: { onStart: () => void }) => {
|
|
26
|
+
const hand = useLoader(GLTFLoader, handUrl); // hand-v1.glb, or any hand following the rig contract
|
|
27
|
+
return (
|
|
28
|
+
<HandInstruction
|
|
29
|
+
gesture="peace"
|
|
30
|
+
text="Peace to start"
|
|
31
|
+
model={hand.scene}
|
|
32
|
+
poses={hand.animations}
|
|
33
|
+
onComplete={onStart}
|
|
34
|
+
/>
|
|
35
|
+
);
|
|
36
|
+
};
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Mount it inside `XRScene`. It acquires the hand model itself, so you don't need a `HandTracker`, and
|
|
40
|
+
draws over the AR content in its own screen-space layer (`HAND_INSTRUCTION_RENDER_ORDER` = 2000 and
|
|
41
|
+
up). Detection reads the hand model's world poses. It is separate from `GestureTracker` and its
|
|
42
|
+
MediaPipe gesture names.
|
|
43
|
+
|
|
44
|
+
## `HandInstruction`
|
|
45
|
+
|
|
46
|
+
| Prop | Default | What it does |
|
|
47
|
+
| ---------------- | -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
48
|
+
| `gesture` | — | What to ask for: a name from `HAND_GESTURES` or your own `defineHandGesture(…)`. A new value is a new prompt. |
|
|
49
|
+
| `model` | — | The hint hand: a skinned hand following the [rig contract](/api/hand-rig#the-rig-contract-for-your-own-hand-model). |
|
|
50
|
+
| `poses` | — | The model's authored poses (the GLB's `animations`). Without them the hint is posed procedurally. |
|
|
51
|
+
| `modelHand` | `"right"` | The chirality the model is authored as. |
|
|
52
|
+
| `text` | the gesture's `label` | Your copy, in any language. Long text shrinks to fit. |
|
|
53
|
+
| `doneText` | keep `text` | Copy shown once completed, while it fades out. |
|
|
54
|
+
| `nudgeText` | `"Show your hand to the camera"` | Second line after `nudgeAfterMs` with no hand in view; the hint pulses. `null` turns it off. |
|
|
55
|
+
| `nudgeAfterMs` | `3000` | How long without a hand before the nudge. |
|
|
56
|
+
| `hand` | `"any"` | Which of the person's hands may do it: `"left"`, `"right"` or `"any"`. |
|
|
57
|
+
| `holdMs` | `400` | How long the gesture must be held. |
|
|
58
|
+
| `graceMs` | `150` | Dropouts shorter than this don't restart the hold. |
|
|
59
|
+
| `limits` | — | Classifier thresholds to override for this prompt (see `HAND_SHAPE_LIMITS`). |
|
|
60
|
+
| `size` | `"md"` | `"sm"`, `"md"`, `"lg"`: the hint is 10 / 14 / 19 % of the screen height; or a fraction of it (`0.22`). |
|
|
61
|
+
| `placement` | `"center"` | `"top"`, `"center"` or `"bottom"`. |
|
|
62
|
+
| `offset` | `[0, 0]` | Shift from the placement, in half-screens (`[0.5, 0]` = a quarter screen right). |
|
|
63
|
+
| `orbit` | `35` | The hint's auto orbit, degrees to each side. `0` holds it still. |
|
|
64
|
+
| `look` | `HAND_HINT_LOOK` | The hint's look, merged over the default: ghost tint and opacities, halo, glow, highlight, your own material. |
|
|
65
|
+
| `loop` | `HAND_HINT_LOOP` | The hint's loop: `seconds`, `hold`, `from`, `easing`, finger `stagger`. |
|
|
66
|
+
| `highlight` | picked from the gesture | The digits drawn brighter, or `false`. |
|
|
67
|
+
| `color` | `"#ffffff"` | Text colour. The text has a soft dark shadow so it reads on any camera feed. |
|
|
68
|
+
| `textStyle` … | — | `textStyle`, `nudgeTextStyle`, `renderText`, `motion`, `layout`: restyle the text, timings and proportions. See [Instructions](/api/instructions). |
|
|
69
|
+
| `onComplete` | — | Called once when the gesture is held long enough. |
|
|
70
|
+
| `onStatusChange` | — | Called once with the first status, then on every change (see below). |
|
|
71
|
+
| `hideOnComplete` | `true` | Fade out after completing. A small pop and a white ring play either way. |
|
|
72
|
+
| `active` | `true` | `false` hides it and pauses detection. |
|
|
73
|
+
|
|
74
|
+
`onStatusChange` reports a `HandInstructionStatus`:
|
|
75
|
+
|
|
76
|
+
- `"waiting"`: no usable hand in view.
|
|
77
|
+
- `"detected"`: a hand in view, not doing the gesture.
|
|
78
|
+
- `"holding"`: doing it; the hold is running.
|
|
79
|
+
- `"done"`: completed.
|
|
80
|
+
|
|
81
|
+
Use it for app logic or to announce progress to a screen reader. The instruction is drawn in WebGL, so
|
|
82
|
+
it is invisible to assistive technology on its own.
|
|
83
|
+
|
|
84
|
+
## Gestures
|
|
85
|
+
|
|
86
|
+
| Name | Default copy | Recognised when |
|
|
87
|
+
| -------------- | ----------------------- | --------------------------------------------------------- |
|
|
88
|
+
| `palm` | Show your palm | All five digits up. |
|
|
89
|
+
| `fist` | Make a fist | No digit up. |
|
|
90
|
+
| `peace` | Show a peace sign | Index and middle up, ring and pinky folded (thumb any). |
|
|
91
|
+
| `thumbUp` | Give a thumbs up | Thumb up and pointing up on screen, fingers folded. |
|
|
92
|
+
| `thumbDown` | Give a thumbs down | Thumb up and pointing down on screen, fingers folded. |
|
|
93
|
+
| `point` | Point your index finger | Index up, the other fingers folded (thumb any). |
|
|
94
|
+
| `one` … `five` | Show 1 finger … | Exactly that many digits up, thumb included, any of them. |
|
|
95
|
+
| `rock` | Rock on | Index and pinky up, middle and ring folded. |
|
|
96
|
+
| `loveYou` | Sign I love you | Thumb, index and pinky up, middle and ring folded. |
|
|
97
|
+
| `callMe` | Call me | Thumb and pinky up, the rest folded. |
|
|
98
|
+
| `ok` | Make an OK sign | Thumb and index tips touching, middle, ring and pinky up. |
|
|
99
|
+
|
|
100
|
+
Several can match at once: a peace sign is also `two`. There is deliberately no gesture for the
|
|
101
|
+
middle finger alone.
|
|
102
|
+
|
|
103
|
+
## Detection only: `useHandGesture`
|
|
104
|
+
|
|
105
|
+
```tsx
|
|
106
|
+
import { useHandGesture } from "@vincentt-xr/sdk/instructions";
|
|
107
|
+
|
|
108
|
+
const { status, holdRef, matchedRef, shapesRef, isInView, reset } = useHandGesture("thumbUp", {
|
|
109
|
+
hand: "any",
|
|
110
|
+
holdMs: 400,
|
|
111
|
+
limits: { thumbReach: 0.9 }, // optional, this detector only
|
|
112
|
+
onComplete: () => unlock(),
|
|
113
|
+
});
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
`status` (`"waiting"` → `"holding"` → `"done"`) re-renders only when it changes. Read
|
|
117
|
+
`holdRef.current.progress` (0..1), `matchedRef.current` (matched this frame) and
|
|
118
|
+
`shapesRef.current.left` / `.right` (`HandShape`) inside `useFrame`, not in render. `reset()` asks
|
|
119
|
+
again. The result is an `InstructionDetector`, so it can drive a custom `<Instruction>`.
|
|
120
|
+
|
|
121
|
+
A rule, a match function or a definition works anywhere a gesture name does:
|
|
122
|
+
|
|
123
|
+
```tsx
|
|
124
|
+
useHandGesture({ digits: { index: true, pinky: true, middle: false }, thumbIndexTouch: false });
|
|
125
|
+
useHandGesture((shape, side) => side === "left" && shape.curl.index > 0.8);
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
A `HandGestureRule` has these fields:
|
|
129
|
+
|
|
130
|
+
- `digits`: per digit, `true` = up, `false` = folded, omitted = any.
|
|
131
|
+
- `count`: the exact number of digits up.
|
|
132
|
+
- `thumbDirection`: `"up"` or `"down"`.
|
|
133
|
+
- `thumbIndexTouch`: whether the thumb and index tips touch.
|
|
134
|
+
|
|
135
|
+
The classifier is pure. `analyzeHandShape(pose.world)` returns a `HandShape` with:
|
|
136
|
+
|
|
137
|
+
- `extended` and `curl` (0..1) per digit;
|
|
138
|
+
- `count`;
|
|
139
|
+
- `thumbDirection`, relative to the screen;
|
|
140
|
+
- `thumbIndexTouch`.
|
|
141
|
+
|
|
142
|
+
`matchHandGesture(shape, nameOrRule)` tests one gesture; `matchingHandGestures(shape)` lists every
|
|
143
|
+
name the shape satisfies. The default thresholds are `HAND_SHAPE_LIMITS` (read-only); override them per
|
|
144
|
+
call with `analyzeHandShape(world, { limits })` or the hook's `limits`.
|
|
145
|
+
|
|
146
|
+
## The hint hand: `HandGestureHint`
|
|
147
|
+
|
|
148
|
+
```tsx
|
|
149
|
+
<HandGestureHint gesture="ok" model={hand.scene} poses={hand.animations} height={0.4} />
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
The hand alone, for your own layout. It is fitted to `height` (parent units) and loops from a relaxed
|
|
153
|
+
hand into the pose and back. The default look:
|
|
154
|
+
|
|
155
|
+
- **Ghost:** translucent white, with a brighter rim.
|
|
156
|
+
- **Highlight:** the gesture's key digits are brighter. Peace lights the index and middle, OK the
|
|
157
|
+
thumb and index, thumbs up the thumb. `highlight` overrides with a digit list or `false`.
|
|
158
|
+
- **Halo:** a soft dark edge so it reads on light backgrounds (`look.halo`).
|
|
159
|
+
- **Glow:** a soft white light from behind the hand, brightening as the gesture forms (`look.glow`).
|
|
160
|
+
It is a separate disc behind the hand, so it never shows as inner layers.
|
|
161
|
+
- **Motion:** the fingers close one after another, pinky first (`loop`).
|
|
162
|
+
- **Orbit:** a slow ±35° side-to-side turn (`orbit`, `orbitSeconds`).
|
|
163
|
+
|
|
164
|
+
`look` is merged over `HAND_HINT_LOOK` (`false` turns a layer off; `look.material` replaces the
|
|
165
|
+
ghost). `showHand` picks the chirality to show; the other one is the model
|
|
166
|
+
mirrored.
|
|
167
|
+
|
|
168
|
+
**Authored poses.** Each gesture's `hint.clip` names a single-key animation clip on the model.
|
|
169
|
+
`hand-v1.glb` ships 11, posed in Blender: `palm`, `fist`, `peace`, `one`, `three`, `four`, `rock`,
|
|
170
|
+
`loveYou`, `callMe`, `thumbUp`, `ok`. `two`, `point`, `five` and `thumbDown` reuse them. Pass the
|
|
171
|
+
GLB's `animations` as `poses`. A model without the clip is posed procedurally from the same
|
|
172
|
+
`HandHintPose`.
|
|
173
|
+
|
|
174
|
+
**The view** is part of the hint too:
|
|
175
|
+
|
|
176
|
+
- `yaw` turns the hand about the fingers' axis: 0 shows the palm (most gestures, including peace,
|
|
177
|
+
point and the counts), 180 the back of the hand (rock), 124 the thumb side (OK).
|
|
178
|
+
- `roll` turns it in the screen plane: call me is held sideways, thumb up.
|
|
179
|
+
- `aimThumb` turns a thumbs up or down until the thumb points that way.
|
|
180
|
+
|
|
181
|
+
Every hint pose, authored and procedural, is tested to be recognised by the detector as its own
|
|
182
|
+
gesture.
|
|
183
|
+
|
|
184
|
+
The pieces underneath, also in `/instructions`:
|
|
185
|
+
|
|
186
|
+
- `applyHandHintPose(binding, hint, amount, clips)`: `amount` 0..1, or one per digit
|
|
187
|
+
(`HandHintAmount`).
|
|
188
|
+
- `readHandClipPose(clip)`.
|
|
189
|
+
- The hold timing: `GESTURE_HOLD_DEFAULT_MS`, `GESTURE_HOLD_GRACE_MS`, `createGestureHoldState`,
|
|
190
|
+
`stepGestureHold`.
|
|
191
|
+
|
|
192
|
+
## Example
|
|
193
|
+
|
|
194
|
+
`/hand-instructions` covers:
|
|
195
|
+
|
|
196
|
+
- every gesture as a chip, and a sequence mode that moves to the next gesture when one completes;
|
|
197
|
+
- text, nudge, size, placement and hold-time controls;
|
|
198
|
+
- a live readout of the status and what the classifier sees on each hand: digits up, count, thumb
|
|
199
|
+
direction, touch, matching gestures.
|
|
200
|
+
|
|
201
|
+
Local clips in the git-ignored `example/src/assets/media/local/` are listed first.
|
|
202
|
+
|
|
203
|
+
## Manual visual test plan
|
|
204
|
+
|
|
205
|
+
Open `/hand-instructions`.
|
|
206
|
+
|
|
207
|
+
1. **Every hint reads**: step through all 15 chips. Each hand forms its gesture, at its view: the palm
|
|
208
|
+
for peace, point and the counts, the back of the hand for rock, thumb side for OK, sideways for call me, thumb vertical for
|
|
209
|
+
thumbs up / down. The key digits are brighter, and it stays inside its slot through the orbit.
|
|
210
|
+
2. **Looks**: the ghost is translucent with no inner fingers showing through, the halo separates it
|
|
211
|
+
from a white shirt, and the wrist fades out.
|
|
212
|
+
3. **Motion**: the fingers close pinky first and settle. The hand swings about 35° each way.
|
|
213
|
+
4. **Detection**: on the webcam, make each gesture with either hand. The readout shows `holding`,
|
|
214
|
+
then `done`. A wrong gesture stays `detected`. Peace also lists `two`.
|
|
215
|
+
5. **Completion**: on done, a small pop and a white ring play. With sequence on, it fades out and the
|
|
216
|
+
next gesture comes in.
|
|
217
|
+
6. **Nudge**: hide your hands for 3 s. The second line fades in and the hint pulses. Show a hand and
|
|
218
|
+
it fades out. With the nudge off it never appears.
|
|
219
|
+
7. **Copy and layout**: type custom text (long text shrinks to fit), switch the sizes and top /
|
|
220
|
+
center / bottom placement. Nothing overlaps the screen edge.
|
|
221
|
+
8. **Mirroring**: on the mirrored webcam the hint shows the hand you'd use, mirrored to match the
|
|
222
|
+
screen, with the thumb on the correct side.
|