@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,285 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Body Instructions"
|
|
3
|
+
description: "Ask for a body pose (arms, thumbs, squat, lean, one leg, star) with a 3D hint figure and your own copy, detect it from the pose landmarks, and complete when it is held."
|
|
4
|
+
sidebarTitle: "Body Instructions"
|
|
5
|
+
icon: "person"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
`BodyInstruction` asks the person for a body pose and waits for it. A translucent 3D figure loops from
|
|
9
|
+
standing into the pose, your copy sits under it, and holding the pose for `holdMs` completes it. It is
|
|
10
|
+
the body member of the instruction family, with the same layout and feedback as
|
|
11
|
+
[Hand Instructions](/api/hand-instructions) and [Face Instructions](/api/face-instructions). The
|
|
12
|
+
pieces underneath are exported too: `useBodyPose` (the detection alone) and `BodyPoseHint` (the figure
|
|
13
|
+
alone).
|
|
14
|
+
|
|
15
|
+
Import from `@vincentt-xr/sdk/instructions`. Everything is customisable: your own poses and
|
|
16
|
+
figure, detection logic, thresholds, hint look and motion, text style, or a fully custom prompt. See
|
|
17
|
+
[Instructions](/api/instructions).
|
|
18
|
+
|
|
19
|
+
## Quick start
|
|
20
|
+
|
|
21
|
+
```tsx
|
|
22
|
+
import { useLoader } from "@react-three/fiber";
|
|
23
|
+
import { MeshoptDecoder } from "three/examples/jsm/libs/meshopt_decoder.module.js";
|
|
24
|
+
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";
|
|
25
|
+
import { BodyInstruction } from "@vincentt-xr/sdk/instructions";
|
|
26
|
+
|
|
27
|
+
const ArmsUpToStart = ({ onStart }: { onStart: () => void }) => {
|
|
28
|
+
// A Mixamo-rig figure with one clip per pose plus "idle", meshopt-compressed.
|
|
29
|
+
const figure = useLoader(GLTFLoader, figureUrl, (loader) =>
|
|
30
|
+
loader.setMeshoptDecoder(MeshoptDecoder),
|
|
31
|
+
);
|
|
32
|
+
return (
|
|
33
|
+
<BodyInstruction
|
|
34
|
+
pose="hooray"
|
|
35
|
+
text="Arms up to start"
|
|
36
|
+
model={figure.scene}
|
|
37
|
+
poses={figure.animations}
|
|
38
|
+
onComplete={onStart}
|
|
39
|
+
/>
|
|
40
|
+
);
|
|
41
|
+
};
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Mount it inside `XRScene`. It acquires the body model itself, so you don't need a `BodyTracker`, and
|
|
45
|
+
draws over the AR content in its own screen-space layer (`BODY_INSTRUCTION_RENDER_ORDER` =
|
|
46
|
+
`INSTRUCTION_RENDER_ORDER` = 2000 and up).
|
|
47
|
+
|
|
48
|
+
**Left and right** are the person's own sides on every camera. MediaPipe's pose labels follow the image
|
|
49
|
+
as given, so on the mirrored webcam they name the opposite side; the detector swaps them. On that feed
|
|
50
|
+
the figure is also drawn mirrored, so "raise your left arm" shows the raised arm on the same screen side
|
|
51
|
+
as the person's real left arm.
|
|
52
|
+
|
|
53
|
+
## `BodyInstruction`
|
|
54
|
+
|
|
55
|
+
| Prop | Default | What it does |
|
|
56
|
+
| ---------------- | ------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
|
|
57
|
+
| `pose` | — | What to ask for: a `BODY_POSES` name or your own `defineBodyPose(…)`. A new value is a new prompt. |
|
|
58
|
+
| `model` | — | The hint figure: a skinned Mixamo-rig character facing +Z. |
|
|
59
|
+
| `poses` | — | The figure's clips: one per pose (named like `BODY_POSES[name].hint.clip`) plus `idle`. |
|
|
60
|
+
| `idleClip` | `"idle"` | The rest clip the hint loops from. |
|
|
61
|
+
| `text` | the pose's `label` | Your copy, in any language. Long text shrinks to fit. |
|
|
62
|
+
| `doneText` | keep `text` | Copy shown once completed, while it fades out. |
|
|
63
|
+
| `nudgeText` | `"Step back so your upper body is in view"` | Second line after `nudgeAfterMs` out of view. Leg poses default to "…whole body…". `null` turns it off. |
|
|
64
|
+
| `nudgeAfterMs` | `3000` | How long before the nudge. |
|
|
65
|
+
| `bodyIndex` | `0` | Which detected body to read. |
|
|
66
|
+
| `holdMs` | `400` | How long the pose must be held. |
|
|
67
|
+
| `graceMs` | `150` | Dropouts shorter than this don't restart the hold. |
|
|
68
|
+
| `limits` | — | Classifier thresholds to override for this prompt (see `BODY_SHAPE_LIMITS`). |
|
|
69
|
+
| `size` | `"md"` | `"sm"`, `"md"`, `"lg"`, or a fraction of the screen height. |
|
|
70
|
+
| `symbolAspect` | `2.1` | The figure's slot height × the hand / face slot (it stands tall). |
|
|
71
|
+
| `placement` | `"center"` | `"top"`, `"center"` or `"bottom"`. |
|
|
72
|
+
| `offset` | `[0, 0]` | Shift from the placement, in half-screens. |
|
|
73
|
+
| `orbit` | `25` | The figure's auto orbit, degrees to each side. `0` holds it still. |
|
|
74
|
+
| `look` | `BODY_HINT_LOOK` | The figure's look, merged over the default: ghost, part tints, halo, glow, highlight, material. |
|
|
75
|
+
| `loop` | `BODY_HINT_LOOP` | The figure's loop: `seconds`, `hold`, `from`, `easing`. |
|
|
76
|
+
| `boneSide` | Mixamo names | Which arm a bone belongs to, for the highlight (another rig's naming). |
|
|
77
|
+
| `legBoneSide` | Mixamo names | Which leg a bone belongs to, for the highlight. |
|
|
78
|
+
| `color` | `"#ffffff"` | Text colour, with a soft dark shadow so it reads on any camera feed. |
|
|
79
|
+
| `textStyle` … | — | `textStyle`, `nudgeTextStyle`, `renderText`, `motion`, `layout`: see [Instructions](/api/instructions). |
|
|
80
|
+
| `onComplete` | — | Called once when the pose is held long enough. |
|
|
81
|
+
| `onStatusChange` | — | Called once with the first status, then on every change (`"waiting"` = not in view). |
|
|
82
|
+
| `hideOnComplete` | `true` | Fade out after completing. A small pop and a white ring play either way. |
|
|
83
|
+
| `active` | `true` | `false` hides it and pauses detection. |
|
|
84
|
+
|
|
85
|
+
## Poses
|
|
86
|
+
|
|
87
|
+
| Name | Default copy | Recognised when |
|
|
88
|
+
| -------------- | -------------------- | ------------------------------------------------------- |
|
|
89
|
+
| `hooray` | Raise both arms | both arms `raised` |
|
|
90
|
+
| `handsUp` | Hands up | alias of `hooray` (the same rule and hint) |
|
|
91
|
+
| `tPose` | Make a T-pose | both arms `out` |
|
|
92
|
+
| `raiseLeft` | Raise your left arm | left arm `raised`; right arm `down`, `other` or `onHip` |
|
|
93
|
+
| `raiseRight` | Raise your right arm | right arm `raised`; left arm `down`, `other` or `onHip` |
|
|
94
|
+
| `handsOnHips` | Hands on your hips | both arms `onHip` |
|
|
95
|
+
| `armsCrossed` | Cross your arms | both arms `crossed` |
|
|
96
|
+
| `handsOnHead` | Hands on your head | both arms `onHead` |
|
|
97
|
+
| `thumbUp` | Give a thumbs up | either arm `thumbUp` (the hint shows the right hand) |
|
|
98
|
+
| `bothThumbsUp` | Two thumbs up | both arms `thumbUp` |
|
|
99
|
+
| `salute` | Salute | right arm `onHead`; left arm `down`, `other` or `onHip` |
|
|
100
|
+
|
|
101
|
+
| `squat` | Squat down | hips low over both feet (`squat`) |
|
|
102
|
+
| `leanLeft` | Lean to your left | the torso tilts toward your left (`lean: "left"`) |
|
|
103
|
+
| `leanRight` | Lean to your right | the torso tilts toward your right (`lean: "right"`) |
|
|
104
|
+
| `oneLeg` | Stand on one leg | one leg `raised`, the other `down` (either leg) |
|
|
105
|
+
| `star` | Make a star | feet spread wide and both arms `raised` or `out` |
|
|
106
|
+
|
|
107
|
+
Two thumbs up also answers a `thumbUp` prompt, a star answers `hooray`, and `handsUp` and `hooray`
|
|
108
|
+
answer each other. A salute and one hand on the
|
|
109
|
+
head look the same to the pose model. `raiseLeft` / `raiseRight` need you upright, so a side bend
|
|
110
|
+
with the far arm over the head is a lean, not a raise.
|
|
111
|
+
|
|
112
|
+
**The leg poses need the whole body in view**: hips, knees and ankles (`BODY_POSES[name].view` is
|
|
113
|
+
`"full"`). For them `BodyInstruction` waits for the whole body and nudges with
|
|
114
|
+
`BODY_INSTRUCTION_FULL_NUDGE_TEXT`, "Step back so your whole body is in view".
|
|
115
|
+
|
|
116
|
+
Each arm gets one state, measured in shoulder widths so distance from the camera doesn't matter:
|
|
117
|
+
|
|
118
|
+
- **`raised`**: the wrist is at least 0.75 shoulder widths above its shoulder, at any angle. A real full
|
|
119
|
+
raise leans forward, keeps a soft elbow and turns the arm outward; none of that is required to be
|
|
120
|
+
straight.
|
|
121
|
+
- **`out`**: level with the shoulder (within 0.5), reaching at least 0.9 out, elbow nearly straight.
|
|
122
|
+
- **`onHead`**: the wrist is up near the nose (not reaching far above it), elbow bent.
|
|
123
|
+
- **`onHip`**: the wrist is at the waist, above the hip line, with the elbow well out. Hands in front
|
|
124
|
+
pockets sit on the hip line with the elbows in, so they don't count.
|
|
125
|
+
- **`thumbUp`**: a fist held up in front of its own side (elbow bent, the wrist between belly and
|
|
126
|
+
shoulder height), the thumb point clearly above the index and pinky knuckles and the wrist. It reads
|
|
127
|
+
MediaPipe's hand points on the pose (thumb, index, pinky), which must be visible.
|
|
128
|
+
- **`crossed`**: the wrist is past the body's midline at chest or belly height.
|
|
129
|
+
- **`down`**: the wrist is well below the shoulder.
|
|
130
|
+
- **`other`**: anything else, such as a half raise or a reach forward.
|
|
131
|
+
|
|
132
|
+
With the lower body in view, each leg gets a state too, and the body some whole-body readings:
|
|
133
|
+
|
|
134
|
+
- **Leg `raised`**: the knee lifted to near hip height (no more than 0.6 below it) and the foot at least
|
|
135
|
+
0.4 above the other one, off the ground.
|
|
136
|
+
- **Leg `down`**: standing, the knee at least 0.8 below the hip. Anything else is `other` (a squat's
|
|
137
|
+
bent knees, a step).
|
|
138
|
+
- **`squat`**: the hips at most 1.65 shoulder widths above the ankles, with both feet down. Standing
|
|
139
|
+
reads about 2.2, a deep squat about 1.1, so a half squat counts.
|
|
140
|
+
- **`lean`**: the hips → shoulders line tilted at least 8° from upright, toward the person's own left
|
|
141
|
+
or right on either camera. It needs only the hips and shoulders.
|
|
142
|
+
- **`wideStance`**: the ankles at least 1.4 shoulder widths apart, both feet down. Standing reads
|
|
143
|
+
about 0.5.
|
|
144
|
+
|
|
145
|
+
The default thresholds are `BODY_SHAPE_LIMITS` (read-only); override them per call with
|
|
146
|
+
`analyzeBodyShape(landmarks, { limits })` or the `limits` prop / option.
|
|
147
|
+
|
|
148
|
+
## Detection only: `useBodyPose`
|
|
149
|
+
|
|
150
|
+
```tsx
|
|
151
|
+
import { useBodyPose } from "@vincentt-xr/sdk/instructions";
|
|
152
|
+
|
|
153
|
+
const { status, holdRef, matchedRef, shapeRef, isInView, reset } = useBodyPose("raiseRight", {
|
|
154
|
+
holdMs: 400,
|
|
155
|
+
onComplete: () => next(),
|
|
156
|
+
});
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
`status` (`"waiting"` → `"holding"` → `"done"`) re-renders only when it changes. Read
|
|
160
|
+
`holdRef.current.progress` and `shapeRef.current` (the latest `BodyShape`, or `null`) in `useFrame`. A
|
|
161
|
+
pose only counts while the upper body (nose, shoulders, elbows, wrists) is visible.
|
|
162
|
+
|
|
163
|
+
The result is an `InstructionDetector`, so it can drive a custom `<Instruction>`. A rule names a
|
|
164
|
+
state per arm or leg (an array accepts any of them), plus `lean` (`"left"`, `"right"` or `"none"`),
|
|
165
|
+
`squat` and `wideStance`; `anyOf` passes when one of its rules does. A rule that names the legs,
|
|
166
|
+
`squat` or `wideStance` needs the lower body in view. A definition with `view: "full"` makes
|
|
167
|
+
`isInView` wait for the whole body; that sets the `"waiting"` status and the nudge, while completion
|
|
168
|
+
needs only the rule. The leans read just the hips and shoulders, so a waist-up lean still completes,
|
|
169
|
+
but their prompts ask for the whole body. A match function reads the measurements; a definition works too:
|
|
170
|
+
|
|
171
|
+
```tsx
|
|
172
|
+
useBodyPose({ arms: { left: "raised", right: ["down", "onHip"] } });
|
|
173
|
+
useBodyPose({ squat: true, arms: { left: "out", right: "out" } }); // squat with arms out
|
|
174
|
+
useBodyPose({ legs: { left: "raised" }, lean: "none" }); // left knee up, standing tall
|
|
175
|
+
useBodyPose({ anyOf: [{ arms: { left: "out" } }, { arms: { right: "out" } }] }); // either arm out
|
|
176
|
+
useBodyPose((shape) => shape.arms.left.up > 1.2); // reach really high
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
The classifier is pure: `analyzeBodyShape(landmarks, { mirrored, visibility, aspect })` reads the
|
|
180
|
+
body tracker's `getLandmarks2D()` points and returns a `BodyShape`. Pass `aspect`, the tracked frame's
|
|
181
|
+
width ÷ height (`useXRFeedAspect()` from `@vincentt-xr/sdk/low-level`): tracker x and y each span the
|
|
182
|
+
frame, so the landmarks are first scaled to square units (`squareLandmarks`) and every pose reads
|
|
183
|
+
the same on portrait, landscape and square frames. Without it (default 1) a 9:16 portrait frame reads
|
|
184
|
+
a person standing upright as a squat. `useBodyPose` and `BodyInstruction` pass it themselves. The
|
|
185
|
+
shape:
|
|
186
|
+
|
|
187
|
+
- `arms.left` and `arms.right`, each with `state`, `up`, `out`, `bend`, `elbowOut`, `aboveHip` and
|
|
188
|
+
`thumbLift`;
|
|
189
|
+
- `legs.left` and `legs.right` (or `null` without the lower body), each with `state`, `kneeLift`,
|
|
190
|
+
`ankleLift` and `bend`;
|
|
191
|
+
- `lean` (degrees, + toward the person's left) and `leanSide`, `hipHeight`, `stance`, `squat` and
|
|
192
|
+
`wideStance`;
|
|
193
|
+
- `shoulderWidth`;
|
|
194
|
+
- `upperBodyVisible`, `hipsVisible` and `lowerBodyVisible`.
|
|
195
|
+
|
|
196
|
+
`matchBodyPose(shape, nameOrRule)` tests one pose; `matchingBodyPoses(shape)` lists every pose that
|
|
197
|
+
matches. The body tracker's node now also exposes `getVisibility(bodyIndex)`, MediaPipe's per-landmark
|
|
198
|
+
visibility from 0 to 1.
|
|
199
|
+
|
|
200
|
+
## The hint figure: `BodyPoseHint`
|
|
201
|
+
|
|
202
|
+
```tsx
|
|
203
|
+
<BodyPoseHint pose="tPose" model={figure.scene} poses={figure.animations} height={0.8} />
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
The figure alone, fitted to `height` over its loop and orbit. It blends every bone from the `idle` clip
|
|
207
|
+
into the pose's clip and back. The default look:
|
|
208
|
+
|
|
209
|
+
- **Ghost:** translucent white, with the material named `joints` tinted blue-grey.
|
|
210
|
+
- **Highlight:** the arms and legs that make the pose are drawn brighter (`highlight`).
|
|
211
|
+
- **Whole-body moves:** a clip can move the hips as well as turn the bones (`Hips.position`), so the
|
|
212
|
+
squat sinks and the star widens its stance.
|
|
213
|
+
- **Halo and glow:** a soft dark halo (`look.halo`) and a soft light from behind (`look.glow`).
|
|
214
|
+
- **Orbit:** a slow ±25° side-to-side turn (`orbit`, `orbitSeconds`).
|
|
215
|
+
- **Mirroring:** `mirrored` draws it like a mirror image; `BodyInstruction` passes the session's
|
|
216
|
+
mirroring.
|
|
217
|
+
|
|
218
|
+
`look` is merged over `BODY_HINT_LOOK` and `loop` over `BODY_HINT_LOOP`. Any skinned character facing
|
|
219
|
+
+Z works: name its rest clip with `idleClip`, its pose clips in your definitions' `hint.clip`, and,
|
|
220
|
+
if it isn't a Mixamo rig, map its arm bones with `boneSide` for the highlight. A missing clip leaves
|
|
221
|
+
the figure in its rest pose and logs a warning once, naming the clip and the clips the model has.
|
|
222
|
+
Models without vertex colours, like Y Bot, are handled automatically.
|
|
223
|
+
|
|
224
|
+
## The example figure
|
|
225
|
+
|
|
226
|
+
`ybot.glb`:
|
|
227
|
+
|
|
228
|
+
- **Character:** "Y Bot" by Mixamo (Adobe), from the Sketchfab model "Y Bot" by Moises D Sanabria
|
|
229
|
+
(CC BY 4.0), using Kiev's (KinderKiev) upload "Y Bot from mixamo".
|
|
230
|
+
- **Edits:** cleaned up to centimetres, with plain Mixamo bone names and the non-hand parts reduced.
|
|
231
|
+
- **Poses:** authored in Blender (`assets-src/bodies/`).
|
|
232
|
+
- **Size:** ~410 KB with meshopt (~155 KB gzipped; most of the growth is per-clip animation metadata,
|
|
233
|
+
which gzips well).
|
|
234
|
+
|
|
235
|
+
It keeps all 68 bones, including every finger joint and fingertip. The finger chain maps one-to-one onto
|
|
236
|
+
MediaPipe's 21 hand landmarks, so a future driver can pose its fingers from hand tracking; the mapping
|
|
237
|
+
is in `assets-src/bodies/README.md`.
|
|
238
|
+
|
|
239
|
+
<Note>
|
|
240
|
+
The GLB lives only in the example app. Adobe's Mixamo terms allow Mixamo characters inside your
|
|
241
|
+
projects but not redistributing the raw asset, and the npm package ships only `dist/` and
|
|
242
|
+
`GROUNDING.md`. Load your own figure.
|
|
243
|
+
</Note>
|
|
244
|
+
|
|
245
|
+
## Example
|
|
246
|
+
|
|
247
|
+
`/body-instructions` covers:
|
|
248
|
+
|
|
249
|
+
- every pose as a chip, and a sequence mode that moves to the next pose when one completes;
|
|
250
|
+
- text, nudge, size, placement and hold-time controls;
|
|
251
|
+
- a live readout of each arm's state and measurements, whether the upper body and hips are in view, and
|
|
252
|
+
the matching poses.
|
|
253
|
+
|
|
254
|
+
Local clips in the git-ignored `example/src/assets/media/local/` are listed first.
|
|
255
|
+
|
|
256
|
+
## Manual visual test plan
|
|
257
|
+
|
|
258
|
+
Open `/body-instructions`.
|
|
259
|
+
|
|
260
|
+
1. **Every hint reads**: step through the fifteen chips. The figure moves from standing into each pose
|
|
261
|
+
and back, the posing arms brighter. Raised arms turn outward (palms toward the head). Hands sit on
|
|
262
|
+
the waist, on the head, or tuck around the other arm, and the fingers rest naturally. The thumbs-up
|
|
263
|
+
fists stand clear of the body with the thumb straight up; the salute's flat hand is at the brow.
|
|
264
|
+
The squat sinks with flat feet, the leans bend toward the named side (on the mirrored webcam, the
|
|
265
|
+
same screen side as yours), one leg lifts the right knee, and the star spreads arms and legs; the
|
|
266
|
+
legs that make the pose are brighter.
|
|
267
|
+
2. **Size and look**: the figure fills a tall slot above the copy and stays inside it through the
|
|
268
|
+
orbit. The ghost is white (not grey), with tinted joints, a halo and a back-glow.
|
|
269
|
+
3. **Detection on the webcam**: stand back until the readout says upper body in view, then make each
|
|
270
|
+
pose. The readout's matches list it and the status goes `holding` → `done`. Hands in pockets don't
|
|
271
|
+
count as hands on hips, and a half raise isn't a raise. A thumbs up works with either hand (watch
|
|
272
|
+
`thumb` in the readout climb above ~0.1); a thumb to the side or an open hand doesn't count.
|
|
273
|
+
For the leg poses, step back until the readout says legs in view: a half squat reads `squat`
|
|
274
|
+
(hip height under 1.65), a lean of about 10° reads the side, a knee lift on either leg is one leg,
|
|
275
|
+
and a wide stance with arms up is a star.
|
|
276
|
+
4. **Left and right**: on the mirrored webcam, raise your own left arm for "raise your left arm". The
|
|
277
|
+
figure's raised arm is on the same screen side as yours, and it completes. Raising the right arm
|
|
278
|
+
doesn't.
|
|
279
|
+
5. **Unmirrored source** (a video, image or rear camera): the person's left arm still counts as left.
|
|
280
|
+
6. **Nudge**: step out of frame, or so your wrists are cut off, for 3 s. "Step back so your upper body
|
|
281
|
+
is in view" fades in and the figure pulses.
|
|
282
|
+
7. **Completion and sequence**: on done, a pop and a white ring play. With sequence on, the next pose
|
|
283
|
+
comes in.
|
|
284
|
+
8. **Hands and faces unchanged**: `/hand-instructions` and `/face-instructions` look and behave as
|
|
285
|
+
before.
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Body Triggers"
|
|
3
|
+
description: "Fire on full-body poses (T-pose, hands up, squat) and moves over time (jump, squat reps, wave, clap, punch, arm flap, kick, step, march) with begin / end events."
|
|
4
|
+
sidebarTitle: "Body Triggers"
|
|
5
|
+
icon: "person-running"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
`BodyTrigger` fires when the person holds a body pose or performs a body move. It reads the body
|
|
9
|
+
model's 33 pose landmarks (it acquires the model itself; no `BodyTracker` needed) and runs the same
|
|
10
|
+
lifecycle as [`useGesture`](/api/gestures): begin / end events, hold, cooldown, loss grace and a
|
|
11
|
+
count.
|
|
12
|
+
|
|
13
|
+
Import from `@vincentt-xr/sdk/tracking`.
|
|
14
|
+
|
|
15
|
+
```tsx
|
|
16
|
+
import { BodyTrigger, useBodyTrigger } from "@vincentt-xr/sdk/tracking";
|
|
17
|
+
|
|
18
|
+
// Declarative: mount inside the scene, act on the events.
|
|
19
|
+
<BodyTrigger pose="tPose" onBegin={() => takeOff()} onEnd={() => land()} />;
|
|
20
|
+
<BodyTrigger move="jump" onBegin={() => hop()} />;
|
|
21
|
+
<BodyTrigger move="punch" side="right" onBegin={(state) => hit(state.side)} />;
|
|
22
|
+
|
|
23
|
+
// Hook: React state that changes only when the trigger's state changes.
|
|
24
|
+
const squats = useBodyTrigger({ move: "squat" });
|
|
25
|
+
// squats.count = reps so far; squats.active = at the bottom of a rep.
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Pass exactly one of `pose` or `move`. Left / right are the person's own sides on every camera.
|
|
29
|
+
|
|
30
|
+
## Poses
|
|
31
|
+
|
|
32
|
+
`pose` takes BodyInstruction's vocabulary (`BODY_POSES` from `@vincentt-xr/sdk/instructions`) and
|
|
33
|
+
its classifier (`analyzeBodyShape` + `matchBodyPose`), so a pose that completes a
|
|
34
|
+
[`BodyInstruction`](/api/body-instructions) also fires a `BodyTrigger`.
|
|
35
|
+
|
|
36
|
+
| You want | `pose` | Needs |
|
|
37
|
+
| -------------------------------- | ---------------------------------------------------------- | ---------- |
|
|
38
|
+
| T-pose | `"tPose"` | upper body |
|
|
39
|
+
| Hands up | `"handsUp"` (alias of `"hooray"`) | upper body |
|
|
40
|
+
| Hands on hips | `"handsOnHips"` | upper body |
|
|
41
|
+
| Arms crossed | `"armsCrossed"` | upper body |
|
|
42
|
+
| Squat position | `"squat"` | whole body |
|
|
43
|
+
| Raise one arm | `"raiseLeft"` / `"raiseRight"` | upper body |
|
|
44
|
+
| Hands on head, thumbs up, salute | `"handsOnHead"`, `"thumbUp"`, `"bothThumbsUp"`, `"salute"` | upper body |
|
|
45
|
+
| Lean, one leg, star | `"leanLeft"` / `"leanRight"`, `"oneLeg"`, `"star"` | whole body |
|
|
46
|
+
|
|
47
|
+
`pose` also takes a rule, a match function or a `defineBodyPose` definition:
|
|
48
|
+
|
|
49
|
+
```tsx
|
|
50
|
+
<BodyTrigger pose={{ arms: { left: "raised", right: "out" } }} onBegin={point} />
|
|
51
|
+
<BodyTrigger pose={(shape) => shape.arms.left.up > 1.2} onBegin={reach} />
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
A pose begins once it has been held (the match is smoothed over about 80 ms, then `holdMs`, 150 by
|
|
55
|
+
default) and ends when it is released. A one-frame flicker of the classifier neither ends nor
|
|
56
|
+
restarts it. Pose defaults: `BODY_POSE_TRIGGER_DEFAULTS` (enter 0.6, exit 0.25, hold 150 ms, loss
|
|
57
|
+
grace 250 ms).
|
|
58
|
+
|
|
59
|
+
Poses read the same on portrait, landscape and square feeds. Tracker x and y each span the frame,
|
|
60
|
+
so on a 9:16 portrait feed a horizontal distance reads 1.78 times too long next to a vertical one;
|
|
61
|
+
the trigger multiplies x by the frame's aspect ratio (`useXRFeedAspect()`) before classifying.
|
|
62
|
+
`handsUp` and `hooray` are the same pose: each answers the other.
|
|
63
|
+
|
|
64
|
+
## Moves
|
|
65
|
+
|
|
66
|
+
`move` takes a `BODY_MOVES` name (`BODY_MOVE_NAMES`) or your own `defineBodyMove` definition.
|
|
67
|
+
|
|
68
|
+
| `move` | Begins | Ends | Needs | `side` | Cooldown |
|
|
69
|
+
| ---------------------------- | ----------------------------------------------------------------------------------------------- | ------------------------ | ---------- | ------ | -------- |
|
|
70
|
+
| `"jump"` | shoulders, hips and both feet rise together above the standing level (take-off) | on landing | whole body | – | 150 ms |
|
|
71
|
+
| `"squat"` | from standing, both thighs drop toward level (bottom of a rep) | back up standing | whole body | – | 200 ms |
|
|
72
|
+
| `"wave"` | a raised forearm swings side to side (three turning points within 1.5 s) | when the swinging stops | the arm | yes | 600 ms |
|
|
73
|
+
| `"clap"` | the hands meet fast (apart to touching within 0.25 s) | when they part | both arms | – | 100 ms |
|
|
74
|
+
| `"punch"` | an arm snaps from bent to straight (within 0.2 s) at shoulder height, to the camera or the side | when it bends back | the arm | yes | 150 ms |
|
|
75
|
+
| `"armFlap"` | both arms, out like wings, beat down together | when the arms rise again | both arms | – | 100 ms |
|
|
76
|
+
| `"kick"` | one foot swings up fast with the knee lifted and the lower leg raised | when the foot is down | whole body | yes | 300 ms |
|
|
77
|
+
| `"stepLeft"` / `"stepRight"` | hips and both feet move to the person's own left / right by half a shoulder width within 0.7 s | when the body settles | whole body | – | 300 ms |
|
|
78
|
+
| `"march"` | each alternating knee (or foot) lift; the first lift only starts the count | when that foot is down | whole body | – | 0 |
|
|
79
|
+
|
|
80
|
+
Every move counts: `state.count` goes up on each begin (jumps, reps, claps, punches, flaps, kicks,
|
|
81
|
+
steps, march steps). `onEnd` with `endReason: "released"` means the move completed. `state.side` is the
|
|
82
|
+
limb behind the begin (`wave`, `punch`, `kick`, `march`) or the step direction.
|
|
83
|
+
|
|
84
|
+
`side` (`"left"`, `"right"`, default `"either"`) picks the limb a `wave`, `punch` or `kick` watches.
|
|
85
|
+
|
|
86
|
+
### Telling moves apart
|
|
87
|
+
|
|
88
|
+
The moves are built not to answer each other: a squat is not a jump (the feet stay down), a march
|
|
89
|
+
step is not a kick (the foot hangs under the knee), a heel kick is not a kick (the knee stays down),
|
|
90
|
+
lowering the arms from the front is not a flap, dropping or raising a bent arm is not a punch, a slow
|
|
91
|
+
reach is not a punch, hands brought together slowly are not a clap, walking toward the camera is not
|
|
92
|
+
a step, and a single knee raise is not marching.
|
|
93
|
+
|
|
94
|
+
Moves read body motion in the frame, so a camera that moves fast reads as motion too: a jerked
|
|
95
|
+
handheld phone can look like a jump or a step. Slow drift never does. For leg moves, prop the phone up.
|
|
96
|
+
|
|
97
|
+
## Whole body in view
|
|
98
|
+
|
|
99
|
+
Leg moves need shoulders, hips, knees and ankles in view. A joint counts when MediaPipe's visibility
|
|
100
|
+
is at least 0.2 and it sits no more than 0.12 past the frame edge (`BODY_MOVE_VIEW_LIMITS`; the
|
|
101
|
+
frame spans −1..1). Both bars are deliberate: MediaPipe often reports 0.2 to 0.5 for ankles that are
|
|
102
|
+
in frame, and an ankle can sit just past the edge when the feet are partly cropped. Legs cut off by a
|
|
103
|
+
front camera held close sit far past the edge with visibility near 0, so leg moves never fire.
|
|
104
|
+
Tune per trigger with `view`:
|
|
105
|
+
|
|
106
|
+
```tsx
|
|
107
|
+
<BodyTrigger move="jump" view={{ visible: 0.3, edge: 0.05 }} onBegin={hop} />
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
The leg poses (`squat`, `leanLeft`, `leanRight`, `oneLeg`, `star`) use BodyInstruction's own check
|
|
111
|
+
(visibility at least `BODY_SHAPE_LIMITS.visible`, 0.5). The trigger reports what it needs:
|
|
112
|
+
|
|
113
|
+
- `state.view`: `"full"` (needs the whole body) or `"upper"`.
|
|
114
|
+
- `state.inView`: whether what it needs is in view now.
|
|
115
|
+
|
|
116
|
+
```tsx
|
|
117
|
+
const jump = useBodyTrigger({ move: "jump", onBegin: hop });
|
|
118
|
+
// Show "Step back so your whole body is in view" while this is true.
|
|
119
|
+
const needsStepBack = jump.view === "full" && !jump.inView;
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Leaving view while a move is active is tracking loss: after `lostGraceMs` it ends with
|
|
123
|
+
`endReason: "lost"`, and the move's memory starts fresh when the body is back.
|
|
124
|
+
|
|
125
|
+
## Thresholds
|
|
126
|
+
|
|
127
|
+
Arm moves measure in shoulder widths (like BodyInstruction's classifier). Leg moves measure vertical
|
|
128
|
+
against vertical (torso length, the standing shin), so distance from the camera and the frame's aspect
|
|
129
|
+
ratio cancel. Defaults are in `BODY_MOVE_LIMITS`; each move lists the keys it reads in
|
|
130
|
+
`BODY_MOVES[name].limitKeys`. Override per trigger:
|
|
131
|
+
|
|
132
|
+
```tsx
|
|
133
|
+
<BodyTrigger move="jump" limits={{ jumpRise: 0.2 }} onBegin={hop} />
|
|
134
|
+
<BodyTrigger move="squat" limits={{ squatDown: 0.75 }} onBegin={rep} /> {/* shallower squats count */}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
| Key | Default | Meaning |
|
|
138
|
+
| ----------------------------------------------------------------- | -------------------- | --------------------------------------------------------------------------------------------------------- |
|
|
139
|
+
| `jumpRise` / `jumpLand` | 0.12 / 0.06 | take-off rise and landing tolerance, torso lengths |
|
|
140
|
+
| `jumpMaxAirMs` / `jumpLevelMs` | 900 / 300 | longest air time; how fast the standing level follows slow drift |
|
|
141
|
+
| `squatDown` / `squatUp` | 0.6 / 0.85 | thigh height ÷ shin height at the bottom / back up (standing ≈ 1) |
|
|
142
|
+
| `waveForearmUp`, `waveAmplitude`, `waveReversals`, `waveWindowMs` | 0.25, 0.3, 3, 1500 | forearm raised; swing between turning points; turning points within the window |
|
|
143
|
+
| `clapApart`, `clapTogether`, `clapWithinMs`, `clapRelease` | 0.6, 0.3, 250, 0.45 | hands apart, then together within the time; parted again |
|
|
144
|
+
| `punchBent`, `punchStraight`, `punchWithinMs`, `punchBand` | 0.75, 0.93, 200, 0.9 | arm straightness (shoulder → wrist ÷ arm length, in 3D) from bent to straight; wrist near shoulder height |
|
|
145
|
+
| `flapStroke`, `flapWithinMs`, `flapTop`, `flapOut` | 0.7, 500, −0.4, 0.3 | both wrists drop this far, from a top near shoulder level, out to the sides |
|
|
146
|
+
| `kickLift`, `kickKnee`, `kickShin`, `kickWithinMs` | 0.35, 0.15, 0.6, 600 | foot and knee above the standing ones; the foot not hanging under the knee |
|
|
147
|
+
| `stepShift`, `stepWithinMs` | 0.5, 700 | sideways travel of hips and feet, shoulder widths |
|
|
148
|
+
| `marchLift`, `marchDrop`, `marchWithinMs` | 0.2, 0.08, 1200 | knee or foot above the other one; alternation window |
|
|
149
|
+
|
|
150
|
+
For poses, `limits` also takes BodyInstruction's classifier thresholds (`BODY_SHAPE_LIMITS` keys).
|
|
151
|
+
The lifecycle options are the gesture engine's (`enterThreshold`, `exitThreshold`, `holdMs`,
|
|
152
|
+
`cooldownMs`, `minConfidence`, `lostGraceMs`), per trigger.
|
|
153
|
+
|
|
154
|
+
## Options
|
|
155
|
+
|
|
156
|
+
`useBodyTrigger({ pose | move, … })` and `<BodyTrigger … />` take:
|
|
157
|
+
|
|
158
|
+
- `pose` or `move` (exactly one).
|
|
159
|
+
- `side`: `"either"` (default), `"left"`, `"right"`.
|
|
160
|
+
- `limits`: `Partial<BodyMoveLimits & BodyShapeLimits>`.
|
|
161
|
+
- `view`: `Partial<BodyMoveViewLimits>` (`{ visible, edge }`, the leg moves' view gate).
|
|
162
|
+
- The lifecycle options above.
|
|
163
|
+
- `bodyIndex` (default 0), `active` (default `true`; `false` pauses and releases the body model),
|
|
164
|
+
`targetFps`.
|
|
165
|
+
- `onBegin`, `onEnd`, `onChange`: called from the frame loop with that frame's `BodyTriggerState`.
|
|
166
|
+
|
|
167
|
+
`BodyTriggerState` is `GestureState` (`active`, `value`, `confidence`, `tracked`, `phase`,
|
|
168
|
+
`justBegan`, `justEnded`, `endReason`, `startedAtMs`, `durationMs`, `count`) plus `kind`
|
|
169
|
+
(`"pose"` | `"move"`), `view`, `inView` and `side`.
|
|
170
|
+
|
|
171
|
+
## Custom moves
|
|
172
|
+
|
|
173
|
+
```ts
|
|
174
|
+
import { defineBodyMove } from "@vincentt-xr/sdk/tracking";
|
|
175
|
+
|
|
176
|
+
// Both wrists above the head, then down below the hips within a second: a "touch the floor".
|
|
177
|
+
const touchFloor = defineBodyMove({
|
|
178
|
+
name: "touchFloor",
|
|
179
|
+
label: "Touch the floor",
|
|
180
|
+
description: "Hands from overhead to below the knees within 1 s.",
|
|
181
|
+
view: "full",
|
|
182
|
+
createMemory: () => ({ upAt: -Infinity }),
|
|
183
|
+
measure: (frame, memory, nowMs) => {
|
|
184
|
+
const { joints: j } = frame;
|
|
185
|
+
if (j.leftWrist.y > j.nose.y && j.rightWrist.y > j.nose.y) memory.upAt = nowMs;
|
|
186
|
+
const down = j.leftWrist.y < j.leftKnee.y && j.rightWrist.y < j.rightKnee.y;
|
|
187
|
+
return { value: down && nowMs - memory.upAt < 1000 ? 1 : 0 };
|
|
188
|
+
},
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
<BodyTrigger move={touchFloor} onBegin={celebrate} />;
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
`measure(frame, memory, nowMs, { side, limits })` runs once per new tracker sample of a body in
|
|
195
|
+
view and returns `{ value, side? }` (`value` ≥ 0.5 while the move is happening, for the default
|
|
196
|
+
thresholds). `frame` (`BodyMoveFrame`) carries BodyInstruction's `shape`, the person's own `joints`
|
|
197
|
+
(`joints.leftWrist` is their left wrist) in square units (x multiplied by the frame's aspect, so x and
|
|
198
|
+
y compare), `visibility` and `seen` per joint (the view gate above), `shoulderWidth`, `torso`
|
|
199
|
+
(vertical shoulder-to-hip length), `leftward` (the tracker-x direction of the person's left),
|
|
200
|
+
`upperInView`, `fullInView` and `aspect`. Memory is recreated whenever the body is lost or leaves
|
|
201
|
+
view. Define moves at module scope: a definition is keyed by its `name`.
|
|
202
|
+
|
|
203
|
+
The pure layer is on `@vincentt-xr/sdk/low-level` for tests and custom runners:
|
|
204
|
+
`createBodyMoveFrame(landmarks, { mirrored, visibility, aspect, view })`, `createBodyTrigger(target, options)`,
|
|
205
|
+
`stepBodyTrigger(machine, frame | null, nowMs, fresh?)`, `snapshotBodyTriggerState`,
|
|
206
|
+
`bodyTriggerStatesEqual`, `setBodyTriggerOptions`, `resolveBodyTriggerOptions`,
|
|
207
|
+
`resolveBodyMoveLimits`, `BODY_POSE_TRIGGER_DEFAULTS`, `sideJoint` and `TimedSeries` (windowed
|
|
208
|
+
min / max over a fixed ring, for custom moves).
|
|
209
|
+
|
|
210
|
+
## Performance
|
|
211
|
+
|
|
212
|
+
All body triggers read one shared body model; each tracker sample is analysed once and shared by
|
|
213
|
+
every trigger reading it. Moves keep a short fixed-size history and measure only new tracker samples,
|
|
214
|
+
not every rendered frame.
|
|
215
|
+
|
|
216
|
+
## Manual validation
|
|
217
|
+
|
|
218
|
+
Run `/gestures` (webcam by default; the fallback clip shows a full body). The body triggers section
|
|
219
|
+
lists every pose and move with a light and, for moves, a count.
|
|
220
|
+
|
|
221
|
+
| Case | Steps | Expect |
|
|
222
|
+
| ---------------- | ----------------------------------------------------------- | -------------------------------------------------------------- |
|
|
223
|
+
| Poses | hold a T-pose, hands up, hands on hips, arms crossed, squat | That row lights while held, off when released |
|
|
224
|
+
| Jump | stand back (whole body in view), jump three times | `jump` ×3; no `squat`, `march` or `step` |
|
|
225
|
+
| Squat reps | three squats | `squat` ×3, counted at the bottom |
|
|
226
|
+
| Wave | wave with your left hand, `side` = right | No count; set `side` = left, it counts with side `left` |
|
|
227
|
+
| Clap | clap four times | `clap` ×4; slowly pressing the palms together: no count |
|
|
228
|
+
| Punch | jab at the camera with each hand | `punch` counts with the right side |
|
|
229
|
+
| Arm flap | flap both arms like wings | `armFlap` counts each downstroke |
|
|
230
|
+
| Kick, march | kick once; then march in place | `kick` ×1; `march` counts steps, `kick` stays still |
|
|
231
|
+
| Steps | step to your left, then to your right | `stepLeft` then `stepRight`, on the webcam and rear camera |
|
|
232
|
+
| Legs out of view | come close so only the upper body shows | Leg rows turn amber ("needs full body") and never count |
|
|
233
|
+
| Fallback clip | "Person Fullbody" (portrait, standing still) | No pose lit (not `squat`); leg rows in view, counts at 0 |
|
|
234
|
+
| Feed shape | switch the stage between portrait and landscape | The same poses light; the "leg view gate" readout says in view |
|