@vincentt-xr/sdk 2.0.0-alpha.8 → 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 +4643 -170
- 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/gltfLoader.d.ts +16 -0
- package/dist/assets/loaders.d.ts +16 -1
- 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 +11 -6
- package/dist/canonicalFace-BHwyCx1c.js +9 -0
- package/dist/canonicalFace-C83I225R.cjs +1 -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 +10 -2
- 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 +5 -3
- package/dist/components/FaceMesh/canonical/geometryGroups.d.ts +21 -0
- package/dist/components/FaceMesh/canonical/parseCanonicalFaceModel.d.ts +9 -0
- package/dist/components/FaceMesh/index.d.ts +1 -1
- 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/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/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/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/LipEffect/LipEffect.d.ts +22 -2
- package/dist/components/LipEffect/LipEffectMaterial.d.ts +62 -10
- package/dist/components/LipEffect/LipEffects.d.ts +5 -2
- package/dist/components/LipEffect/defaults.d.ts +21 -2
- package/dist/components/LipEffect/index.d.ts +1 -1
- package/dist/components/LipEffect/lipShading.d.ts +73 -0
- package/dist/components/LipEffect/settings.d.ts +117 -13
- package/dist/components/LipEffect/shader.d.ts +39 -0
- package/dist/components/LipEffect/types.d.ts +82 -10
- package/dist/components/LipEffect/useLipDesignTextures.d.ts +6 -0
- package/dist/components/LipEffect/uvGuide.d.ts +31 -16
- 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/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/XRScene/renderOutputTarget.d.ts +12 -0
- package/dist/components/index.d.ts +8 -0
- package/dist/config/index.d.ts +0 -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/index.d.ts +2 -0
- package/dist/coordinates/side.d.ts +40 -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/hierarchy-panel/index.d.ts +3 -2
- package/dist/debug-ui/index.d.ts +4 -3
- 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 +3 -2
- 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/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 +3 -2
- package/dist/debug-ui.cjs +3 -3
- package/dist/debug-ui.js +2250 -2472
- package/dist/entries/all.d.ts +3 -1
- package/dist/entries/core.d.ts +3 -2
- package/dist/entries/face-effects.d.ts +114 -8
- package/dist/entries/instructions.d.ts +48 -0
- package/dist/entries/internal.d.ts +2 -1
- package/dist/entries/low-level.d.ts +28 -1
- package/dist/entries/particles.d.ts +11 -0
- package/dist/entries/tracking.d.ts +37 -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 +2252 -83
- package/dist/face-effects.js +14234 -1231
- 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 +15 -2
- package/dist/gestures/index.d.ts +1 -1
- package/dist/gestures/measures.d.ts +21 -8
- 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 +8 -0
- package/dist/hooks/useFaceModelAcquisition.d.ts +38 -0
- package/dist/hooks/useTrackerContext.d.ts +6 -0
- 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/{renderPasses-NnKZVfBy.js → index-w1S7fI2B.js} +219 -247
- package/dist/index-zGaqrz_K.js +188 -0
- package/dist/instructions.cjs +30 -0
- package/dist/instructions.js +1507 -0
- package/dist/{internal-vsfNQycj.js → internal-B90P-clC.js} +138 -118
- 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 +7 -5
- package/dist/iris/types.d.ts +6 -4
- package/dist/{landmarkMask-CbTFzBYG.js → landmarkMask-BFDyBnKM.js} +6 -6
- 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 +666 -602
- package/dist/main.cjs +1 -1
- package/dist/main.js +866 -1182
- package/dist/models/Body/index.d.ts +2 -0
- package/dist/models/Face/constants.d.ts +8 -0
- package/dist/models/Face/index.d.ts +3 -11
- package/dist/models/Face/rotation.d.ts +18 -3
- package/dist/models/Hand/HandTracking.d.ts +17 -1
- package/dist/models/Segmentation/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.cjs +1 -1
- package/dist/product.js +29 -29
- package/dist/{providers-C0Dlhh9Z.js → providers-C8rE26Uf.js} +127 -126
- package/dist/providers-DHsrhDI2.cjs +62 -0
- package/dist/render/renderPasses.d.ts +8 -0
- package/dist/render/sceneBeforeRender.d.ts +12 -0
- package/dist/{renderGroups-CN1cGFUo.js → renderGroups-B38pUaX2.js} +1 -1
- package/dist/{renderGroups-O4KmaMl9.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/types.d.ts +6 -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-aQk845NJ.js → settings-BJ7FMBsO.js} +53 -15
- 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/tracking.cjs +10 -1
- package/dist/tracking.js +1002 -855
- package/dist/trigger-D0Pm9noT.cjs +49 -0
- package/dist/trigger-IQeys0oS.js +2128 -0
- package/dist/types/face.d.ts +20 -1
- package/dist/types/hand-tracking.d.ts +9 -0
- package/dist/types/nodes.d.ts +20 -1
- package/dist/types/segmentation.d.ts +5 -0
- 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-B1R2ghy-.cjs → useXRCapabilities-Cr3RzuAW.cjs} +1 -1
- package/dist/{useXRCapabilities-C68v__wB.js → useXRCapabilities-Cxmlmpbd.js} +1 -1
- package/dist/utils/canonicalRigidLandmarks.d.ts +8 -0
- package/dist/utils/headOccluderFit.d.ts +42 -0
- package/dist/utils/integrity.d.ts +17 -0
- 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/uv-BMFt19bg.cjs +1 -0
- package/dist/{index-CsUdQ-pn.js → uv-DJU_XfmN.js} +15 -249
- package/docs/SDK_DOCUMENTATION.md +1 -2
- package/docs/api/adaptive-quality.mdx +1 -1
- package/docs/api/body-instructions.mdx +285 -0
- package/docs/api/body-triggers.mdx +234 -0
- package/docs/api/camera-permission.mdx +1 -1
- package/docs/api/coordinate-spaces.mdx +7 -4
- package/docs/api/cross-camera.mdx +3 -2
- package/docs/api/debug-ui-scene-editor.mdx +23 -2
- 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 +3 -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 +4 -7
- 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 +68 -32
- 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 +6 -1
- package/docs/api/instructions.mdx +323 -0
- package/docs/api/iris-tracking.mdx +24 -19
- 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 +4 -1
- package/docs/api/particles.mdx +155 -0
- package/docs/api/person-cutout.mdx +1 -1
- package/docs/api/pin-to-face-mesh.mdx +274 -0
- package/docs/api/product-ar.mdx +5 -2
- package/docs/api/segmentation-overlay.mdx +1 -1
- package/docs/docs.json +29 -1
- package/docs/examples/lip-shaders.mdx +82 -33
- 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 +178 -102
- package/docs/guides/lip-uv-template.png +0 -0
- package/docs/guides/lip-uv-template.svg +1 -1
- package/docs/guides/makeup-design-textures.mdx +109 -0
- package/docs/introduction.mdx +1 -2
- package/package.json +11 -1
- package/dist/DebuggerUI-C-ldiozL.js +0 -269
- package/dist/DebuggerUI-CWX5EtQv.cjs +0 -1
- package/dist/FaceMeshRenderer-BEEXZwS6.cjs +0 -158
- package/dist/FaceMeshRenderer-UuH5sTXG.js +0 -1322
- package/dist/FaceRetouch-C7h7x9kd.js +0 -683
- package/dist/FaceRetouch-DqftT26Y.cjs +0 -134
- package/dist/GLTFLoader-C5q63sKO.js +0 -1633
- package/dist/GLTFLoader-Cb_CRwmG.cjs +0 -1
- package/dist/SegmentationOverlay-DQuW3dsc.js +0 -133
- package/dist/SegmentationOverlay-aWVod8Kl.cjs +0 -1
- 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-CO0sd4JQ.cjs +0 -1
- package/dist/contexts-FzlnnMYD.js +0 -669
- package/dist/debug-ui/face-warp-3d/index.d.ts +0 -6
- package/dist/getFaceInfo-BkZfaQs-.js +0 -118
- package/dist/getFaceInfo-ahPxQFGu.cjs +0 -1
- package/dist/index--RgGzZ6X.cjs +0 -47
- package/dist/index-CHVbH0hz.js +0 -214
- package/dist/index-CeVkgsag.cjs +0 -1
- package/dist/index-CnGox6Xr.js +0 -3054
- package/dist/index-DKBAh6hV.cjs +0 -1
- package/dist/index-DsZwTfG0.cjs +0 -1
- package/dist/index-Dw6tj2Mi.js +0 -144
- package/dist/index-OCPjOaeP.cjs +0 -1
- package/dist/index-s9pF4zkG.js +0 -2053
- package/dist/internal-BYza1h8_.cjs +0 -1
- package/dist/measures-9dQPdw96.js +0 -154
- package/dist/measures-KfJzpvod.cjs +0 -1
- package/dist/providers-YNwkmNeK.cjs +0 -62
- package/dist/renderPasses-Cg-zqmEz.cjs +0 -21
- package/dist/screenTransform-BenfCtZt.js +0 -44
- package/dist/screenTransform-BiXdpVf0.cjs +0 -1
- package/dist/segmentation-9PhSvc-R.cjs +0 -1
- package/dist/segmentation-CeOTKemr.js +0 -5
- package/dist/selectors-C5G1PMYL.js +0 -195
- package/dist/selectors-Du_PsVnW.cjs +0 -1
- package/dist/session-BBr0yN8h.cjs +0 -31
- package/dist/session-Cy0m7l7-.js +0 -363
- package/dist/settings-DRR7-snV.cjs +0 -1
- package/dist/useFaceInfo-Blf7FCu3.js +0 -303
- package/dist/useFaceInfo-C5mO8NQY.cjs +0 -1
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { FaceInfo } from '../face-info';
|
|
2
|
+
import { FaceBlendshapeName } from '../face-info/blendshapes';
|
|
3
|
+
/** A face's blendshape scores (MediaPipe names, 0..1), as `FaceInfo.blendshapes`. */
|
|
4
|
+
export type FaceBlendshapes = Readonly<Partial<Record<FaceBlendshapeName, number>>>;
|
|
5
|
+
/**
|
|
6
|
+
* What an expression requires of the blendshapes; omitted fields are "any".
|
|
7
|
+
* `atLeast` / `atMost` are per-blendshape bounds (all must hold); `anyOf`
|
|
8
|
+
* passes when one of its rules does (e.g. a wink with either eye).
|
|
9
|
+
*/
|
|
10
|
+
export type FaceExpressionRule = {
|
|
11
|
+
atLeast?: Partial<Record<FaceBlendshapeName, number>>;
|
|
12
|
+
atMost?: Partial<Record<FaceBlendshapeName, number>>;
|
|
13
|
+
anyOf?: readonly FaceExpressionRule[];
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Your own test of the face (any logic over the blendshapes; `face` is the
|
|
17
|
+
* full `FaceInfo` when a hook calls it).
|
|
18
|
+
*/
|
|
19
|
+
export type FaceExpressionMatch = (blendshapes: FaceBlendshapes, face?: FaceInfo) => boolean;
|
|
20
|
+
/**
|
|
21
|
+
* How the hint face shows an expression: one morph target played 0 → 1, or a
|
|
22
|
+
* mix of several (`{ smile: 1, wink: 0.6 }`, each weight reached at the peak).
|
|
23
|
+
*/
|
|
24
|
+
export type FaceExpressionHintPose = {
|
|
25
|
+
target: string;
|
|
26
|
+
} | {
|
|
27
|
+
targets: Record<string, number>;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* An expression: its default copy, how it is detected (`rule`, or `match`
|
|
31
|
+
* for logic a rule cannot express; with both, both must pass) and how the
|
|
32
|
+
* hint face shows it. Make your own with `defineFaceExpression`.
|
|
33
|
+
*/
|
|
34
|
+
export type FaceExpressionDefinition = {
|
|
35
|
+
/** Default instruction copy. */
|
|
36
|
+
label: string;
|
|
37
|
+
rule?: FaceExpressionRule;
|
|
38
|
+
match?: FaceExpressionMatch;
|
|
39
|
+
/** The hint face's morph target(s) that show it (`face-v1.glb` ships one per expression). */
|
|
40
|
+
hint: FaceExpressionHintPose;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Anything that names an expression to detect: a built-in name, a rule, a
|
|
44
|
+
* match function or a full definition.
|
|
45
|
+
*/
|
|
46
|
+
export type FaceExpressionSpec = FaceExpressionName | FaceExpressionRule | FaceExpressionMatch | FaceExpressionDefinition;
|
|
47
|
+
/**
|
|
48
|
+
* Checks and returns your own expression definition (it needs a `rule` or a
|
|
49
|
+
* `match`). Pass it anywhere an expression name goes.
|
|
50
|
+
*
|
|
51
|
+
* ```ts
|
|
52
|
+
* const yawn = defineFaceExpression({
|
|
53
|
+
* label: "Big yawn",
|
|
54
|
+
* rule: { atLeast: { jawOpen: 0.7 } },
|
|
55
|
+
* hint: { target: "surprised" },
|
|
56
|
+
* });
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export declare const defineFaceExpression: <T extends FaceExpressionDefinition>(definition: T) => T;
|
|
60
|
+
/**
|
|
61
|
+
* The face instruction vocabulary. Rules read MediaPipe's face blendshapes;
|
|
62
|
+
* thresholds follow the SDK's face gestures (mouth open 0.5, smile 0.4, blink
|
|
63
|
+
* 0.55, brow raise 0.45). A wink accepts either eye, with the other one open.
|
|
64
|
+
*/
|
|
65
|
+
export declare const FACE_EXPRESSIONS: {
|
|
66
|
+
readonly smile: {
|
|
67
|
+
readonly label: "Give a big smile";
|
|
68
|
+
readonly rule: {
|
|
69
|
+
readonly atLeast: {
|
|
70
|
+
readonly mouthSmileLeft: 0.45;
|
|
71
|
+
readonly mouthSmileRight: 0.45;
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
readonly hint: {
|
|
75
|
+
readonly target: "smile";
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
readonly wink: {
|
|
79
|
+
readonly label: "Wink at the camera";
|
|
80
|
+
readonly rule: {
|
|
81
|
+
readonly anyOf: readonly [{
|
|
82
|
+
readonly atLeast: {
|
|
83
|
+
readonly eyeBlinkLeft: 0.55;
|
|
84
|
+
};
|
|
85
|
+
readonly atMost: {
|
|
86
|
+
readonly eyeBlinkRight: 0.3;
|
|
87
|
+
};
|
|
88
|
+
}, {
|
|
89
|
+
readonly atLeast: {
|
|
90
|
+
readonly eyeBlinkRight: 0.55;
|
|
91
|
+
};
|
|
92
|
+
readonly atMost: {
|
|
93
|
+
readonly eyeBlinkLeft: 0.3;
|
|
94
|
+
};
|
|
95
|
+
}];
|
|
96
|
+
};
|
|
97
|
+
readonly hint: {
|
|
98
|
+
readonly target: "wink";
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
readonly surprised: {
|
|
102
|
+
readonly label: "Look surprised";
|
|
103
|
+
readonly rule: {
|
|
104
|
+
readonly atLeast: {
|
|
105
|
+
readonly jawOpen: 0.35;
|
|
106
|
+
readonly browInnerUp: 0.4;
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
readonly hint: {
|
|
110
|
+
readonly target: "surprised";
|
|
111
|
+
};
|
|
112
|
+
};
|
|
113
|
+
readonly kiss: {
|
|
114
|
+
readonly label: "Blow a kiss";
|
|
115
|
+
readonly rule: {
|
|
116
|
+
readonly atLeast: {
|
|
117
|
+
readonly mouthPucker: 0.5;
|
|
118
|
+
};
|
|
119
|
+
readonly atMost: {
|
|
120
|
+
readonly jawOpen: 0.3;
|
|
121
|
+
};
|
|
122
|
+
};
|
|
123
|
+
readonly hint: {
|
|
124
|
+
readonly target: "kiss";
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
readonly puffCheeks: {
|
|
128
|
+
readonly label: "Puff your cheeks";
|
|
129
|
+
readonly rule: {
|
|
130
|
+
readonly atLeast: {
|
|
131
|
+
readonly cheekPuff: 0.3;
|
|
132
|
+
};
|
|
133
|
+
};
|
|
134
|
+
readonly hint: {
|
|
135
|
+
readonly target: "puffCheeks";
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
readonly frown: {
|
|
139
|
+
readonly label: "Frown";
|
|
140
|
+
readonly rule: {
|
|
141
|
+
readonly atLeast: {
|
|
142
|
+
readonly browDownLeft: 0.4;
|
|
143
|
+
readonly browDownRight: 0.4;
|
|
144
|
+
};
|
|
145
|
+
};
|
|
146
|
+
readonly hint: {
|
|
147
|
+
readonly target: "frown";
|
|
148
|
+
};
|
|
149
|
+
};
|
|
150
|
+
readonly scrunch: {
|
|
151
|
+
readonly label: "Scrunch your face";
|
|
152
|
+
readonly rule: {
|
|
153
|
+
readonly anyOf: readonly [{
|
|
154
|
+
readonly atLeast: {
|
|
155
|
+
readonly noseSneerLeft: 0.3;
|
|
156
|
+
readonly noseSneerRight: 0.3;
|
|
157
|
+
};
|
|
158
|
+
}, {
|
|
159
|
+
readonly atLeast: {
|
|
160
|
+
readonly eyeSquintLeft: 0.45;
|
|
161
|
+
readonly eyeSquintRight: 0.45;
|
|
162
|
+
readonly browDownLeft: 0.3;
|
|
163
|
+
readonly browDownRight: 0.3;
|
|
164
|
+
};
|
|
165
|
+
}];
|
|
166
|
+
};
|
|
167
|
+
readonly hint: {
|
|
168
|
+
readonly target: "scrunch";
|
|
169
|
+
};
|
|
170
|
+
};
|
|
171
|
+
};
|
|
172
|
+
export type FaceExpressionName = keyof typeof FACE_EXPRESSIONS;
|
|
173
|
+
export declare const FACE_EXPRESSION_NAMES: FaceExpressionName[];
|
|
174
|
+
/** The full definition a spec names (`undefined` for a bare rule or match function). */
|
|
175
|
+
export declare const resolveFaceExpression: (expression: FaceExpressionSpec) => FaceExpressionDefinition | undefined;
|
|
176
|
+
/**
|
|
177
|
+
* Whether blendshapes satisfy an expression: a name from `FACE_EXPRESSIONS`, a
|
|
178
|
+
* rule, a match function or a definition. `face` is passed on to match functions.
|
|
179
|
+
*/
|
|
180
|
+
export declare const matchFaceExpression: (blendshapes: FaceBlendshapes, expression: FaceExpressionSpec, face?: FaceInfo) => boolean;
|
|
181
|
+
/** Every named expression the blendshapes satisfy (several can: a scrunch is often also a frown). */
|
|
182
|
+
export declare const matchingFaceExpressions: (blendshapes: FaceBlendshapes) => FaceExpressionName[];
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import { NormalizedLandmark } from '@mediapipe/tasks-vision';
|
|
2
2
|
import { FaceCustomAnchorPoint, FaceTarget } from '../types/tracking';
|
|
3
|
-
/**
|
|
3
|
+
/**
|
|
4
|
+
* MediaPipe canonical face-mesh index of each single-landmark face target, as
|
|
5
|
+
* MediaPipe names the side (263 = its left eye): the person's own side on an
|
|
6
|
+
* unmirrored feed. On the mirrored webcam the person's side is the other
|
|
7
|
+
* entry — read `FACE_LANDMARK_INDICES[feedSidedName(target, mirrored)]`, or
|
|
8
|
+
* let `resolveFaceAnchorPoint` / `TrackingAnchor` pick it (GROUNDING "Left and
|
|
9
|
+
* right").
|
|
10
|
+
*/
|
|
4
11
|
export declare const FACE_LANDMARK_INDICES: {
|
|
5
12
|
readonly "face.forehead": 10;
|
|
6
13
|
readonly "face.noseTip": 1;
|
|
@@ -13,8 +20,15 @@ export declare const FACE_LANDMARK_INDICES: {
|
|
|
13
20
|
readonly "face.leftEarlobe": 454;
|
|
14
21
|
readonly "face.rightEarlobe": 234;
|
|
15
22
|
};
|
|
16
|
-
/**
|
|
17
|
-
|
|
23
|
+
/**
|
|
24
|
+
* Resolves a semantic face target in normalized tracker-input coordinates.
|
|
25
|
+
* Left / right (`face.leftCheek`, `face.custom`'s −x) are the person's own
|
|
26
|
+
* side: pass `feedMirrored` (`useXRMirrored()`; the front webcam is mirrored)
|
|
27
|
+
* so the target is read from the mesh side the person's side has on this
|
|
28
|
+
* feed. Defaults to an unmirrored feed.
|
|
29
|
+
*/
|
|
30
|
+
export declare const resolveFaceAnchorPoint: (faceTarget: FaceTarget, landmarks: readonly NormalizedLandmark[], customAnchorPoint?: FaceCustomAnchorPoint, target?: NormalizedLandmark, feedMirrored?: boolean) => NormalizedLandmark | null;
|
|
31
|
+
/** The outer eye corners (MediaPipe's sides; only their distance is read). */
|
|
18
32
|
export declare const FACE_EYE_DISTANCE_LANDMARKS: {
|
|
19
33
|
readonly left: 263;
|
|
20
34
|
readonly right: 33;
|
|
@@ -9,22 +9,38 @@ export type FaceVector3 = Readonly<{
|
|
|
9
9
|
export type FaceInfo = {
|
|
10
10
|
/** Current result-array index. This is not a persistent identity. */
|
|
11
11
|
readonly index: number;
|
|
12
|
-
/**
|
|
12
|
+
/**
|
|
13
|
+
* MediaPipe landmarks in normalized tracker-input coordinates; top-left
|
|
14
|
+
* origin. Indices keep MediaPipe's sides (263 = MediaPipe's left eye): the
|
|
15
|
+
* person's own side on an unmirrored feed, the opposite on the mirrored
|
|
16
|
+
* webcam (see `mirrored`).
|
|
17
|
+
*/
|
|
13
18
|
readonly landmarks: readonly NormalizedLandmark[];
|
|
14
19
|
/** Axis-aligned bounds in the same normalized tracker-input coordinates. */
|
|
15
20
|
readonly bounds: Readonly<FaceBounds>;
|
|
16
21
|
readonly pose: {
|
|
17
22
|
/** Three.js world position from the existing face tracker. */
|
|
18
23
|
readonly position: FaceVector3;
|
|
19
|
-
/**
|
|
24
|
+
/**
|
|
25
|
+
* Radians: X pitch (+ = looking up), Y yaw (+ = turning to the person's
|
|
26
|
+
* own left), Z roll (+ = tilting toward the person's own left shoulder),
|
|
27
|
+
* on every feed.
|
|
28
|
+
*/
|
|
20
29
|
readonly rotation: FaceVector3;
|
|
21
30
|
/** Smoothed uniform sizing heuristic used by the face occluder/tracker anchor. */
|
|
22
31
|
readonly scale: FaceVector3;
|
|
23
32
|
};
|
|
24
33
|
/** Outer-eye distance in normalized tracker-input coordinates. */
|
|
25
34
|
readonly eyeDistance: number;
|
|
26
|
-
/**
|
|
35
|
+
/**
|
|
36
|
+
* MediaPipe blendshape category names mapped to scores in [0, 1], raw:
|
|
37
|
+
* `…Left` is MediaPipe's left (the person's own left on an unmirrored feed,
|
|
38
|
+
* their right on the mirrored webcam). Face actions (`eyeBlinkLeft` …) read
|
|
39
|
+
* the person's side for you.
|
|
40
|
+
*/
|
|
27
41
|
readonly blendshapes: Readonly<Partial<Record<FaceBlendshapeName, number>>>;
|
|
42
|
+
/** The face was read from a mirrored feed (the front webcam): MediaPipe's sides are the person's opposite sides. */
|
|
43
|
+
readonly mirrored: boolean;
|
|
28
44
|
};
|
|
29
45
|
export type FaceInfoTarget = {
|
|
30
46
|
index: number;
|
|
@@ -49,4 +65,5 @@ export type FaceInfoTarget = {
|
|
|
49
65
|
};
|
|
50
66
|
eyeDistance: number;
|
|
51
67
|
blendshapes: Record<string, number>;
|
|
68
|
+
mirrored: boolean;
|
|
52
69
|
};
|
|
@@ -5,6 +5,15 @@ import { OscillationTracker } from './measures';
|
|
|
5
5
|
export type GestureKind = "face" | "hand" | "body";
|
|
6
6
|
/** What each tracker hands a definition per frame. */
|
|
7
7
|
export type GestureInputOf<K extends GestureKind> = K extends "face" ? FaceInfo | null : ReadonlyArray<TrackerPoint> | undefined;
|
|
8
|
+
/**
|
|
9
|
+
* The feed a frame came from. `mirrored`: the front webcam, where MediaPipe's
|
|
10
|
+
* left / right labels (pose 11 / 12 …, face mesh sides, `…Left` blendshapes)
|
|
11
|
+
* name the person's opposite side. A sided gesture reads the person's own
|
|
12
|
+
* side with it (`personSide(side, mirrored)`).
|
|
13
|
+
*/
|
|
14
|
+
export type GestureContext = {
|
|
15
|
+
mirrored: boolean;
|
|
16
|
+
};
|
|
8
17
|
/**
|
|
9
18
|
* A gesture: which tracker it reads, how to turn one frame of that tracker
|
|
10
19
|
* into a `{ value, confidence }` sample, and its default detector options.
|
|
@@ -17,8 +26,12 @@ export type GestureDefinition<K extends GestureKind = GestureKind, M = unknown>
|
|
|
17
26
|
/** Overrides of `DEFAULT_GESTURE_DETECTOR_OPTIONS` for this gesture. */
|
|
18
27
|
defaults?: Partial<GestureDetectorOptions>;
|
|
19
28
|
createMemory?: () => M;
|
|
20
|
-
/**
|
|
21
|
-
|
|
29
|
+
/**
|
|
30
|
+
* `null` when the tracker has no subject this frame. Confidence 1 unless
|
|
31
|
+
* the source knows better. `context` is the feed (`useGesture` passes it;
|
|
32
|
+
* missing = an unmirrored feed).
|
|
33
|
+
*/
|
|
34
|
+
measure: (input: GestureInputOf<K>, memory: M, nowMs: number, context?: GestureContext) => GestureSample;
|
|
22
35
|
};
|
|
23
36
|
type OscillationMemory = {
|
|
24
37
|
tracker: OscillationTracker;
|
package/dist/gestures/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { DEFAULT_GESTURE_DETECTOR_OPTIONS, createGestureDetectorState, gestureStatesEqual, resolveGestureDetectorOptions, snapshotGestureState, stepGestureDetector, } from './detector';
|
|
2
2
|
export type { GestureDetectorOptions, GestureDetectorState, GestureEndReason, GesturePhase, GestureSample, GestureState, } from './detector';
|
|
3
3
|
export { GESTURES, GESTURE_NAMES, defineGesture, resolveGestureDefinition } from './definitions';
|
|
4
|
-
export type { AnyGestureDefinition, BuiltInGestureName, GestureDefinition, GestureInputOf, GestureKind, GestureRef, } from './definitions';
|
|
4
|
+
export type { AnyGestureDefinition, BuiltInGestureName, GestureContext, GestureDefinition, GestureInputOf, GestureKind, GestureRef, } from './definitions';
|
|
5
5
|
export { HAND_JOINTS, OscillationTracker, POSE_JOINTS, measureArmRaise, fingerExtensions, measureFingerPattern, measureGrab, measureHandHeight, measureOpenPalm, measurePinch, measureTPose, measureThumb, thumbDirection, thumbExtension, } from './measures';
|
|
6
6
|
export type { FingerPattern } from './measures';
|
|
7
7
|
export { DEFAULT_GESTURE_SETTINGS, GESTURE_SETTINGS_FIELDS, patchGestureSettings, resolveGestureSettings, } from './settings';
|
|
@@ -54,7 +54,12 @@ export declare const measureGrab: (hand: ReadonlyArray<TrackerPoint> | undefined
|
|
|
54
54
|
export declare const measureOpenPalm: (hand: ReadonlyArray<TrackerPoint> | undefined) => number;
|
|
55
55
|
/** Hand height on screen: 0 at the bottom edge, 0.5 at the centre, 1 at the top (tracker Y up). */
|
|
56
56
|
export declare const measureHandHeight: (hand: ReadonlyArray<TrackerPoint> | undefined) => number;
|
|
57
|
-
/**
|
|
57
|
+
/**
|
|
58
|
+
* MediaPipe pose landmarks used by the body measures, as MediaPipe labels
|
|
59
|
+
* them (11 = its left shoulder): the person's own side on an unmirrored feed,
|
|
60
|
+
* the opposite on the mirrored webcam. Sided measures take the feed's
|
|
61
|
+
* `mirrored` to read the person's own side.
|
|
62
|
+
*/
|
|
58
63
|
export declare const POSE_JOINTS: {
|
|
59
64
|
readonly leftShoulder: 11;
|
|
60
65
|
readonly rightShoulder: 12;
|
|
@@ -68,10 +73,13 @@ export declare const POSE_JOINTS: {
|
|
|
68
73
|
/** Shoulder width in tracker units; the body's scale reference. */
|
|
69
74
|
export declare const shoulderWidth: (pose: ReadonlyArray<TrackerPoint>) => number;
|
|
70
75
|
/**
|
|
71
|
-
* How far
|
|
72
|
-
* shoulder level or below, 1 at one shoulder width
|
|
76
|
+
* How far the person's own `side` wrist is raised above its shoulder, in
|
|
77
|
+
* shoulder widths: 0 at shoulder level or below, 1 at one shoulder width
|
|
78
|
+
* above. `mirrored` is the feed's mirror state (the front webcam; default
|
|
79
|
+
* `false`): MediaPipe's labels name the person's opposite side there, so the
|
|
80
|
+
* other label is read (#298).
|
|
73
81
|
*/
|
|
74
|
-
export declare const measureArmRaise: (pose: ReadonlyArray<TrackerPoint> | undefined, side: "left" | "right") => number;
|
|
82
|
+
export declare const measureArmRaise: (pose: ReadonlyArray<TrackerPoint> | undefined, side: "left" | "right", mirrored?: boolean) => number;
|
|
75
83
|
/**
|
|
76
84
|
* T-pose: both wrists level with the shoulders and stretched outward by at
|
|
77
85
|
* least a shoulder width. 1 when fully extended and level.
|
|
@@ -79,15 +87,20 @@ export declare const measureArmRaise: (pose: ReadonlyArray<TrackerPoint> | undef
|
|
|
79
87
|
export declare const measureTPose: (pose: ReadonlyArray<TrackerPoint> | undefined) => number;
|
|
80
88
|
/**
|
|
81
89
|
* Counts direction reversals of a scalar over a sliding window: the engine
|
|
82
|
-
* behind nod, head shake and wave.
|
|
83
|
-
*
|
|
90
|
+
* behind nod, head shake and wave. It follows the running extreme in the
|
|
91
|
+
* current direction; a turning point counts once the signal has come back
|
|
92
|
+
* at least `minAmplitude` from it (so jitter below the amplitude never
|
|
93
|
+
* counts, and a small first half-swing does not stall the count). `push`
|
|
84
94
|
* returns `min(1, reversals / requiredReversals)` within `windowMs`.
|
|
85
95
|
*/
|
|
86
96
|
export declare class OscillationTracker {
|
|
87
97
|
private readonly options;
|
|
88
98
|
private reversals;
|
|
89
|
-
|
|
90
|
-
private
|
|
99
|
+
/** Running extreme in the current direction (max rising, min falling). */
|
|
100
|
+
private extreme;
|
|
101
|
+
/** Range seen before the first swing (direction still unknown). */
|
|
102
|
+
private low;
|
|
103
|
+
private high;
|
|
91
104
|
private direction;
|
|
92
105
|
constructor(options: {
|
|
93
106
|
minAmplitude: number;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const f=require("./landmarks-BlUqf5MZ.cjs"),d=(s,e={minX:0,minY:0,maxX:0,maxY:0,width:0,height:0,centerX:0,centerY:0})=>{if(s.length===0)return e.minX=0,e.minY=0,e.maxX=0,e.maxY=0,e.width=0,e.height=0,e.centerX=0,e.centerY=0,e;let n=1,t=1,i=0,c=0;for(let r=0;r<s.length;r++){const{x:a,y:h}=s[r];a<n&&(n=a),h<t&&(t=h),a>i&&(i=a),h>c&&(c=h)}const o=Math.max(0,i-n),m=Math.max(0,c-t);return e.minX=n,e.minY=t,e.maxX=i,e.maxY=c,e.width=o,e.height=m,e.centerX=n+o*.5,e.centerY=t+m*.5,e},u=.5,X=(s,e)=>{for(const n in e)delete e[n];if(s)for(const n of s)e[n.categoryName]=n.score;return e},E=(s,e)=>s.blendshapes[e]??0,Y=(s,e,n=u)=>E(s,e)>=n,F=s=>{const e=s[f.FACE_EYE_DISTANCE_LANDMARKS.left],n=s[f.FACE_EYE_DISTANCE_LANDMARKS.right];return!e||!n?0:Math.hypot(e.x-n.x,e.y-n.y)},x=()=>({index:0,landmarks:[],bounds:{minX:0,minY:0,maxX:0,maxY:0,width:0,height:0,centerX:0,centerY:0},pose:{position:{x:0,y:0,z:0},rotation:{x:0,y:0,z:0},scale:{x:0,y:0,z:0}},eyeDistance:0,blendshapes:{},mirrored:!0}),l=(s,e)=>{e.x=s.x,e.y=s.y,e.z=s.z},p=(s,e,n=0,t)=>{var m,r,a;const i=(m=e.faceLandmarks)==null?void 0:m[n],c=s.getFace(n);if(!i||!c)return null;const o=t??x();return o.index=n,o.landmarks=i,d(i,o.bounds),l(c.transform.position,o.pose.position),l(c.transform.rotation,o.pose.rotation),l(c.transform.scale,o.pose.scale),o.eyeDistance=F(i),X((a=(r=e.faceBlendshapes)==null?void 0:r[n])==null?void 0:a.categories,o.blendshapes),o.mirrored=c.mirrored!==!1,o},y=(s,e=0,n)=>{const t=s.getDetectionResults();return t?p(s,t,e,n):null};exports.DEFAULT_FACE_EXPRESSION_THRESHOLD=u;exports.computeLandmarkBounds=d;exports.createFaceInfoTarget=x;exports.getFaceBlendshape=E;exports.getFaceEyeDistance=F;exports.getFaceInfo=y;exports.getFaceInfoFromResults=p;exports.hasFaceExpression=Y;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { F as f } from "./landmarks-bftdwq6Z.js";
|
|
2
|
+
const x = (s, e = {
|
|
3
|
+
minX: 0,
|
|
4
|
+
minY: 0,
|
|
5
|
+
maxX: 0,
|
|
6
|
+
maxY: 0,
|
|
7
|
+
width: 0,
|
|
8
|
+
height: 0,
|
|
9
|
+
centerX: 0,
|
|
10
|
+
centerY: 0
|
|
11
|
+
}) => {
|
|
12
|
+
if (s.length === 0)
|
|
13
|
+
return e.minX = 0, e.minY = 0, e.maxX = 0, e.maxY = 0, e.width = 0, e.height = 0, e.centerX = 0, e.centerY = 0, e;
|
|
14
|
+
let n = 1, t = 1, c = 0, i = 0;
|
|
15
|
+
for (let r = 0; r < s.length; r++) {
|
|
16
|
+
const { x: a, y: h } = s[r];
|
|
17
|
+
a < n && (n = a), h < t && (t = h), a > c && (c = a), h > i && (i = h);
|
|
18
|
+
}
|
|
19
|
+
const o = Math.max(0, c - n), m = Math.max(0, i - t);
|
|
20
|
+
return e.minX = n, e.minY = t, e.maxX = c, e.maxY = i, e.width = o, e.height = m, e.centerX = n + o * 0.5, e.centerY = t + m * 0.5, e;
|
|
21
|
+
}, d = 0.5, p = (s, e) => {
|
|
22
|
+
for (const n in e) delete e[n];
|
|
23
|
+
if (s)
|
|
24
|
+
for (const n of s) e[n.categoryName] = n.score;
|
|
25
|
+
return e;
|
|
26
|
+
}, u = (s, e) => s.blendshapes[e] ?? 0, E = (s, e, n = d) => u(s, e) >= n, X = (s) => {
|
|
27
|
+
const e = s[f.left], n = s[f.right];
|
|
28
|
+
return !e || !n ? 0 : Math.hypot(e.x - n.x, e.y - n.y);
|
|
29
|
+
}, Y = () => ({
|
|
30
|
+
index: 0,
|
|
31
|
+
landmarks: [],
|
|
32
|
+
bounds: { minX: 0, minY: 0, maxX: 0, maxY: 0, width: 0, height: 0, centerX: 0, centerY: 0 },
|
|
33
|
+
pose: {
|
|
34
|
+
position: { x: 0, y: 0, z: 0 },
|
|
35
|
+
rotation: { x: 0, y: 0, z: 0 },
|
|
36
|
+
scale: { x: 0, y: 0, z: 0 }
|
|
37
|
+
},
|
|
38
|
+
eyeDistance: 0,
|
|
39
|
+
blendshapes: {},
|
|
40
|
+
mirrored: !0
|
|
41
|
+
}), l = (s, e) => {
|
|
42
|
+
e.x = s.x, e.y = s.y, e.z = s.z;
|
|
43
|
+
}, y = (s, e, n = 0, t) => {
|
|
44
|
+
var m, r, a;
|
|
45
|
+
const c = (m = e.faceLandmarks) == null ? void 0 : m[n], i = s.getFace(n);
|
|
46
|
+
if (!c || !i) return null;
|
|
47
|
+
const o = t ?? Y();
|
|
48
|
+
return o.index = n, o.landmarks = c, x(c, o.bounds), l(i.transform.position, o.pose.position), l(i.transform.rotation, o.pose.rotation), l(i.transform.scale, o.pose.scale), o.eyeDistance = X(c), p((a = (r = e.faceBlendshapes) == null ? void 0 : r[n]) == null ? void 0 : a.categories, o.blendshapes), o.mirrored = i.mirrored !== !1, o;
|
|
49
|
+
}, D = (s, e = 0, n) => {
|
|
50
|
+
const t = s.getDetectionResults();
|
|
51
|
+
return t ? y(s, t, e, n) : null;
|
|
52
|
+
};
|
|
53
|
+
export {
|
|
54
|
+
d as D,
|
|
55
|
+
Y as a,
|
|
56
|
+
D as b,
|
|
57
|
+
x as c,
|
|
58
|
+
u as d,
|
|
59
|
+
X as e,
|
|
60
|
+
y as g,
|
|
61
|
+
E as h
|
|
62
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { FeedVec } from './armMask';
|
|
2
|
+
import * as THREE from "three";
|
|
3
|
+
/**
|
|
4
|
+
* Experimental (vincentt-xr/sdk#319): may change in a later alpha.
|
|
5
|
+
*
|
|
6
|
+
* Puts a wrist frame on the arm found in a mask, on screen: turns it about the
|
|
7
|
+
* camera ray through the wrist so its −Y (up the arm) runs along the arm,
|
|
8
|
+
* moves it across to the arm's middle, and scales its cross-section (X, Z) so
|
|
9
|
+
* the wrist's ellipse is as wide on screen as the arm. Depth and roll stay the
|
|
10
|
+
* hand's: one camera only sees the arm's outline.
|
|
11
|
+
*/
|
|
12
|
+
export type WristFitTarget = {
|
|
13
|
+
/** Unit, up the arm (toward the elbow), feed units (x right, y down). */
|
|
14
|
+
up: FeedVec;
|
|
15
|
+
/** Move across the arm this far, feed units (+ = clockwise side of `up`). */
|
|
16
|
+
shift: number;
|
|
17
|
+
/** The arm's width on screen, feed units; null: keep the size. */
|
|
18
|
+
width: number | null;
|
|
19
|
+
/** The wrist's half-width (X) and half-depth (Z) in the frame's own units. */
|
|
20
|
+
halfWidth: number;
|
|
21
|
+
halfDepth: number;
|
|
22
|
+
/** Clamp for the width scale: a gentle nudge. Default `[0.85, 1.2]`. */
|
|
23
|
+
scaleRange?: readonly [number, number];
|
|
24
|
+
};
|
|
25
|
+
/** World point → feed units (x right 0..aspect, y down 0..1). */
|
|
26
|
+
export declare const worldToFeedUnits: (point: THREE.Vector3, camera: THREE.Camera, aspect: number, out?: FeedVec) => FeedVec;
|
|
27
|
+
/** Signed angle from `a` to `b`, radians, positive clockwise on screen (y down). */
|
|
28
|
+
export declare const screenAngle: (a: FeedVec, b: FeedVec) => number;
|
|
29
|
+
/** The frame's −Y (up the arm) on screen, unit, feed units. */
|
|
30
|
+
export declare const frameUpOnScreen: (frame: THREE.Matrix4, camera: THREE.Camera, aspect: number, out?: FeedVec) => FeedVec;
|
|
31
|
+
/**
|
|
32
|
+
* How much of the frame's arm axis (Y) shows on screen, 0..1: 1 while it runs
|
|
33
|
+
* across the view, 0 when it points at (or away from) the camera. From its
|
|
34
|
+
* on-screen length against the longer of X and Z (across the arm).
|
|
35
|
+
*/
|
|
36
|
+
export declare const axisOnScreen: (frame: THREE.Matrix4, camera: THREE.Camera, aspect: number) => number;
|
|
37
|
+
/** The frame's local ellipse (`halfWidth` × `halfDepth` in X / Z) across `up` on screen, feed units. */
|
|
38
|
+
export declare const ellipseWidthOnScreen: (frame: THREE.Matrix4, halfWidth: number, halfDepth: number, up: FeedVec, camera: THREE.Camera, aspect: number) => number;
|
|
39
|
+
/**
|
|
40
|
+
* The wrist frame (`frame`, world; origin on the wrist, +Y toward the
|
|
41
|
+
* fingers) fitted to `target`, blended in by `weight` (0..1). Writes the
|
|
42
|
+
* fitted frame into `out` (turned and moved: a rigid change) and returns the
|
|
43
|
+
* scale across the arm (X, Z) that fits its width, `1` without one: applied
|
|
44
|
+
* by what sits on the frame, so a bone never takes a shearing scale.
|
|
45
|
+
*/
|
|
46
|
+
export declare const fitWristFrame: (frame: THREE.Matrix4, camera: THREE.Camera, aspect: number, target: WristFitTarget, weight: number, out: THREE.Matrix4) => number;
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { HandPose } from './handPose';
|
|
2
|
+
/**
|
|
3
|
+
* Experimental (vincentt-xr/sdk#319): may change in a later alpha.
|
|
4
|
+
*
|
|
5
|
+
* The forearm in a segmentation mask (the portrait mask's person, or the
|
|
6
|
+
* multiclass mask's bare skin), measured from the tracked wrist: which way the
|
|
7
|
+
* arm runs on screen and how wide it is. Wristwear uses it so a strap lines up
|
|
8
|
+
* with the real arm, not just the hand's axis, and fits its width.
|
|
9
|
+
*
|
|
10
|
+
* Units: "feed units", isotropic, x right and y down, 1 = the feed's height
|
|
11
|
+
* (x runs 0..aspect). Lengths along and across the arm are given in cm and
|
|
12
|
+
* converted with the hand's own scale (`unitsPerCm`), so they don't depend on
|
|
13
|
+
* how far the hand is.
|
|
14
|
+
*/
|
|
15
|
+
export type FeedVec = {
|
|
16
|
+
x: number;
|
|
17
|
+
y: number;
|
|
18
|
+
};
|
|
19
|
+
/** A mask to look for the arm in: `inside(i)` for the row-major pixel `i` (row 0 at the top). */
|
|
20
|
+
export type ArmMaskSource = {
|
|
21
|
+
width: number;
|
|
22
|
+
height: number;
|
|
23
|
+
inside: (index: number) => boolean;
|
|
24
|
+
};
|
|
25
|
+
/** Where to look: from the hand. */
|
|
26
|
+
export type ArmQuery = {
|
|
27
|
+
/** The wrist joint, feed units. */
|
|
28
|
+
wrist: FeedVec;
|
|
29
|
+
/** Unit, from the middle knuckle to the wrist: the hand's axis, pointing up the arm. */
|
|
30
|
+
toElbow: FeedVec;
|
|
31
|
+
/** Feed units per cm at the hand. */
|
|
32
|
+
unitsPerCm: number;
|
|
33
|
+
/** Feed width / height. */
|
|
34
|
+
aspect: number;
|
|
35
|
+
};
|
|
36
|
+
export type ArmMeasureOptions = {
|
|
37
|
+
/** Cross-sections up the arm from the wrist, cm. Default `[2, 4, 6, 8]`. */
|
|
38
|
+
along?: readonly number[];
|
|
39
|
+
/** Where the width is measured, cm up the arm. Default 1.5. */
|
|
40
|
+
widthAt?: number;
|
|
41
|
+
/**
|
|
42
|
+
* A cross-section wider than this isn't the arm (it runs into the body or a
|
|
43
|
+
* sleeve's surroundings), cm. Default 11.
|
|
44
|
+
*/
|
|
45
|
+
maxWidth?: number;
|
|
46
|
+
/** Narrower than this isn't the arm (noise, a finger), cm. Default 2.5. */
|
|
47
|
+
minWidth?: number;
|
|
48
|
+
/**
|
|
49
|
+
* The arm may turn at most this far from the hand's axis, degrees: a wrist
|
|
50
|
+
* bends up to about 80–90° (a fist hanging from a level arm). Default 95.
|
|
51
|
+
*/
|
|
52
|
+
maxTurn?: number;
|
|
53
|
+
};
|
|
54
|
+
export declare const ARM_MASK_DEFAULTS: Readonly<{
|
|
55
|
+
along: readonly number[];
|
|
56
|
+
widthAt: 1.5;
|
|
57
|
+
maxWidth: 11;
|
|
58
|
+
minWidth: 2.5;
|
|
59
|
+
maxTurn: 95;
|
|
60
|
+
}>;
|
|
61
|
+
/** One cross-section across the arm, for debugging: its edges, feed units. */
|
|
62
|
+
export type ArmSection = {
|
|
63
|
+
a: FeedVec;
|
|
64
|
+
b: FeedVec;
|
|
65
|
+
ok: boolean;
|
|
66
|
+
};
|
|
67
|
+
export type ArmMeasure = {
|
|
68
|
+
/** Unit, up the arm (toward the elbow), feed units. */
|
|
69
|
+
direction: FeedVec;
|
|
70
|
+
/**
|
|
71
|
+
* Signed angle from the hand's axis (`toElbow`) to `direction`, radians;
|
|
72
|
+
* positive turns clockwise on screen. The arm's bend at the wrist, which
|
|
73
|
+
* changes slowly: apply it to the hand's current axis.
|
|
74
|
+
*/
|
|
75
|
+
bend: number;
|
|
76
|
+
/**
|
|
77
|
+
* The arm's width across, cm: the narrowest closed cross-section from
|
|
78
|
+
* `widthAt` up the arm (the wrist is the narrowest part, and a cross-section
|
|
79
|
+
* by a bent wrist can clip the hand).
|
|
80
|
+
*/
|
|
81
|
+
width: number;
|
|
82
|
+
/** The arm's middle at `widthAt`, feed units. */
|
|
83
|
+
center: FeedVec;
|
|
84
|
+
/** Cross-sections that found the arm, of those tried (0..1). */
|
|
85
|
+
confidence: number;
|
|
86
|
+
/** The last pass's cross-sections and the width one, for drawing. */
|
|
87
|
+
sections: ArmSection[];
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* The hand's wrist, axis and scale in feed units, from its pose (`image` in
|
|
91
|
+
* tracker space, `world` in cm). `null` when the hand points at the camera
|
|
92
|
+
* (its axis is too short on screen to trust).
|
|
93
|
+
*/
|
|
94
|
+
export declare const armQueryOf: (pose: Pick<HandPose, "image" | "world">, aspect: number) => ArmQuery | null;
|
|
95
|
+
/**
|
|
96
|
+
* Measures the arm in `source` from the hand (`query`): cross-sections up the
|
|
97
|
+
* arm find its edges, a line through their middles (and the wrist) gives its
|
|
98
|
+
* direction, and a second pass across that direction refines it and the
|
|
99
|
+
* width. `null` when fewer than two cross-sections find a closed arm (it runs
|
|
100
|
+
* into the body or off the screen), or it turns implausibly far from the hand.
|
|
101
|
+
*/
|
|
102
|
+
export declare const measureArm: (source: ArmMaskSource, query: ArmQuery, options?: ArmMeasureOptions) => ArmMeasure | null;
|
|
103
|
+
export type ArmFitSettings = {
|
|
104
|
+
/** Each new measure eases the fit this far, 0..1. Default 0.4. */
|
|
105
|
+
smoothing: number;
|
|
106
|
+
/** After the arm is lost, keep the last fit this long, ms. Default 400. */
|
|
107
|
+
holdMs: number;
|
|
108
|
+
/** Then ease back to the hand's own axis over about this long, ms. Default 300. */
|
|
109
|
+
fadeMs: number;
|
|
110
|
+
/**
|
|
111
|
+
* Measure a mask against the hand pose nearest its time, at most this far
|
|
112
|
+
* apart, ms; further apart (the hand moved on) it waits for the next mask.
|
|
113
|
+
* Default 70.
|
|
114
|
+
*/
|
|
115
|
+
maxSkewMs: number;
|
|
116
|
+
/** The fit may move the strap at most this far across the arm, cm. Default 2. */
|
|
117
|
+
maxShift: number;
|
|
118
|
+
};
|
|
119
|
+
export declare const ARM_FIT_DEFAULTS: Readonly<ArmFitSettings>;
|
|
120
|
+
/**
|
|
121
|
+
* Follows the arm across masks for one hand: each new mask is measured against
|
|
122
|
+
* the hand pose from the same moment (masks arrive later than hand poses), and
|
|
123
|
+
* the result is kept relative to the hand (a bend, a width, a sideways shift),
|
|
124
|
+
* so it stays right while the hand moves between masks. `weight` (0..1) says
|
|
125
|
+
* how much of it to apply: 1 once the arm is found, until a mask comes
|
|
126
|
+
* without it; then held for `holdMs` and faded to 0 over `fadeMs`.
|
|
127
|
+
*/
|
|
128
|
+
export declare class ArmTracker {
|
|
129
|
+
/** Radians, clockwise on screen, from the hand's axis to the arm's. */
|
|
130
|
+
bend: number;
|
|
131
|
+
/** The arm's width, cm (null until measured). */
|
|
132
|
+
width: number | null;
|
|
133
|
+
/** How far the arm's middle is from the hand's axis, across it, cm (+ = clockwise side). */
|
|
134
|
+
shift: number;
|
|
135
|
+
/** 0..1, how much of the fit applies (found, held or fading). */
|
|
136
|
+
weight: number;
|
|
137
|
+
/** 0..1, how sure the measures are (closed cross-sections, eased): blends the fit with the hand. */
|
|
138
|
+
confidence: number;
|
|
139
|
+
/** The last measure, for drawing. */
|
|
140
|
+
last: ArmMeasure | null;
|
|
141
|
+
settings: ArmFitSettings;
|
|
142
|
+
private history;
|
|
143
|
+
/** There is a fit (measured, not yet faded out). */
|
|
144
|
+
private found;
|
|
145
|
+
/** When a mask first came without the arm since the last fit. */
|
|
146
|
+
private lostAtMs;
|
|
147
|
+
constructor(settings?: Partial<ArmFitSettings>);
|
|
148
|
+
/**
|
|
149
|
+
* The hand's query at a detection (`HandPose.timestampMs`); `null` when the
|
|
150
|
+
* hand's axis can't be used (it points at the camera): `query` reads null
|
|
151
|
+
* then, and nothing steers by an old axis.
|
|
152
|
+
*/
|
|
153
|
+
pushHand(timeMs: number, query: ArmQuery | null): void;
|
|
154
|
+
/** The newest hand query (the hand now), null while its axis is unusable. */
|
|
155
|
+
get query(): ArmQuery | null;
|
|
156
|
+
/**
|
|
157
|
+
* The hand hasn't moved over the kept history (within 0.5 cm and 3°): any
|
|
158
|
+
* of its poses matches a mask from within that time.
|
|
159
|
+
*/
|
|
160
|
+
private still;
|
|
161
|
+
/**
|
|
162
|
+
* Measures a new mask (taken at `maskTimeMs`, or now when unknown) against
|
|
163
|
+
* the hand from the same moment (or the newest, while the hand is still).
|
|
164
|
+
* Returns the measure, or null when the arm wasn't found (that starts the
|
|
165
|
+
* hold, then the fade) or no hand pose matches the mask's time (nothing
|
|
166
|
+
* changes: wait for the next mask).
|
|
167
|
+
*/
|
|
168
|
+
measure(mask: ArmMaskSource, maskTimeMs: number | undefined, options?: ArmMeasureOptions): ArmMeasure | null;
|
|
169
|
+
/**
|
|
170
|
+
* Advances the hold and fade (call every frame with `performance.now()`).
|
|
171
|
+
* A fit holds until a mask comes without the arm, then for `holdMs`, then
|
|
172
|
+
* fades over `fadeMs`; no new mask changes nothing.
|
|
173
|
+
*/
|
|
174
|
+
step(nowMs: number): void;
|
|
175
|
+
private clear;
|
|
176
|
+
/** Forget everything (the hand was lost). */
|
|
177
|
+
reset(): void;
|
|
178
|
+
}
|