@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,231 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "External Face Mesh"
|
|
3
|
+
description: "Wear your own head or face model on the tracked face: it follows the head pose and the face's expression, with any topology and UV layout."
|
|
4
|
+
sidebarTitle: "External Face Mesh"
|
|
5
|
+
icon: "masks-theater"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
`ExternalFaceMesh` puts your own face model on the tracked face. It follows the head pose and the
|
|
9
|
+
face's expression in two ways at once:
|
|
10
|
+
|
|
11
|
+
- **Landmarks:** the tracked landmarks bend the mesh, so the jaw opens and the lips and cheeks move.
|
|
12
|
+
- **Morphs:** the model's own ARKit-named morph targets play the face's blendshapes. That gives an
|
|
13
|
+
authored blink and raised brows, and the eyeballs turn with the gaze.
|
|
14
|
+
|
|
15
|
+
It is the foundation of the face-character pipeline
|
|
16
|
+
([#194](https://github.com/vincentt-xr/sdk/issues/194)). Expression controllers, pinned accessories
|
|
17
|
+
and face reprojection build on the same `FaceRig`.
|
|
18
|
+
|
|
19
|
+
Import from `@vincentt-xr/sdk/face-effects`.
|
|
20
|
+
|
|
21
|
+
## Quick start
|
|
22
|
+
|
|
23
|
+
```tsx
|
|
24
|
+
import { useLoader } from "@react-three/fiber";
|
|
25
|
+
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";
|
|
26
|
+
import { FaceTracker } from "@vincentt-xr/sdk/tracking";
|
|
27
|
+
import { ExternalFaceMesh } from "@vincentt-xr/sdk/face-effects";
|
|
28
|
+
|
|
29
|
+
const Character = () => {
|
|
30
|
+
const head = useLoader(GLTFLoader, headUrl); // authored in canonical centimetres
|
|
31
|
+
return (
|
|
32
|
+
<FaceTracker>
|
|
33
|
+
<ExternalFaceMesh model={head.scene} />
|
|
34
|
+
</FaceTracker>
|
|
35
|
+
);
|
|
36
|
+
};
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
It reads the parent `FaceTracker`'s face (or a `HeadBinding`'s) and never acquires the face model
|
|
40
|
+
itself. The model is cloned with its geometry, so one loaded model can back several faces.
|
|
41
|
+
|
|
42
|
+
## Authoring the model
|
|
43
|
+
|
|
44
|
+
Author the model in the **canonical head frame**, the same frame as `CanonicalHeadFrame` and the v3
|
|
45
|
+
head occluder `.blend` in `assets-src/head-occluder/`:
|
|
46
|
+
|
|
47
|
+
- **Units and axes:** centimetres, +Y up, +Z out of the face toward the camera.
|
|
48
|
+
- **Origin:** landmark 4, just above the nose tip, sits at `(0, -0.46, 7.59)`.
|
|
49
|
+
|
|
50
|
+
The easiest way is to open the occluder `.blend` and fit your head over it. Its first 468 vertices
|
|
51
|
+
are the tracked face landmarks, so the eyes, nose and mouth line up when your model sits on them.
|
|
52
|
+
|
|
53
|
+
Any topology and any UV layout works. The face area should lie close to the canonical face surface:
|
|
54
|
+
the closer it is, the more of the face follows the expression. The rest (skull, ears, neck,
|
|
55
|
+
accessories) can go anywhere and stays rigid.
|
|
56
|
+
|
|
57
|
+
## How it follows the face
|
|
58
|
+
|
|
59
|
+
**What drives it** is set by `drive`:
|
|
60
|
+
|
|
61
|
+
| `drive` | What moves it |
|
|
62
|
+
| ------------------ | ---------------------------------------------------------------------------------------------------------------- |
|
|
63
|
+
| `"auto"` (default) | `"morphs"` for a full ARKit set (mouth morphs too), `"hybrid"` with only eye or brow morphs, else `"landmarks"`. |
|
|
64
|
+
| `"hybrid"` | Landmarks for the jaw, lips and cheeks; the model's morphs for the eyes and brows. |
|
|
65
|
+
| `"morphs"` | Only the model's morph targets, driven by the blendshapes; otherwise just the head pose. |
|
|
66
|
+
| `"landmarks"` | Only the landmarks bend the mesh. |
|
|
67
|
+
| `"none"` | The head pose only. |
|
|
68
|
+
|
|
69
|
+
For a model with a full ARKit set, such as Face Cap's, the authored morphs look best, so `"auto"`
|
|
70
|
+
picks `"morphs"`. Binding then plays no part, because nothing is bent.
|
|
71
|
+
|
|
72
|
+
Why hybrid for eye and brow morphs: MediaPipe only tracks the edge of each eyelid, 16 points around each eye. Bending a
|
|
73
|
+
sculpted lid with those points drags its edge down without rolling the lid over the eyeball. That
|
|
74
|
+
leaves slits at the corners and creases the lid. An authored `eyeBlink` morph closes it cleanly, so
|
|
75
|
+
hybrid masks the eye and brow landmarks (`FACE_REGION_MASKS`) and lets the morphs move those parts.
|
|
76
|
+
|
|
77
|
+
**Morph names** map to MediaPipe's 51 blendshape channels (`FACE_MORPH_NAMES`, ARKit names). The
|
|
78
|
+
match accepts:
|
|
79
|
+
|
|
80
|
+
- ARKit names, e.g. `eyeBlinkLeft`;
|
|
81
|
+
- Face Cap and Blender styles, e.g. `eyeBlink_L`, `eyeBlink.L`, `eyeBlink_left`;
|
|
82
|
+
- any case;
|
|
83
|
+
- exporter prefixes such as `blendShape1.`.
|
|
84
|
+
|
|
85
|
+
`Left` is the model's own left (landmark 263's side, MediaPipe's left), as in ARKit. It is driven
|
|
86
|
+
mesh to mesh, so the model's eye in front of the person's blinking eye blinks on every feed (on the
|
|
87
|
+
mirrored webcam that is MediaPipe's right channel for the person's real left eye; GROUNDING "Left
|
|
88
|
+
and right"). MediaPipe has no `tongueOut`.
|
|
89
|
+
Morphs that no channel drives are left alone, so your own animation keeps them. The model's rest pose
|
|
90
|
+
must have every morph at 0.
|
|
91
|
+
|
|
92
|
+
**Binding** happens once, at load. Each vertex is bound to a point on the canonical face surface,
|
|
93
|
+
which is MediaPipe's 853 face triangles. The mouth and eye openings are holes, so a lip never binds
|
|
94
|
+
across the mouth. `binding` picks how:
|
|
95
|
+
|
|
96
|
+
| `binding` | Binds by |
|
|
97
|
+
| ------------------ | ------------------------------------------------------------------------------------ |
|
|
98
|
+
| `"auto"` (default) | UV when the mesh's UVs are a canonical layout (most UV hits agree with 3D), else 3D. |
|
|
99
|
+
| `"uv"` | UV only, for a mesh whose face UVs follow `CANONICAL_FACE_UVS` (either v direction). |
|
|
100
|
+
| `"surface"` | The closest point in 3D. Any topology and layout. |
|
|
101
|
+
|
|
102
|
+
**Influence** depends on how far a vertex sits from the face surface. Within `falloff[0]` (0.8 cm)
|
|
103
|
+
it follows fully; it fades to rigid at `falloff[1]` (2.5 cm). The back of the head, the ears and the
|
|
104
|
+
neck therefore stay rigid.
|
|
105
|
+
|
|
106
|
+
**Parts:** each mesh of the model follows in one of three ways (`parts`, by object name):
|
|
107
|
+
|
|
108
|
+
- `"surface"`: every vertex follows its own point. Use it for skin.
|
|
109
|
+
- `"follow"`: the whole mesh moves as one with the point under its centre, keeping its shape. Use
|
|
110
|
+
it for eyeballs, teeth or a nose ring. A follow part named like an eye (`eye…`) also turns with
|
|
111
|
+
the gaze (`eyeLookIn/Out/Up/Down`, up to `gazeDegrees` = `[25, 20]`).
|
|
112
|
+
- `"rigid"`: head pose only. Use it for a helmet or hair.
|
|
113
|
+
|
|
114
|
+
By default, a mesh whose median vertex sits more than 0.3 cm behind the face (eyeballs, teeth) is
|
|
115
|
+
`"follow"`, and everything else is `"surface"`.
|
|
116
|
+
|
|
117
|
+
**Neutral.** Only the expression moves the model, not the person's own face shape or resting
|
|
118
|
+
expression. With `neutral: "auto"` (default), the rig averages the landmarks and the blendshape
|
|
119
|
+
scores over the first `neutralMs` (600 ms) after the face is found, and subtracts that rest face. The
|
|
120
|
+
blendshapes are rescaled, so a resting 0.1 reads 0 and a full blink still reads 1. It recaptures every time the face is found again, and when
|
|
121
|
+
`neutralKey` changes: bind it to a "Recalibrate" button and ask the person to relax and look at the
|
|
122
|
+
camera. With `neutral: "none"` the model also takes on the person's face shape (wider eyes, a longer
|
|
123
|
+
jaw).
|
|
124
|
+
|
|
125
|
+
## `ExternalFaceMesh`
|
|
126
|
+
|
|
127
|
+
| Prop | Default | What it does |
|
|
128
|
+
| --------------------- | ------------- | ------------------------------------------------------------------------------------------- |
|
|
129
|
+
| `model` | — | The face model (e.g. a GLTF scene) in the canonical head frame. |
|
|
130
|
+
| `drive` | `"auto"` | What moves it: `"auto"`, `"hybrid"`, `"morphs"`, `"landmarks"` or `"none"`. |
|
|
131
|
+
| `binding` | `"auto"` | `"auto"`, `"uv"` or `"surface"`. |
|
|
132
|
+
| `falloff` | `[0.8, 2.5]` | Full influence up to the first distance (cm), rigid beyond the second. |
|
|
133
|
+
| `parts` | auto | Per mesh name: `"surface"`, `"follow"` or `"rigid"`. |
|
|
134
|
+
| `expression` | `1` | 0 = rigid, 1 = the tracked face, > 1 exaggerates. |
|
|
135
|
+
| `morphGain` | — | A gain per channel on its morph, e.g. `{ eyeBlinkLeft: 1.2 }`. |
|
|
136
|
+
| `gazeDegrees` | `[25, 20]` | How far a full look turns an eyeball: sideways, up/down (degrees). |
|
|
137
|
+
| `onBind` | — | Called once per model with every mesh's binding (readouts, debug views). |
|
|
138
|
+
| `faceIndex` | the tracker's | Which tracked face (when not inside a `FaceRig`; likewise the rows below). |
|
|
139
|
+
| `smoothing` | `0.5` | Head pose EMA while still (`1` = none). Fast turns follow at once, so a shake never trails. |
|
|
140
|
+
| `expressionSmoothing` | `0.6` | Expression EMA, `1` = none. MediaPipe's depth is noisy; a little keeps the mesh calm. |
|
|
141
|
+
| `holdMs` | `250` | Keep the last pose and expression through shorter dropouts. |
|
|
142
|
+
| `neutral` | `"auto"` | `"auto"` subtracts the captured rest face; `"none"` keeps the person's face shape. |
|
|
143
|
+
| `neutralMs` | `600` | How long the neutral capture averages. |
|
|
144
|
+
| `neutralKey` | — | A new value captures the neutral again. |
|
|
145
|
+
| `leadMs` | `0` | Landmark lead between inferences (One Euro + velocity, at most this long). 0 = raw. |
|
|
146
|
+
| `onTrackingChange` | — | Called once on found (`true`) and once on lost (`false`). |
|
|
147
|
+
| `children` | — | More content in the canonical head frame. |
|
|
148
|
+
|
|
149
|
+
## `FaceRig`
|
|
150
|
+
|
|
151
|
+
`FaceRig` is the engine underneath, and every face-character component shares one. It is a group in
|
|
152
|
+
the canonical head frame, like `CanonicalHeadFrame`, that also publishes the face's expression. Put
|
|
153
|
+
several components inside one `FaceRig` to share it:
|
|
154
|
+
|
|
155
|
+
```tsx
|
|
156
|
+
<FaceTracker>
|
|
157
|
+
<FaceRig neutralKey={recalibrations}>
|
|
158
|
+
<ExternalFaceMesh model={head.scene} />
|
|
159
|
+
<ExternalFaceMesh model={beard.scene} />
|
|
160
|
+
</FaceRig>
|
|
161
|
+
</FaceTracker>
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
`useFaceRig()` returns a ref to the live `FaceRigState`. Read it inside `useFrame`:
|
|
165
|
+
|
|
166
|
+
- `tracking`: `"tracked"`, `"held"` or `"lost"`.
|
|
167
|
+
- `pose`: `{ position, quaternion, scale }`, canonical cm → world.
|
|
168
|
+
- `local`: the 468 landmarks in the head frame (cm).
|
|
169
|
+
- `residual`: the expression, as each landmark's offset from the rest face (cm, 468 × 3).
|
|
170
|
+
- `morphs`: the 51 blendshape channels (0..1, neutral removed).
|
|
171
|
+
- `neutral`, `morphNeutral` and `neutralState`.
|
|
172
|
+
|
|
173
|
+
The rig holds its last state through dropouts shorter than `holdMs`, hides when the face is lost,
|
|
174
|
+
and snaps on reacquire.
|
|
175
|
+
|
|
176
|
+
The pure pieces are exported for custom renderers:
|
|
177
|
+
|
|
178
|
+
- `stepFaceRig(state, worldLandmarks, nowMs, options, scores)`, `createFaceRigState()` and
|
|
179
|
+
`recalibrateFaceRig(state)`.
|
|
180
|
+
- `bindFaceMesh(positionsCm, uvs, { mode, falloff, uvTolerance })` and
|
|
181
|
+
`deformFaceMesh(binding, rest, residual, out, amount, toLocal)`.
|
|
182
|
+
- `bindFaceModel(root, options)`, `planFaceDrive(meshes, mode)` and
|
|
183
|
+
`driveFaceModel(meshes, plan, rig, options)`.
|
|
184
|
+
- `faceMorphChannel(name)`, `faceMorphRegion`, `FACE_GAZE_CHANNELS` and `FACE_REGION_MASKS`.
|
|
185
|
+
- The canonical data: `CANONICAL_FACE_POSITIONS`, `CANONICAL_FACE_TRIANGLES` and
|
|
186
|
+
`CANONICAL_FACE_UVS`.
|
|
187
|
+
|
|
188
|
+
## Example
|
|
189
|
+
|
|
190
|
+
`/external-face-mesh` wears the three.js "facecap" head when it is present. The file goes in the
|
|
191
|
+
git-ignored `example/src/assets/models/local/facecap-canonical.glb`; it has no redistribution
|
|
192
|
+
licence, so it is never committed. That copy is prepared as follows:
|
|
193
|
+
|
|
194
|
+
- aligned to the canonical frame;
|
|
195
|
+
- ears raised to the anatomical height (brow to nose base);
|
|
196
|
+
- every morph zeroed at rest (the original kept a frame of its animation).
|
|
197
|
+
|
|
198
|
+
It carries all 52 ARKit morphs, of which 51 are tracked. Without it, the page uses the canonical
|
|
199
|
+
head.
|
|
200
|
+
|
|
201
|
+
The page has controls for:
|
|
202
|
+
|
|
203
|
+
- drive, binding, expression and falloff;
|
|
204
|
+
- a binding heat map (red follows, blue rigid);
|
|
205
|
+
- keeping the face shape;
|
|
206
|
+
- recalibrating the neutral;
|
|
207
|
+
- the head occluder and two faces.
|
|
208
|
+
|
|
209
|
+
## Manual visual test plan
|
|
210
|
+
|
|
211
|
+
Open `/external-face-mesh` on the webcam.
|
|
212
|
+
|
|
213
|
+
1. **Placement**: the model sits on your head, with its eyes, nose and mouth on yours, and stays
|
|
214
|
+
there as you turn and tilt.
|
|
215
|
+
2. **Neutral**: look at the camera relaxed when it appears. At rest it keeps its own shape: eyes
|
|
216
|
+
not stretched, jaw not lengthened. Tick "keep the person's face shape" and it conforms to yours;
|
|
217
|
+
untick it.
|
|
218
|
+
3. **Expression**: open your mouth (the jaw drops and the lips part, never stretching across), smile
|
|
219
|
+
(the mouth corners and cheeks move), raise your brows. With drive "none", nothing moves but the
|
|
220
|
+
pose.
|
|
221
|
+
4. **Blink and gaze** (facecap, drive "auto" = morphs): blink one eye, then both. The lid rolls down over the
|
|
222
|
+
eye and closes, with no slit at the corners and no crease. Look left, right, up and down: the
|
|
223
|
+
eyeballs turn with you. Open your mouth and smile: facecap's own jawOpen and smile shapes play.
|
|
224
|
+
Switch drive to "landmarks" to see the difference.
|
|
225
|
+
5. **Parts**: the eyes and teeth move as whole pieces, never squashed. The back of the head and the
|
|
226
|
+
ears stay rigid; the heat map shows red on the face fading to blue.
|
|
227
|
+
6. **Recalibrate**: start with your mouth open, then relax and press Recalibrate. The rest pose is
|
|
228
|
+
corrected.
|
|
229
|
+
7. **Dropouts**: a brief cover of the camera holds the head. Longer, and it hides, then snaps back
|
|
230
|
+
on reacquire.
|
|
231
|
+
8. **Two faces**: on the two-people image, each face wears its own copy.
|
|
@@ -37,21 +37,23 @@ const isPouting = hasFaceAction(face, "mouthPout");
|
|
|
37
37
|
|
|
38
38
|
## Actions
|
|
39
39
|
|
|
40
|
-
| Name | Meaning
|
|
41
|
-
| ------------------------------- |
|
|
42
|
-
| `browRaise` | Either brow is raised
|
|
43
|
-
| `eyeBlink` | Both eyes blink
|
|
44
|
-
| `eyeBlinkEither` | Either eye blinks
|
|
45
|
-
| `eyeBlinkLeft`, `eyeBlinkRight` |
|
|
46
|
-
| `mouthOpen` | Jaw opens
|
|
47
|
-
| `mouthPout` | Lips pucker
|
|
48
|
-
| `headUp`, `headDown` | Pitch from neutral
|
|
49
|
-
| `headTurnLeft`, `headTurnRight` | Yaw from neutral
|
|
50
|
-
| `headTiltLeft`, `headTiltRight` | Roll from neutral
|
|
40
|
+
| Name | Meaning |
|
|
41
|
+
| ------------------------------- | ---------------------------------------------------------------- |
|
|
42
|
+
| `browRaise` | Either brow is raised |
|
|
43
|
+
| `eyeBlink` | Both eyes blink |
|
|
44
|
+
| `eyeBlinkEither` | Either eye blinks |
|
|
45
|
+
| `eyeBlinkLeft`, `eyeBlinkRight` | The person's own left / right eye blinks |
|
|
46
|
+
| `mouthOpen` | Jaw opens |
|
|
47
|
+
| `mouthPout` | Lips pucker |
|
|
48
|
+
| `headUp`, `headDown` | Pitch from neutral |
|
|
49
|
+
| `headTurnLeft`, `headTurnRight` | Yaw from neutral, toward the person's own left / right |
|
|
50
|
+
| `headTiltLeft`, `headTiltRight` | Roll from neutral, toward the person's own left / right shoulder |
|
|
51
51
|
|
|
52
52
|
Blendshape values are in `[0, 1]`. Head values are non-negative radians. Up and
|
|
53
|
-
left follow the SDK convention and are positive before they
|
|
54
|
-
action magnitude.
|
|
53
|
+
the person's own left follow the SDK convention and are positive before they
|
|
54
|
+
are converted to an action magnitude. Left and right are the person's own side
|
|
55
|
+
on every feed: the mirrored webcam, the rear camera, images and video
|
|
56
|
+
(GROUNDING "Left and right").
|
|
55
57
|
|
|
56
58
|
## Neutral head pose
|
|
57
59
|
|
|
@@ -89,15 +91,17 @@ left, right, both, and either-eye movement cases. Use `mouthOpen`, `mouthPout`,
|
|
|
89
91
|
and `browRaise` for the matching physical movements. These actions report
|
|
90
92
|
observable pose/blendshape movement; they do not infer emotion.
|
|
91
93
|
|
|
92
|
-
Left/right blink names
|
|
93
|
-
|
|
94
|
+
Left/right blink names are the person's own eyes on every feed. Raw
|
|
95
|
+
`FaceInfo.blendshapes` keep MediaPipe's names (`eyeBlinkLeft` = MediaPipe's left
|
|
96
|
+
eye: the person's own left on an unmirrored feed, their right on the mirrored
|
|
97
|
+
webcam); the actions read the right one for `face.mirrored`.
|
|
94
98
|
The lifecycle guarantees one `stay` frame between `begin` and `end`, including
|
|
95
99
|
for a blink that drops below its release threshold on the next input frame.
|
|
96
100
|
|
|
97
101
|
For image-based happy, sad, angry, fear, disgust, surprise, neutral, and unknown
|
|
98
102
|
classification, use the separate `useFaceAttributeExpression` hook. The SDK
|
|
99
103
|
does not fabricate these labels from movement thresholds. The verified
|
|
100
|
-
`/
|
|
104
|
+
`/face-actions` page exposes both independent surfaces.
|
|
101
105
|
|
|
102
106
|
Use `/face-actions` to view every value, calibrate neutral pose, adjust the
|
|
103
107
|
selected action, and repeat the live verification checklist. All actions and
|
|
@@ -82,6 +82,6 @@ Without those headers, ONNX Runtime falls back to single-threaded WASM.
|
|
|
82
82
|
Treat classifications as model estimates of visible facial expression—not
|
|
83
83
|
ground-truth emotion, intent, identity, or mental state.
|
|
84
84
|
|
|
85
|
-
Use the verified `/
|
|
85
|
+
Use the verified `/face-actions` page to inspect the live winning
|
|
86
86
|
class and all seven probabilities. Its real-camera model flow, including every
|
|
87
87
|
expression class, was verified on 26 July 2026.
|
|
@@ -7,7 +7,9 @@ icon: "locate-fixed"
|
|
|
7
7
|
|
|
8
8
|
Use `TrackingAnchor` to attach content to semantic face locations. Build editor
|
|
9
9
|
dropdowns from `FACE_TARGETS`; do not copy landmark indices or invent target
|
|
10
|
-
strings. Left and right
|
|
10
|
+
strings. Left and right are the tracked person's own side on every feed (GROUNDING "Left and
|
|
11
|
+
right"): `face.leftEarlobe` is their real left ear lobe on the mirrored webcam (the screen's left)
|
|
12
|
+
and on a video (the screen's right).
|
|
11
13
|
|
|
12
14
|
## Presets
|
|
13
15
|
|
|
@@ -33,7 +35,7 @@ does not provide anatomical earlobe points.
|
|
|
33
35
|
## Custom points
|
|
34
36
|
|
|
35
37
|
For `face.custom`, pass `customAnchorPoint`. X and Y are clamped to `[-1, 1]`;
|
|
36
|
-
the origin is face center, X runs from the person's left to right, Y runs from
|
|
38
|
+
the origin is face center, X runs from the person's own left to right on every feed, Y runs from
|
|
37
39
|
chin to forehead, and positive Z points toward the camera.
|
|
38
40
|
|
|
39
41
|
```tsx
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Face Character (end to end)"
|
|
3
|
+
description: "Every face-character piece together: a cute warp of your real face, a transform into a character, the character with your eyes and mouth, pins, a hat behind the head and hands in front."
|
|
4
|
+
sidebarTitle: "Face Character"
|
|
5
|
+
icon: "masks-theater"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
This page puts the face-character pipeline ([#194](https://github.com/vincentt-xr/sdk/issues/194),
|
|
9
|
+
#200) together in one lens, for up to two people at once. Each piece has its own page:
|
|
10
|
+
|
|
11
|
+
| Piece | What it does here |
|
|
12
|
+
| ------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
|
|
13
|
+
| [`FaceWarp3D`](/api/face-warp-3d) | "You": your real face made cute (a bigger-eyes shape key), photoreal |
|
|
14
|
+
| [`FaceMorph`](/api/face-morph) | "Transform": your face swells into the character, your eyes flowing into its eyes |
|
|
15
|
+
| [`ExternalFaceMesh`](/api/external-face-mesh) | "Character": the character head, following your head |
|
|
16
|
+
| [`FaceExpressionController`](/api/face-expression-controller) | Plays the character's shape keys from your expression, plus blush, sparkles and a wink counter |
|
|
17
|
+
| [`FaceReprojection`](/api/face-reprojection) | Your eyes and mouth on the character (`align` for its cartoon proportions) |
|
|
18
|
+
| [`PinToFaceMesh`](/api/pin-to-face-mesh) | A bow and a star that ride the warp, the morph and the character's skin |
|
|
19
|
+
| [`HeadAttachment`](/api/head-occluder) + occluder | A party hat whose back goes behind your head |
|
|
20
|
+
| `HandCutout` | Your hands stay in front of all of it |
|
|
21
|
+
|
|
22
|
+
## The structure
|
|
23
|
+
|
|
24
|
+
```tsx
|
|
25
|
+
import {
|
|
26
|
+
ExternalFaceMesh,
|
|
27
|
+
FaceExpressionController,
|
|
28
|
+
FaceMorph,
|
|
29
|
+
FaceReprojection,
|
|
30
|
+
FaceRig,
|
|
31
|
+
FaceWarp3D,
|
|
32
|
+
HeadAttachment,
|
|
33
|
+
HeadBinding,
|
|
34
|
+
PinToFaceMesh,
|
|
35
|
+
} from "@vincentt-xr/sdk/face-effects";
|
|
36
|
+
import { HandCutout, HandTracker } from "@vincentt-xr/sdk/tracking";
|
|
37
|
+
|
|
38
|
+
<HandTracker>
|
|
39
|
+
<HandCutout />
|
|
40
|
+
</HandTracker>;
|
|
41
|
+
|
|
42
|
+
{
|
|
43
|
+
[0, 1].map((faceIndex) => (
|
|
44
|
+
<HeadBinding key={faceIndex} faceIndex={faceIndex} numFaces={2} occluder={{ url: occluderUrl }}>
|
|
45
|
+
<FaceRig>
|
|
46
|
+
{phase === "you" && (
|
|
47
|
+
<FaceWarp3D deformation={cuteShapes} weights={{ cute: 0.7 }}>
|
|
48
|
+
<Pins /> {/* children ride the warp */}
|
|
49
|
+
</FaceWarp3D>
|
|
50
|
+
)}
|
|
51
|
+
{phase === "transform" && (
|
|
52
|
+
<FaceMorph shape={character} align={GHOST_ALIGN} weight={sweepRef} falloff={[4, 9]}>
|
|
53
|
+
<Pins /> {/* children ride the morph */}
|
|
54
|
+
</FaceMorph>
|
|
55
|
+
)}
|
|
56
|
+
{phase === "character" && (
|
|
57
|
+
<FaceExpressionController rules={ghostRules}>
|
|
58
|
+
<group ref={characterRef}>
|
|
59
|
+
<ExternalFaceMesh model={character} drive="none">
|
|
60
|
+
<FaceReprojection region="eyesAndMouth" align={GHOST_ALIGN} meshes={GHOST_WEARS} />
|
|
61
|
+
</ExternalFaceMesh>
|
|
62
|
+
</group>
|
|
63
|
+
<Pins onto={characterRef} /> {/* on the character's skin */}
|
|
64
|
+
</FaceExpressionController>
|
|
65
|
+
)}
|
|
66
|
+
</FaceRig>
|
|
67
|
+
<HeadAttachment point="crown" offset={{ position: [0, 0.6, 0.4] }}>
|
|
68
|
+
<PartyHat />
|
|
69
|
+
</HeadAttachment>
|
|
70
|
+
</HeadBinding>
|
|
71
|
+
));
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Stylised characters
|
|
76
|
+
|
|
77
|
+
The SDK ghost head (`face-v1.glb`) has cartoon proportions: big eyes 3 cm lower than a real face's.
|
|
78
|
+
Pass its own eye and mouth centres as `align` (`{ leftEye, rightEye, mouth }`). `FaceReprojection` and
|
|
79
|
+
`FaceMorph` then bind it as if those sat on your face, so your eyes land on its eyes.
|
|
80
|
+
|
|
81
|
+
Being rounder than a real face, it also needs a wider `FaceMorph` `falloff` (`[4, 9]`). Name the parts
|
|
82
|
+
that wear your face with `meshes`. Eye parts are found by mesh or material name (`eye…`, `iris…`).
|
|
83
|
+
|
|
84
|
+
### Expressions on a character's own shape keys
|
|
85
|
+
|
|
86
|
+
The ghost's shape keys (`smile`, `wink`, `surprised`, `kiss`, `puffCheeks`, `frown`, `scrunch`) are
|
|
87
|
+
played by `FaceExpressionController` rules from ARKit channels. That's why the `ExternalFaceMesh` uses
|
|
88
|
+
`drive="none"`.
|
|
89
|
+
|
|
90
|
+
The same controller also handles the extras:
|
|
91
|
+
|
|
92
|
+
- the blush's opacity follows your smile;
|
|
93
|
+
- sparkles show while your mouth is open;
|
|
94
|
+
- each wink triggers a counter.
|
|
95
|
+
|
|
96
|
+
### Draw order and the head occluder
|
|
97
|
+
|
|
98
|
+
The occluder is your real head, skull included. It must hide what is behind your head, like the
|
|
99
|
+
hat's back. It must never hide the face effects, including a character head smaller than your skull.
|
|
100
|
+
|
|
101
|
+
Everything that is the face draws first, at `FACE_SURFACE_RENDER_ORDER` (-2), before the occluder
|
|
102
|
+
(-1, on its meshes). Accessories come after (0). Set render orders on meshes, never on a `Group`:
|
|
103
|
+
three sorts by the nearest group first.
|
|
104
|
+
|
|
105
|
+
### Hands in front
|
|
106
|
+
|
|
107
|
+
`HandCutout` draws your hands' silhouettes as near-plane depth before everything else. A hand over your
|
|
108
|
+
face shows the real hand in front of the warp, the character, the pins and the hat.
|
|
109
|
+
|
|
110
|
+
## Example
|
|
111
|
+
|
|
112
|
+
`/face-character` has:
|
|
113
|
+
|
|
114
|
+
- **A Transform button.**
|
|
115
|
+
- **Controls:**
|
|
116
|
+
- the character (the ghost head, or facecap when the local file is present);
|
|
117
|
+
- "cute you";
|
|
118
|
+
- your eyes and mouth on the character;
|
|
119
|
+
- a toon material;
|
|
120
|
+
- the head occluder;
|
|
121
|
+
- hands in front;
|
|
122
|
+
- one or two people.
|
|
123
|
+
- **Badges** for each face's tracking and a wink count.
|
|
124
|
+
|
|
125
|
+
URL options:
|
|
126
|
+
|
|
127
|
+
- `?phase=character` starts as the character;
|
|
128
|
+
- `?hold=0.5` freezes the transform at that weight, for inspection;
|
|
129
|
+
- `?faces=1`, `?occluder=0`, `?hands=0`, `?wear=0` and `?toon=1` set the controls.
|
|
130
|
+
|
|
131
|
+
## Manual visual test plan
|
|
132
|
+
|
|
133
|
+
Open `/face-character` on the webcam.
|
|
134
|
+
|
|
135
|
+
1. **You**: your eyes are bigger and the face looks real. The bow sits on the side of your forehead
|
|
136
|
+
and the star on your cheek; both move with your face. The hat sits on your crown, and turning your
|
|
137
|
+
head hides its back behind your head.
|
|
138
|
+
2. **Transform**: your face swells into the ghost over about 1.5 s. Your eyes flow into its eyes, and
|
|
139
|
+
the bow and star ride along. "Back to you" reverses it.
|
|
140
|
+
3. **Character**:
|
|
141
|
+
- the whole round ghost is visible, with nothing cut away by the occluder;
|
|
142
|
+
- your eyes and mouth are on it;
|
|
143
|
+
- smile: it smiles and blushes;
|
|
144
|
+
- wink: the counter goes up;
|
|
145
|
+
- open your mouth: sparkles;
|
|
146
|
+
- puff your cheeks, kiss, frown and scrunch: it does too.
|
|
147
|
+
4. **Occluder**: toggle the head occluder. The face effects never change; only the hat's back hides
|
|
148
|
+
or shows.
|
|
149
|
+
5. **Hands**: put a hand over your face in every phase. The real hand stays in front of the warp, the
|
|
150
|
+
character, the pins and the hat. Turn the toggle off and they draw over your hand.
|
|
151
|
+
6. **Two people**: with two faces in view, each gets its own lens. The badges follow each face.
|
|
152
|
+
7. **Tracking loss**: cover your face. The lens holds briefly, then hides (the badge says "lost") and
|
|
153
|
+
comes back on reacquire.
|
|
154
|
+
8. **Mirror**: switch between the webcam and the sample media. Everything stays on the right side of
|
|
155
|
+
the face.
|
|
156
|
+
9. **facecap** (local): pick facecap. The transform and the character work on a realistic head, with
|
|
157
|
+
no `align` needed.
|
|
@@ -9,10 +9,19 @@ This section is split into focused pages:
|
|
|
9
9
|
|
|
10
10
|
- [Face Mesh](/api/face-mesh) for the base 3D face mesh, canonical renderer,
|
|
11
11
|
and face mesh material settings.
|
|
12
|
+
- [Head Occluder](/api/head-occluder) for `HeadBinding`, the canonical-fit
|
|
13
|
+
depth-only head mesh and `CanonicalHeadFrame`, so 3D accessories pass behind
|
|
14
|
+
the tracked head.
|
|
12
15
|
- [Face Painting](/api/face-painting) for the composite shader variant used to
|
|
13
16
|
paint onto the live face mesh.
|
|
14
17
|
- [Face Retouching](/api/face-retouching) for the legacy skin-retouch shader
|
|
15
18
|
and its controls.
|
|
19
|
+
- [Segmentation Overlay](/api/segmentation-overlay) for 2D semantic region
|
|
20
|
+
layers (lips, eyes, brows, face skin, person, background) without 3D
|
|
21
|
+
geometry, and when to prefer them over the canonical mesh.
|
|
22
|
+
- [Lip Effect Textures](/guides/lip-effect-textures) for `LipEffect`: the
|
|
23
|
+
design-texture canvas contract, the generated lip UV template, mask modes,
|
|
24
|
+
and the custom material context.
|
|
16
25
|
|
|
17
26
|
Use `@vincentt-xr/sdk/tracking` for trackers, `FaceInfo`, Face Actions, and the
|
|
18
27
|
bare deforming `FaceMesh`. Use `@vincentt-xr/sdk/face-effects` for the modular
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Face Expression Controller"
|
|
3
|
+
description: "Turn the tracked expression into behaviour with typed rules: morph targets, material values, visibility, transforms, triggers and your own setters."
|
|
4
|
+
sidebarTitle: "Face Expression Controller"
|
|
5
|
+
icon: "sliders"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
`FaceExpressionController` turns the tracked face's expression into behaviour. Each rule has three
|
|
9
|
+
parts:
|
|
10
|
+
|
|
11
|
+
- an **input**, such as a blendshape, a combination of them, a Face Action or your own function;
|
|
12
|
+
- its **shaping**: range, curve, multiplier, clamp and smoothing;
|
|
13
|
+
- its **outputs**: morph targets, material values, visibility, transforms, triggers or a setter.
|
|
14
|
+
|
|
15
|
+
It is part of the face-character pipeline ([#194](https://github.com/vincentt-xr/sdk/issues/194)):
|
|
16
|
+
#196 is the controller, and #197 is custom morph mapping. It runs on a
|
|
17
|
+
[`FaceRig`](/api/external-face-mesh#facerig).
|
|
18
|
+
|
|
19
|
+
Import from `@vincentt-xr/sdk/face-effects`.
|
|
20
|
+
|
|
21
|
+
## Quick start
|
|
22
|
+
|
|
23
|
+
```tsx
|
|
24
|
+
import { ExternalFaceMesh, FaceExpressionController, FaceRig } from "@vincentt-xr/sdk/face-effects";
|
|
25
|
+
import { FaceTracker } from "@vincentt-xr/sdk/tracking";
|
|
26
|
+
|
|
27
|
+
<FaceTracker>
|
|
28
|
+
<FaceRig>
|
|
29
|
+
<FaceExpressionController
|
|
30
|
+
rules={[
|
|
31
|
+
{ input: "jawOpen", morph: "jawOpen", multiplier: 1.4 },
|
|
32
|
+
{ input: { action: "mouthOpen" }, target: "bubble", visible: { above: 0.45 } },
|
|
33
|
+
{ input: { action: "eyeBlink" }, onStart: () => playBlinkSound() },
|
|
34
|
+
]}
|
|
35
|
+
>
|
|
36
|
+
<ExternalFaceMesh model={head.scene} drive="none" />
|
|
37
|
+
<group name="bubble">…</group>
|
|
38
|
+
</FaceExpressionController>
|
|
39
|
+
</FaceRig>
|
|
40
|
+
</FaceTracker>;
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
The outputs act on the controller's children, which sit in the canonical head frame (centimetres).
|
|
44
|
+
Inside a `FaceRig` the controller shares that rig; otherwise it runs its own, so mount it in a
|
|
45
|
+
`FaceTracker`.
|
|
46
|
+
|
|
47
|
+
## Inputs
|
|
48
|
+
|
|
49
|
+
| `input` | Reads |
|
|
50
|
+
| ------------------------------------- | -------------------------------------------------------------------------------------------- |
|
|
51
|
+
| `"jawOpen"` | A blendshape channel (ARKit names, `FACE_MORPH_NAMES`), with the person's neutral removed. |
|
|
52
|
+
| `{ channels: [...], combine: "avg" }` | Several channels: `"max"` (default), `"min"`, `"avg"` or `"sum"`. |
|
|
53
|
+
| `{ action: "mouthOpen" }` | A Face Action's value, as `useFaceAction` reads it (raw blendshapes, head turns in radians). |
|
|
54
|
+
| `(frame) => number` | Your own function of `{ morphs, face, live }`. |
|
|
55
|
+
|
|
56
|
+
An unknown channel or action reads 0 and warns once, listing the valid names.
|
|
57
|
+
|
|
58
|
+
## Shaping
|
|
59
|
+
|
|
60
|
+
Every frame, a rule's value goes through these steps in order:
|
|
61
|
+
|
|
62
|
+
```text
|
|
63
|
+
input → range (→ 0..1) → curve → × multiplier → clamp → smoothing
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
| Field | Default | What it does |
|
|
67
|
+
| ------------ | ---------------- | ----------------------------------------------------------------------------------------- |
|
|
68
|
+
| `range` | `[0, 1]` | The input span mapped onto 0..1: below the first value reads 0, above the second reads 1. |
|
|
69
|
+
| `curve` | `1` | An exponent: above 1 eases in (subtle until strong), below 1 eases out. |
|
|
70
|
+
| `multiplier` | `1` | A scale after the curve: above 1 exaggerates. |
|
|
71
|
+
| `clamp` | `[0, max(1, ×)]` | Limits after the multiplier. |
|
|
72
|
+
| `smoothing` | `0.6` | A per-frame EMA factor, or `{ attack, release }` to rise and fall at different speeds. |
|
|
73
|
+
| `rest` | `0` | The value at rest: after a reset, and on face loss. |
|
|
74
|
+
| `onLost` | `"rest"` | On face loss, ease back to `rest`, or `"hold"` the last value. |
|
|
75
|
+
|
|
76
|
+
## Outputs
|
|
77
|
+
|
|
78
|
+
Outputs act on the object named `target` in the subtree; without a `target`, on the whole subtree.
|
|
79
|
+
|
|
80
|
+
| Output | Writes |
|
|
81
|
+
| ------------------- | ------------------------------------------------------------------------------------------------------------- |
|
|
82
|
+
| `morph` | Morph target name(s) on every mesh under it. An ARKit name also matches the Face Cap spelling (`eyeBlink_L`). |
|
|
83
|
+
| `property` | A material uniform (`uniforms[name].value`) or a numeric property (`opacity`, `emissiveIntensity`). |
|
|
84
|
+
| `visible` | Shown while the value is ≥ `above` and/or ≤ `below` (default: ≥ 0.5). |
|
|
85
|
+
| `transform` | An offset from the target's rest at value 1: `position`, `rotation` (degrees), `scale` (factor). |
|
|
86
|
+
| `set` | Your own setter, called every frame with the value. |
|
|
87
|
+
| `onStart` / `onEnd` | Edge callbacks, with `trigger: [on, off]` hysteresis (default `[0.5, 0.35]`). |
|
|
88
|
+
|
|
89
|
+
Several `transform` rules on one target add up, and the target returns to its rest pose every frame
|
|
90
|
+
before they apply. Bindings re-resolve once a second, so children that load later (a GLTF behind
|
|
91
|
+
`Suspense`) are picked up. A target, morph or property that is still missing after that warns once.
|
|
92
|
+
|
|
93
|
+
**Morphs and `ExternalFaceMesh`.** When the controller drives a face model's morphs, set that
|
|
94
|
+
model's `drive` to `"none"` or `"landmarks"`. Otherwise both write the morphs. For a simple gain on
|
|
95
|
+
the automatic mapping, `ExternalFaceMesh`'s `morphGain` is enough.
|
|
96
|
+
|
|
97
|
+
## Reset and face loss
|
|
98
|
+
|
|
99
|
+
- **Reset:** a new `resetKey` puts every rule back at `rest` and ends active triggers, firing
|
|
100
|
+
`onEnd`.
|
|
101
|
+
- **Face loss:** values ease back to `rest`, unless a rule sets `onLost: "hold"`.
|
|
102
|
+
- **Neutral:** recalibrating the person's neutral is the rig's job (`FaceRig`'s `neutralKey`).
|
|
103
|
+
|
|
104
|
+
## Headless use
|
|
105
|
+
|
|
106
|
+
`useExpressionValues(rules)` runs the same rules without outputs. Read the values in `useFrame`:
|
|
107
|
+
|
|
108
|
+
```tsx
|
|
109
|
+
const expr = useExpressionValues([
|
|
110
|
+
{ id: "smile", input: { channels: ["mouthSmileLeft", "mouthSmileRight"], combine: "avg" } },
|
|
111
|
+
]);
|
|
112
|
+
useFrame(() => {
|
|
113
|
+
shader.uniforms.uSmile.value = expr.get("smile");
|
|
114
|
+
});
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
The engine is pure and exported:
|
|
118
|
+
|
|
119
|
+
- `compileExpressionInput`, `createExpressionState` and
|
|
120
|
+
`stepExpressions(state, rules, readers, frame)`;
|
|
121
|
+
- `shapeExpressionValue` and `resetExpressions`;
|
|
122
|
+
- `expressionFrame(rig)`;
|
|
123
|
+
- `createExpressionOutputs(root)`, which has `resolve(rules, warn)` and `apply(rules, state)`.
|
|
124
|
+
|
|
125
|
+
## Example
|
|
126
|
+
|
|
127
|
+
`/external-face-mesh?rules=1` runs on the facecap head when it is present locally (see
|
|
128
|
+
[External Face Mesh](/api/external-face-mesh#example)). It shows:
|
|
129
|
+
|
|
130
|
+
- **Custom morph mapping:** a cartoon mapping with an "exaggerate" slider. A toggle compares it with
|
|
131
|
+
`ExternalFaceMesh`'s automatic mapping.
|
|
132
|
+
- **Props:** a hat that lifts and tilts with the brows, a bubble that appears when the mouth opens,
|
|
133
|
+
and a cheek blush that follows the smile.
|
|
134
|
+
- **Triggers:** blink and mouth-open counters.
|
|
135
|
+
- **Readout:** the live rule values.
|
|
136
|
+
|
|
137
|
+
## Manual visual test plan
|
|
138
|
+
|
|
139
|
+
Open `/external-face-mesh?rules=1` on the webcam and look at the camera, relaxed, when the head
|
|
140
|
+
appears. That captures the neutral.
|
|
141
|
+
|
|
142
|
+
1. **At rest**: every bar reads 0. The hat sits on the crown, there is no bubble and no blush.
|
|
143
|
+
2. **Mouth**: open your mouth wide. With the custom mapping on, the model's jaw opens wider than
|
|
144
|
+
yours (exaggerate 1.4), and the bubble pops up. The mouth counter goes up once per opening, not
|
|
145
|
+
once per frame.
|
|
146
|
+
3. **Blink**: each blink snaps the lids shut and reopens them softly, and the blink counter goes up
|
|
147
|
+
once.
|
|
148
|
+
4. **Brows and smile**: raising your brows lifts and tilts the hat. Smiling brings up the blush,
|
|
149
|
+
up to 0.75 opacity.
|
|
150
|
+
5. **Exaggerate**: at 0.5 everything is subdued; at 2 it is cartoonish but clamped.
|
|
151
|
+
6. **Auto vs custom**: untick "custom morph mapping". `ExternalFaceMesh` drives the morphs one to
|
|
152
|
+
one, with no exaggeration and no soft reopen.
|
|
153
|
+
7. **Face loss**: cover the camera. Everything eases back to rest, and the hat comes down.
|