@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
package/docs/api/face-info.mdx
CHANGED
|
@@ -23,16 +23,22 @@ function FaceLogic() {
|
|
|
23
23
|
|
|
24
24
|
## Coordinate contract
|
|
25
25
|
|
|
26
|
-
| Field | Contract
|
|
27
|
-
| --------------- |
|
|
28
|
-
| `index` | Current result-array index, not a persistent identity
|
|
29
|
-
| `landmarks` | Normalized tracker-input coordinates with top-left origin |
|
|
30
|
-
| `bounds` | Bounds in the same normalized coordinate system
|
|
31
|
-
| `pose.position` | Three.js world position
|
|
32
|
-
| `pose.rotation` | Radians: pitch X (+up), yaw Y (+left), roll Z
|
|
33
|
-
| `pose.scale` | Smoothed uniform face-sizing heuristic
|
|
34
|
-
| `eyeDistance` | Outer-eye distance in normalized coordinates
|
|
35
|
-
| `blendshapes` | Typed MediaPipe category scores in `[0, 1]`
|
|
26
|
+
| Field | Contract |
|
|
27
|
+
| --------------- | ---------------------------------------------------------------------------------------------------------- |
|
|
28
|
+
| `index` | Current result-array index, not a persistent identity |
|
|
29
|
+
| `landmarks` | Normalized tracker-input coordinates with top-left origin; MediaPipe's indices and sides |
|
|
30
|
+
| `bounds` | Bounds in the same normalized coordinate system |
|
|
31
|
+
| `pose.position` | Three.js world position |
|
|
32
|
+
| `pose.rotation` | Radians: pitch X (+up), yaw Y (+ the person's own left), roll Z (+ toward their left shoulder), every feed |
|
|
33
|
+
| `pose.scale` | Smoothed uniform face-sizing heuristic |
|
|
34
|
+
| `eyeDistance` | Outer-eye distance in normalized coordinates |
|
|
35
|
+
| `blendshapes` | Typed MediaPipe category scores in `[0, 1]`; raw `…Left` is MediaPipe's left |
|
|
36
|
+
| `mirrored` | The face came from a mirrored feed (the front webcam) |
|
|
37
|
+
|
|
38
|
+
Left and right are the person's own side in every SDK name and reading
|
|
39
|
+
(GROUNDING "Left and right"). Raw MediaPipe indices and blendshape names keep
|
|
40
|
+
MediaPipe's side: the person's own on an unmirrored feed, their other side on
|
|
41
|
+
the mirrored webcam; `mirrored` tells you which.
|
|
36
42
|
|
|
37
43
|
`useFaceInfo({ faceIndex })` reads one face. `useFaceInfos({ numFaces })` reads
|
|
38
44
|
all current faces. Both share the SDK face model and support `active`,
|
|
@@ -63,7 +69,7 @@ if (detection.justLost) hideEffect();
|
|
|
63
69
|
|
|
64
70
|
The result also includes `faces`. The default `holdMs: 250` suppresses brief
|
|
65
71
|
one-frame losses before `End`; pass `holdMs: 0` for immediate disappearance.
|
|
66
|
-
Use the verified `/face-
|
|
72
|
+
Use the verified `/face-info` page to test five face slots,
|
|
67
73
|
Begin/Stay/End/None, selected-face presence, count, and edge history. Its
|
|
68
74
|
real-camera lifecycle flow was verified on 26 July 2026.
|
|
69
75
|
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Face Inset"
|
|
3
|
+
description: "Cut an eye, both eyes, the mouth, the nose or the whole face out of the live camera image and show it magnified in place, on another face point, on a 3D object or on screen."
|
|
4
|
+
sidebarTitle: "Face Inset"
|
|
5
|
+
icon: "magnifying-glass-plus"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
`FaceInset` cuts a face part out of the live camera image with a soft edge and shows it somewhere,
|
|
9
|
+
following the face every frame. It is Lens Studio's Face Inset.
|
|
10
|
+
|
|
11
|
+
- **Giant parts.** Magnify the eyes or the mouth in place, the cartoon look.
|
|
12
|
+
- **Big head, tiny face.** The whole face, scaled up or down.
|
|
13
|
+
- **Moved parts.** The mouth talking on the forehead, an eye on the chin.
|
|
14
|
+
- **On an object.** A talking mouth on a product box, eyes on a package, a face on a card.
|
|
15
|
+
- **On screen.** A picture-in-picture eye or mouth in a corner.
|
|
16
|
+
|
|
17
|
+
Every pixel is the camera image itself. Import from `@vincentt-xr/sdk/face-effects`.
|
|
18
|
+
|
|
19
|
+
## Quick start
|
|
20
|
+
|
|
21
|
+
```tsx
|
|
22
|
+
import { FaceInset } from "@vincentt-xr/sdk/face-effects";
|
|
23
|
+
import { FaceTracker } from "@vincentt-xr/sdk/tracking";
|
|
24
|
+
|
|
25
|
+
<FaceTracker>
|
|
26
|
+
{/* Giant eyes, each magnified about its own middle */}
|
|
27
|
+
<FaceInset part="eyes" magnify={1.8} />
|
|
28
|
+
{/* The mouth again, on the forehead */}
|
|
29
|
+
<FaceInset part="mouth" at="face.forehead" magnify={0.8} />
|
|
30
|
+
</FaceTracker>;
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Placements
|
|
34
|
+
|
|
35
|
+
There are three ways to show an inset. They cut the same part the same way.
|
|
36
|
+
|
|
37
|
+
| Placement | Where it shows | Its size |
|
|
38
|
+
| ------------------------------- | ------------------------------------------------------------------------------------ | ------------------------------------------------------- |
|
|
39
|
+
| `placement="face"` (default) | Over the live face, at the part's own place, or centred on another face point (`at`) | `magnify`: times bigger about the part's middle (1.5) |
|
|
40
|
+
| `placement="plane"` | A plane in its parent's frame: on an object, beside the head, anywhere in the scene | `height`: the plane's height in local units (1) |
|
|
41
|
+
| `useFaceInsetTexture({ part })` | A texture for your own material or a `ScreenImage` | `resolution`: the texture's longer side in pixels (256) |
|
|
42
|
+
|
|
43
|
+
### On the face
|
|
44
|
+
|
|
45
|
+
The part is drawn over the live face at `FACE_INSET_RENDER_ORDER` (-1.5): after the face and any
|
|
46
|
+
face effect on it (`FaceWarp3D`, `FaceMorph`, a character, at -2), before the head occluder (-1)
|
|
47
|
+
and accessories (0). A `HandCutout` keeps hands in front.
|
|
48
|
+
|
|
49
|
+
- **`magnify` above 1** magnifies the part about its own middle. With `part="eyes"`, each eye is
|
|
50
|
+
magnified about its own middle.
|
|
51
|
+
- **`magnify` below 1** shrinks it. The real part shows around a shrunk one.
|
|
52
|
+
- **`at`** draws it centred on another face point: `"face.forehead"`, `"face.chin"`,
|
|
53
|
+
`"face.leftCheek"`, `"face.rightCheek"`, `"face.noseTip"`, `"face.mouthCenter"`, … With `at`,
|
|
54
|
+
`"eyes"` is one strip, both eyes together. The original part stays where it is.
|
|
55
|
+
|
|
56
|
+
### As a plane
|
|
57
|
+
|
|
58
|
+
A plane, `height` units tall and as wide as the part's shape, in its parent's frame. Put it inside a
|
|
59
|
+
`FaceTracker` to follow the head, or anywhere else in the scene.
|
|
60
|
+
|
|
61
|
+
```tsx
|
|
62
|
+
<FaceTracker>
|
|
63
|
+
{/* A card beside the head, turning with it */}
|
|
64
|
+
<group position={[1.2, 0, 0]}>
|
|
65
|
+
<FaceInset part="mouth" placement="plane" height={0.8} />
|
|
66
|
+
</group>
|
|
67
|
+
</FaceTracker>;
|
|
68
|
+
|
|
69
|
+
// On a product box, outside the tracker: name the face
|
|
70
|
+
<group position={[0, -1, 0.5]}>
|
|
71
|
+
<mesh>
|
|
72
|
+
<boxGeometry args={[1.2, 1.1, 0.4]} />
|
|
73
|
+
<meshStandardMaterial color="#ffcf4a" />
|
|
74
|
+
</mesh>
|
|
75
|
+
<group position={[0, 0, 0.201]}>
|
|
76
|
+
<FaceInset part="mouth" placement="plane" faceIndex={0} height={0.8} />
|
|
77
|
+
</group>
|
|
78
|
+
</group>;
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### As a texture
|
|
82
|
+
|
|
83
|
+
`useFaceInsetTexture` returns the part as a live `THREE.Texture`: straight alpha, sRGB, shaped like
|
|
84
|
+
the part's box (`faceInsetAspect(part)`). Use it on any material, or on screen with a
|
|
85
|
+
`ScreenImage`:
|
|
86
|
+
|
|
87
|
+
```tsx
|
|
88
|
+
import { ScreenImage, ScreenSpaceUI } from "@vincentt-xr/sdk";
|
|
89
|
+
import { useFaceInsetTexture } from "@vincentt-xr/sdk/face-effects";
|
|
90
|
+
|
|
91
|
+
const EyeCorner = () => {
|
|
92
|
+
const eye = useFaceInsetTexture({ part: "leftEye", resolution: 384 });
|
|
93
|
+
return (
|
|
94
|
+
<ScreenSpaceUI>
|
|
95
|
+
<ScreenImage
|
|
96
|
+
source={{ kind: "texture", texture: eye }}
|
|
97
|
+
anchors={{ left: 0.2, right: 0.95, top: 0.95, bottom: 0.55 }}
|
|
98
|
+
fit="contain"
|
|
99
|
+
/>
|
|
100
|
+
</ScreenSpaceUI>
|
|
101
|
+
);
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
// On your own mesh
|
|
105
|
+
const label = useFaceInsetTexture({ part: "mouth" });
|
|
106
|
+
<meshBasicMaterial map={label} transparent toneMapped={false} />;
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Parts
|
|
110
|
+
|
|
111
|
+
| `part` | Cut around | Box (eye distances, before `size`) |
|
|
112
|
+
| ------------ | -------------------------------- | ---------------------------------- |
|
|
113
|
+
| `"leftEye"` | the person's own left eye | 0.8 × 0.55 |
|
|
114
|
+
| `"rightEye"` | the person's own right eye | 0.8 × 0.55 |
|
|
115
|
+
| `"eyes"` | both eyes (two soft ellipses) | 1.8 × 0.55 |
|
|
116
|
+
| `"mouth"` | the lips | 1.2 × 1 |
|
|
117
|
+
| `"nose"` | the nose, bridge to nostrils | 0.8 × 1 |
|
|
118
|
+
| `"face"` | the whole face, forehead to chin | 2.5 × 3 |
|
|
119
|
+
|
|
120
|
+
The sizes are in eye distances: the 3D distance between the eye centres. The box therefore keeps its
|
|
121
|
+
size while the mouth opens or the head turns, and a talking mouth opens inside it. `size` scales the
|
|
122
|
+
box: more or less skin around the part. Left and right are the person's own eyes on every feed, the
|
|
123
|
+
same eyes as `face.leftEye` / `face.rightEye` (GROUNDING "Left and right"): `"leftEye"` is on the
|
|
124
|
+
screen's left in the mirrored webcam view and on its right in a video. Sided `at` targets
|
|
125
|
+
(`"face.leftCheek"`) follow the same rule.
|
|
126
|
+
|
|
127
|
+
## Props
|
|
128
|
+
|
|
129
|
+
| Prop | Default | What it does |
|
|
130
|
+
| ------------- | -------------------------------- | --------------------------------------------------------------- |
|
|
131
|
+
| `part` | — | Which part (`FACE_INSET_PARTS`). |
|
|
132
|
+
| `placement` | `"face"` | `"face"` or `"plane"`. |
|
|
133
|
+
| `magnify` | `1.5` | `"face"` only: times bigger than life, about the part's middle. |
|
|
134
|
+
| `height` | `1` | `"plane"` only: the plane's height in local units. |
|
|
135
|
+
| `at` | — | `"face"` only: another face point to centre it on. |
|
|
136
|
+
| `feather` | `0.4` | Soft edge: 0 is hard (antialiased), 1 fades from the middle. |
|
|
137
|
+
| `size` | `1` | How much around the part is cut, a multiple of its box. |
|
|
138
|
+
| `opacity` | `1` | 0..1. |
|
|
139
|
+
| `faceIndex` | the enclosing `FaceTracker`'s | Which tracked face (else 0). |
|
|
140
|
+
| `resolution` | `256` | `"plane"` only: the texture's longer side, px. |
|
|
141
|
+
| `renderOrder` | `-1.5` on the face, `0` as plane | Draw order. |
|
|
142
|
+
|
|
143
|
+
`useFaceInsetTexture({ part, feather, size, resolution, faceIndex, active })` takes the same
|
|
144
|
+
options; `active: false` stops updating.
|
|
145
|
+
|
|
146
|
+
## Tracking, faces and mirroring
|
|
147
|
+
|
|
148
|
+
- **A `FaceTracker` must be mounted.** `FaceInset` reads the face model and starts none. Inside a
|
|
149
|
+
`FaceTracker` it follows that tracker's face; elsewhere pass `faceIndex`.
|
|
150
|
+
- **Several faces.** Mount one per face, each in its own `FaceTracker faceIndex={i}`.
|
|
151
|
+
- **Face lost.** On the face, the inset hides at once. A texture (and a plane) keeps its last image
|
|
152
|
+
for `FACE_INSET_HOLD_MS` (250 ms), then turns transparent.
|
|
153
|
+
- **Upright.** The box turns with the head's roll. On the face it lines up with the real part; a
|
|
154
|
+
texture shows the part upright. This holds on the mirrored webcam, the rear camera and clips: the
|
|
155
|
+
camera image and the landmarks share one space, and the box takes its up from the face.
|
|
156
|
+
- **Turning away.** An eye fades out as the head turns away from it, so its far side never smears
|
|
157
|
+
over the nose.
|
|
158
|
+
|
|
159
|
+
## How it works
|
|
160
|
+
|
|
161
|
+
1. **Box.** Each frame, `writeFaceInsetFrame` places the part's box on the camera image: centred on
|
|
162
|
+
the part (eye corners, lips, nose, forehead-to-chin), along the eye line, sized in eye distances.
|
|
163
|
+
2. **Mask.** A soft ellipse fills the box (two for `"eyes"`). `feather` sets its soft edge.
|
|
164
|
+
3. **On the face.** One quad per part is drawn straight to clip space. It samples the camera inside
|
|
165
|
+
the box and draws it `magnify` times larger about the part's middle (or at `at`). No offscreen pass.
|
|
166
|
+
4. **As a texture.** The same quad fills a small render target (one pass, only on a new camera frame
|
|
167
|
+
or new landmarks), copied on the GPU into the texture handed out. That texture is a plain one
|
|
168
|
+
(a `FramebufferTexture`, not a render target's), so it can be cloned: `ScreenImage` clones its
|
|
169
|
+
source.
|
|
170
|
+
|
|
171
|
+
**Performance.** No per-frame allocation and no CPU image work. On the face it costs one or two small
|
|
172
|
+
quads; as a texture, one small offscreen pass and a GPU copy per new camera frame.
|
|
173
|
+
|
|
174
|
+
**Pure pieces:** `writeFaceInsetFrame(landmarks, part, aspect, { size, mirrored }, out)` (`mirrored`:
|
|
175
|
+
the feed's, so `"leftEye"` is the person's own; the component passes the face's) with
|
|
176
|
+
`createFaceInsetFrame()`, `FACE_INSET_BOXES`, `faceInsetAspect(part)`.
|
|
177
|
+
|
|
178
|
+
## Example
|
|
179
|
+
|
|
180
|
+
`/face-inset` has part, placement (face, beside the head, on a product box, on screen), magnify or
|
|
181
|
+
card height, feather, cut size, opacity, `at`, texture resolution and one or two faces. Options are
|
|
182
|
+
in the URL: `?part=mouth&place=object`.
|
|
183
|
+
|
|
184
|
+
## Manual visual test plan
|
|
185
|
+
|
|
186
|
+
Open `/face-inset` on the webcam.
|
|
187
|
+
|
|
188
|
+
1. **Giant eyes** (both eyes, magnify 1.6): your eyes are big and still blink and look around. The
|
|
189
|
+
edge is soft, with no seam or shimmer while you move.
|
|
190
|
+
2. **Feather**: 0 gives a crisp oval with a smooth edge; 1 fades from the middle.
|
|
191
|
+
3. **Mouth on the forehead** (mouth, show at forehead): the mouth talks on the forehead while the
|
|
192
|
+
real one moves too.
|
|
193
|
+
4. **Big head** (whole face, magnify 1.4, feather 0.3) and **tiny face** (magnify 0.5).
|
|
194
|
+
5. **Head tilt**: insets on the face turn with it; the texture placements stay upright.
|
|
195
|
+
6. **Head turn**: the eye turning away fades out; the box keeps its size.
|
|
196
|
+
7. **Mouth open wide**: the box keeps its size; the mouth opens inside it.
|
|
197
|
+
8. **Beside / object / screen**: the part shows on the card, on the box front and in the corner,
|
|
198
|
+
live, upright and soft-edged.
|
|
199
|
+
9. **Two faces** (faces: two, the two-people clip): each person gets their own inset.
|
|
200
|
+
10. **Rear camera / clip**: the same results unmirrored.
|
|
201
|
+
11. **Sides**: part "left eye" on the webcam magnifies your real left eye (on the screen's left).
|
|
202
|
+
On a clip it is the person's left eye (on the screen's right).
|
|
203
|
+
12. **Dropout**: cover the camera. The face insets hide at once; the textures hold briefly, then
|
|
204
|
+
clear.
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Face Instructions"
|
|
3
|
+
description: "Ask for a face expression with a 3D hint face and your own copy, detect it from the face blendshapes, and complete when it is held."
|
|
4
|
+
sidebarTitle: "Face Instructions"
|
|
5
|
+
icon: "face-smile-wink"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
`FaceInstruction` asks the person for a face expression and waits for it. A cute, translucent 3D face
|
|
9
|
+
loops into the expression, your copy sits under it, and holding the expression for `holdMs` completes
|
|
10
|
+
it. It is the face counterpart of [Hand Instructions](/api/hand-instructions), with the same layout
|
|
11
|
+
and feedback. The pieces underneath are exported too: `useFaceExpression` (the detection alone) and
|
|
12
|
+
`FaceExpressionHint` (the face alone).
|
|
13
|
+
|
|
14
|
+
Import from `@vincentt-xr/sdk/instructions`. Everything is customisable: your own expressions,
|
|
15
|
+
detection logic, hint look and motion, text style, or a fully custom prompt. See
|
|
16
|
+
[Instructions](/api/instructions).
|
|
17
|
+
|
|
18
|
+
## Quick start
|
|
19
|
+
|
|
20
|
+
```tsx
|
|
21
|
+
import { useLoader } from "@react-three/fiber";
|
|
22
|
+
import { MeshoptDecoder } from "three/examples/jsm/libs/meshopt_decoder.module.js";
|
|
23
|
+
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";
|
|
24
|
+
import { FaceInstruction } from "@vincentt-xr/sdk/instructions";
|
|
25
|
+
|
|
26
|
+
const SmileToStart = ({ onStart }: { onStart: () => void }) => {
|
|
27
|
+
// face-v1.glb is meshopt-compressed, so the loader needs the meshopt decoder.
|
|
28
|
+
const face = useLoader(GLTFLoader, faceUrl, (loader) => loader.setMeshoptDecoder(MeshoptDecoder));
|
|
29
|
+
return (
|
|
30
|
+
<FaceInstruction
|
|
31
|
+
expression="smile"
|
|
32
|
+
text="Smile to start"
|
|
33
|
+
model={face.scene}
|
|
34
|
+
onComplete={onStart}
|
|
35
|
+
/>
|
|
36
|
+
);
|
|
37
|
+
};
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Mount it inside `XRScene`. It acquires the face model itself, so you don't need a `FaceTracker`, and
|
|
41
|
+
draws over the AR content in its own screen-space layer (`INSTRUCTION_RENDER_ORDER` = 2000 and up).
|
|
42
|
+
Detection reads MediaPipe's face blendshapes.
|
|
43
|
+
|
|
44
|
+
## `FaceInstruction`
|
|
45
|
+
|
|
46
|
+
| Prop | Default | What it does |
|
|
47
|
+
| ---------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------- |
|
|
48
|
+
| `expression` | — | What to ask for: a `FACE_EXPRESSIONS` name or your own `defineFaceExpression(…)`. |
|
|
49
|
+
| `model` | — | The hint face: morph targets named like the expressions (e.g. `face-v1.glb`'s scene). |
|
|
50
|
+
| `text` | the expression's `label` | Your copy, in any language. Long text shrinks to fit. |
|
|
51
|
+
| `doneText` | keep `text` | Copy shown once completed, while it fades out. |
|
|
52
|
+
| `nudgeText` | `"Show your face to the camera"` | Second line after `nudgeAfterMs` with no face in view; the hint pulses. `null` turns it off. |
|
|
53
|
+
| `nudgeAfterMs` | `3000` | How long without a face before the nudge. |
|
|
54
|
+
| `faceIndex` | `0` | Which detected face to read. |
|
|
55
|
+
| `holdMs` | `400` | How long the expression must be held. |
|
|
56
|
+
| `graceMs` | `150` | Dropouts shorter than this don't restart the hold. |
|
|
57
|
+
| `size` | `"md"` | `"sm"`, `"md"`, `"lg"`: 10 / 14 / 19 % of the screen height; or a fraction of it. |
|
|
58
|
+
| `placement` | `"center"` | `"top"`, `"center"` or `"bottom"`. |
|
|
59
|
+
| `offset` | `[0, 0]` | Shift from the placement, in half-screens. |
|
|
60
|
+
| `orbit` | `30` | The hint's auto orbit, degrees to each side. `0` holds it still. |
|
|
61
|
+
| `look` | `FACE_HINT_LOOK` | The hint's look, merged over the default: ghost, per-part tints, halo, glow, material. |
|
|
62
|
+
| `loop` | `FACE_HINT_LOOP` | The hint's loop: `seconds`, `hold`, `from`, `easing`. |
|
|
63
|
+
| `color` | `"#ffffff"` | Text colour, with a soft dark shadow so it reads on any camera feed. |
|
|
64
|
+
| `textStyle` … | — | `textStyle`, `nudgeTextStyle`, `renderText`, `motion`, `layout`: see [Instructions](/api/instructions). |
|
|
65
|
+
| `onComplete` | — | Called once when the expression is held long enough. |
|
|
66
|
+
| `onStatusChange` | — | Called once with the first status, then on every change. |
|
|
67
|
+
| `hideOnComplete` | `true` | Fade out after completing. A small pop and a white ring play either way. |
|
|
68
|
+
| `active` | `true` | `false` hides it and pauses detection. |
|
|
69
|
+
|
|
70
|
+
`onStatusChange` reports an `InstructionStatus`:
|
|
71
|
+
|
|
72
|
+
- `"waiting"`: no face in view.
|
|
73
|
+
- `"detected"`: a face in view, not making the expression.
|
|
74
|
+
- `"holding"`: making it; the hold is running.
|
|
75
|
+
- `"done"`: completed.
|
|
76
|
+
|
|
77
|
+
## Expressions
|
|
78
|
+
|
|
79
|
+
| Name | Default copy | Recognised when (MediaPipe blendshapes, 0..1) |
|
|
80
|
+
| ------------ | ------------------ | ----------------------------------------------------------------------------- |
|
|
81
|
+
| `smile` | Give a big smile | `mouthSmileLeft` and `mouthSmileRight` ≥ 0.45 |
|
|
82
|
+
| `wink` | Wink at the camera | one `eyeBlink` ≥ 0.55 and the other ≤ 0.3 (either eye) |
|
|
83
|
+
| `surprised` | Look surprised | `jawOpen` ≥ 0.35 and `browInnerUp` ≥ 0.4 |
|
|
84
|
+
| `kiss` | Blow a kiss | `mouthPucker` ≥ 0.5 and `jawOpen` ≤ 0.3 |
|
|
85
|
+
| `puffCheeks` | Puff your cheeks | `cheekPuff` ≥ 0.3 |
|
|
86
|
+
| `frown` | Frown | `browDownLeft` and `browDownRight` ≥ 0.4 |
|
|
87
|
+
| `scrunch` | Scrunch your face | both `noseSneer` ≥ 0.3, or both `eyeSquint` ≥ 0.45 with both `browDown` ≥ 0.3 |
|
|
88
|
+
|
|
89
|
+
Several can match at once: a scrunch usually also counts as a frown.
|
|
90
|
+
|
|
91
|
+
## Detection only: `useFaceExpression`
|
|
92
|
+
|
|
93
|
+
```tsx
|
|
94
|
+
import { useFaceExpression } from "@vincentt-xr/sdk/instructions";
|
|
95
|
+
|
|
96
|
+
const { status, holdRef, matchedRef, faceRef, isInView, reset } = useFaceExpression("wink", {
|
|
97
|
+
holdMs: 400,
|
|
98
|
+
onComplete: () => unlock(),
|
|
99
|
+
});
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
`status` (`"waiting"` → `"holding"` → `"done"`) re-renders only when it changes. Read
|
|
103
|
+
`holdRef.current.progress` (0..1) and `faceRef.current` (the latest `FaceInfo`, or `null`) inside
|
|
104
|
+
`useFrame`. `reset()` asks again. The result is an `InstructionDetector`, so it can drive a custom
|
|
105
|
+
`<Instruction>`.
|
|
106
|
+
|
|
107
|
+
A rule, a match function `(blendshapes, face) => boolean` or a definition works anywhere an
|
|
108
|
+
expression name does. A `FaceExpressionRule` has:
|
|
109
|
+
|
|
110
|
+
- `atLeast`: per blendshape, the minimum score.
|
|
111
|
+
- `atMost`: per blendshape, the maximum score.
|
|
112
|
+
- `anyOf`: sub-rules, one of which must pass.
|
|
113
|
+
|
|
114
|
+
```tsx
|
|
115
|
+
useFaceExpression({ atLeast: { jawOpen: 0.6 }, atMost: { mouthSmileLeft: 0.2 } });
|
|
116
|
+
useFaceExpression((b) => (b.mouthSmileLeft ?? 0) - (b.mouthSmileRight ?? 0) > 0.4); // a half smile
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
The checks are pure: `matchFaceExpression(face.blendshapes, nameOrRule)` and
|
|
120
|
+
`matchingFaceExpressions(face.blendshapes)`.
|
|
121
|
+
|
|
122
|
+
## The hint face: `FaceExpressionHint`
|
|
123
|
+
|
|
124
|
+
```tsx
|
|
125
|
+
<FaceExpressionHint expression="surprised" model={face.scene} height={0.4} />
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
The face alone, for your own layout. It is fitted to `height` (parent units) and plays the
|
|
129
|
+
expression's morph target (`FACE_EXPRESSIONS[name].hint.target`, or pass `expression={{ target }}`,
|
|
130
|
+
or a weighted mix `expression={{ targets: { surprised: 1, wink: 1 } }}`)
|
|
131
|
+
from the idle face and back, while slowly orbiting side to side. The default look:
|
|
132
|
+
|
|
133
|
+
- **Ghost:** translucent white with a brighter rim, the same as the hand hint.
|
|
134
|
+
- **Tinted features:** each part is tinted by its material name (`iris`, `brow`, `lash`, `lip`,
|
|
135
|
+
`mouth_inside`, `tongue`, `sparkle`, `eye_white`), so the expression reads at small size.
|
|
136
|
+
- **Halo:** a soft dark edge so it reads on light backgrounds (`look.halo`).
|
|
137
|
+
- **Glow:** a soft light from behind the head, brightening as the expression forms (`look.glow`). It
|
|
138
|
+
is a separate disc behind the face, so it never shows as inner layers.
|
|
139
|
+
|
|
140
|
+
`look` is merged over `FACE_HINT_LOOK` (retint a part with `look.parts.iris`, drop a tint with
|
|
141
|
+
`null`, `false` turns a layer off, `look.material` replaces the ghost). A custom face works if its meshes carry morph targets named like the
|
|
142
|
+
expressions and it faces +Z.
|
|
143
|
+
|
|
144
|
+
## The example model
|
|
145
|
+
|
|
146
|
+
`assets-src/faces/face-v1.blend` and `build_face.py` (README beside them) build the face from scratch,
|
|
147
|
+
with no third-party asset. The model is one mesh with nine materials and one fixed morph target per
|
|
148
|
+
expression: `smile`, `wink`, `surprised`, `kiss`, `puffCheeks`, `frown`, `scrunch`. The idle face is
|
|
149
|
+
the base shape, and the cheek blush is in `COLOR_0`.
|
|
150
|
+
|
|
151
|
+
Each expression is computed exactly rather than mixed from smaller keys, so the eyelids never cut
|
|
152
|
+
through the eyes. The raw export is ~1.8 MB; `gltf-transform meshopt` brings it to ~255 KB (~105 KB
|
|
153
|
+
gzipped) with every shape within 0.02 mm.
|
|
154
|
+
|
|
155
|
+
## Example
|
|
156
|
+
|
|
157
|
+
`/face-instructions` covers:
|
|
158
|
+
|
|
159
|
+
- every expression as a chip, and a sequence mode that moves to the next expression when one
|
|
160
|
+
completes;
|
|
161
|
+
- text, nudge, size, placement and hold-time controls;
|
|
162
|
+
- a live readout of the status, the blendshapes the rules read, and the matching expressions.
|
|
163
|
+
|
|
164
|
+
## Manual visual test plan
|
|
165
|
+
|
|
166
|
+
Open `/face-instructions`.
|
|
167
|
+
|
|
168
|
+
1. **Every hint reads**: step through all seven chips. The face loops into each expression: closed
|
|
169
|
+
happy eyes and an open smile, a left wink, wide eyes with an O, a pucker, puffed cheeks (clearest
|
|
170
|
+
mid-orbit), slanted brows with a downturned mouth, squinted slits. It stays inside its slot through
|
|
171
|
+
the orbit.
|
|
172
|
+
2. **Looks**: the ghost is translucent with no back layers showing through, the eyes, brows and
|
|
173
|
+
mouth stay clear, and the halo separates it from a white shirt.
|
|
174
|
+
3. **Detection**: on the webcam, make each expression. The readout's matches list it and the status
|
|
175
|
+
goes `holding` → `done`. A resting face matches nothing; a wink with either eye works; blinking
|
|
176
|
+
both eyes is not a wink.
|
|
177
|
+
4. **Completion**: on done, a small pop and a white ring play. With sequence on, it fades out and the
|
|
178
|
+
next expression comes in.
|
|
179
|
+
5. **Nudge**: turn away for 3 s. The second line fades in and the hint pulses; it fades out when your
|
|
180
|
+
face is back. With the nudge off it never appears.
|
|
181
|
+
6. **Copy and layout**: type custom text, switch sizes and top / center / bottom placement. Nothing
|
|
182
|
+
overlaps the screen edge.
|
|
183
|
+
7. **Hands unchanged**: `/hand-instructions` looks and behaves as before (both use the same layout).
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Face Liquify"
|
|
3
|
+
description: "2D liquify on the live face: bigger eyes, a slimmer jaw, a smile, a swirl. Eleven presets by weight, your own warps on named face points, every tracked face, with makeup, glasses and hats warping along."
|
|
4
|
+
sidebarTitle: "Face Liquify"
|
|
5
|
+
icon: "face-grin-stars"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
`FaceLiquify` reshapes faces on screen with local 2D warps, like a liquify brush that follows the
|
|
9
|
+
face.
|
|
10
|
+
|
|
11
|
+
- **Everything on the face warps together.** It warps the picture after everything 3D is drawn: the
|
|
12
|
+
camera, makeup and lips, face effects, glasses, hats and earrings.
|
|
13
|
+
- **Screen UI stays sharp.** `ScreenImage`, `ScreenText` and other screen UI draw after it.
|
|
14
|
+
- **Weight 0 is the untouched image**, byte for byte.
|
|
15
|
+
|
|
16
|
+
Import from `@vincentt-xr/sdk/face-effects`.
|
|
17
|
+
|
|
18
|
+
## Quick start
|
|
19
|
+
|
|
20
|
+
```tsx
|
|
21
|
+
import { VideoBackground, XRScene } from "@vincentt-xr/sdk";
|
|
22
|
+
import { FaceLiquify } from "@vincentt-xr/sdk/face-effects";
|
|
23
|
+
|
|
24
|
+
<XRScene>
|
|
25
|
+
<VideoBackground />
|
|
26
|
+
<FaceLiquify weights={{ bigEyes: 1, slimJaw: 1 }} />
|
|
27
|
+
</XRScene>;
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
It starts the face model itself; no `FaceTracker` is needed.
|
|
31
|
+
|
|
32
|
+
## FaceLiquify or FaceWarp3D?
|
|
33
|
+
|
|
34
|
+
| | `FaceLiquify` | [`FaceWarp3D`](/api/face-warp-3d) |
|
|
35
|
+
| --------- | ----------------------------------------------------------------- | ------------------------------------------------------- |
|
|
36
|
+
| How | 2D warps of the screen image around the face | Blend shapes on the face mesh, wearing the camera image |
|
|
37
|
+
| Warps | Everything drawn on the face: makeup, face effects, accessories | The face surface; makeup nested in it rides it |
|
|
38
|
+
| Authoring | Presets and warps in code, no model | Shape keys sculpted in Blender |
|
|
39
|
+
| Best for | Beauty tweaks, cartoon eyes and mouths, swirls, quick fun filters | Character proportions that follow the face in 3D |
|
|
40
|
+
|
|
41
|
+
They combine: the liquify warps the `FaceWarp3D` face too.
|
|
42
|
+
|
|
43
|
+
## Presets and weights
|
|
44
|
+
|
|
45
|
+
`weights` sets each preset from 0 to 3:
|
|
46
|
+
|
|
47
|
+
- **1** is a subtle, natural look.
|
|
48
|
+
- **2** is clearly stylised.
|
|
49
|
+
- **3** is the strongest cartoon look before the image would fold over itself.
|
|
50
|
+
|
|
51
|
+
There are no negative weights; out-of-range values clamp.
|
|
52
|
+
|
|
53
|
+
| Preset | Does |
|
|
54
|
+
| -------------- | -------------------------------- |
|
|
55
|
+
| `bigEyes` | Magnifies both eyes |
|
|
56
|
+
| `smallNose` | Shrinks the nose |
|
|
57
|
+
| `bigMouth` | Magnifies the mouth |
|
|
58
|
+
| `smile` | Lifts both mouth corners |
|
|
59
|
+
| `chubbyCheeks` | Puffs both cheeks |
|
|
60
|
+
| `slimJaw` | Pushes both jaw angles in and up |
|
|
61
|
+
| `slimFace` | Pushes both sides of the face in |
|
|
62
|
+
| `longChin` | Pulls the chin down |
|
|
63
|
+
| `bigForehead` | Magnifies the forehead |
|
|
64
|
+
| `bigHead` | Magnifies the whole face |
|
|
65
|
+
| `swirl` | Twists the face about its centre |
|
|
66
|
+
|
|
67
|
+
`weight` (0..1) fades everything at once, linearly. Pass a ref to animate it without re-rendering:
|
|
68
|
+
|
|
69
|
+
```tsx
|
|
70
|
+
const amount = useRef(0);
|
|
71
|
+
useFrame(({ clock }) => {
|
|
72
|
+
amount.current = (1 - Math.cos(clock.elapsedTime * 1.6)) / 2;
|
|
73
|
+
});
|
|
74
|
+
<FaceLiquify weights={{ bigEyes: 3 }} weight={amount} />;
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
`weights` takes a ref too.
|
|
78
|
+
|
|
79
|
+
## Your own warps
|
|
80
|
+
|
|
81
|
+
`warps` adds warps by name; set their weight in `weights` (a custom warp without a weight draws as
|
|
82
|
+
authored, at weight 3).
|
|
83
|
+
|
|
84
|
+
```tsx
|
|
85
|
+
<FaceLiquify
|
|
86
|
+
warps={{
|
|
87
|
+
pointyChin: { kind: "stretch", at: "chin", radius: 0.6, strength: 0.8, direction: [0, -1] },
|
|
88
|
+
elfEars: {
|
|
89
|
+
kind: "push",
|
|
90
|
+
at: "leftFaceSide",
|
|
91
|
+
offset: [0.2, 0.6],
|
|
92
|
+
radius: 0.4,
|
|
93
|
+
strength: 0.7,
|
|
94
|
+
direction: [0.6, 1],
|
|
95
|
+
mirror: true,
|
|
96
|
+
},
|
|
97
|
+
}}
|
|
98
|
+
weights={{ pointyChin: 2, elfEars: 3 }}
|
|
99
|
+
/>
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
| Field | Meaning |
|
|
103
|
+
| ----------- | -------------------------------------------------------------------------------------------------------------------- |
|
|
104
|
+
| `kind` | `bulge` (magnify), `pinch` (shrink), `push` (move along `direction`), `stretch` (magnify along `direction`), `swirl` |
|
|
105
|
+
| `at` | A named point (below) or `{ landmark: n }`, a MediaPipe face landmark |
|
|
106
|
+
| `offset` | From `at`, in eye distances: x toward the person's own left, y up the face |
|
|
107
|
+
| `radius` | The circle it changes, in eye distances (the 3D distance between the eye centres) |
|
|
108
|
+
| `strength` | 0..1: the share of the kind's limit at weight 3. At 1 it is the most that kind can do without folding |
|
|
109
|
+
| `direction` | `push` and `stretch`: the way the content moves, in face axes. Default up the face |
|
|
110
|
+
| `clockwise` | `swirl`: turn the other way |
|
|
111
|
+
| `mirror` | Also apply it on the other side of the face |
|
|
112
|
+
|
|
113
|
+
Named points: `leftEye`, `rightEye`, `noseTip`, `noseBridge`, `mouth`, `leftMouthCorner`,
|
|
114
|
+
`rightMouthCorner`, `chin`, `leftJaw`, `rightJaw`, `leftCheek`, `rightCheek`, `leftFaceSide`,
|
|
115
|
+
`rightFaceSide`, `forehead`, `faceCenter`. Left and right are the person's own sides on every feed.
|
|
116
|
+
|
|
117
|
+
Warps apply one after another, so together they never fold either. A face holds at most 32 warps.
|
|
118
|
+
Memoise the `warps` object: a new object re-resolves the warps.
|
|
119
|
+
|
|
120
|
+
## Faces, fades and turned heads
|
|
121
|
+
|
|
122
|
+
- **Every tracked face** warps, up to four, each its own pass. `faceIndex` picks one; `numFaces` sets
|
|
123
|
+
how many faces the face model tracks.
|
|
124
|
+
- **Fades:** a face fades in over 150 ms when found, holds through a dropout of up to 250 ms, then
|
|
125
|
+
fades out over 120 ms.
|
|
126
|
+
- **Turned heads:** a warp on one side of the face fades as that side turns away, so the far cheek
|
|
127
|
+
never smears over the nose.
|
|
128
|
+
- **Smoothing:** landmarks are smoothed as face swap's are (`smoothing`, default 0.35; 0 is raw).
|
|
129
|
+
|
|
130
|
+
## Hands in front (experimental)
|
|
131
|
+
|
|
132
|
+
With `HandCutout` in the scene, a hand over the face stays sharp: hand pixels are never warped, and a
|
|
133
|
+
warp never pulls a hand into the face.
|
|
134
|
+
|
|
135
|
+
```tsx
|
|
136
|
+
import { HandCutout, HandTracker } from "@vincentt-xr/sdk/tracking";
|
|
137
|
+
|
|
138
|
+
<>
|
|
139
|
+
<HandTracker>
|
|
140
|
+
<HandCutout />
|
|
141
|
+
</HandTracker>
|
|
142
|
+
<FaceLiquify weights={{ bigMouth: 2 }} />
|
|
143
|
+
</>;
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Without `HandCutout`, a hand over the face warps with it.
|
|
147
|
+
|
|
148
|
+
## Props
|
|
149
|
+
|
|
150
|
+
| Prop | Default | Meaning |
|
|
151
|
+
| ------------- | ------------------ | ----------------------------------------------------------------------------- |
|
|
152
|
+
| `weights` | `{}` (nothing) | Preset and custom-warp weights by name, 0..3, or a ref read every frame |
|
|
153
|
+
| `warps` | none | Your own warps by name |
|
|
154
|
+
| `weight` | 1 | Overall fade 0..1, or a ref |
|
|
155
|
+
| `faceIndex` | every tracked face | Only this face (default: the enclosing `FaceTracker`'s face, else every face) |
|
|
156
|
+
| `numFaces` | 1 | Faces the face model tracks when this starts it |
|
|
157
|
+
| `smoothing` | 0.35 | Landmark smoothing 0..1 |
|
|
158
|
+
| `active` | true | False: no model, no copy, nothing drawn |
|
|
159
|
+
| `debug` | false | Draws each warp's circle and direction, and the face's points |
|
|
160
|
+
| `renderOrder` | 998 | The pass's render order |
|
|
161
|
+
|
|
162
|
+
## Limits
|
|
163
|
+
|
|
164
|
+
- **Draw order.** The warp draws at render order 998. Content drawn after it stays sharp: screen UI
|
|
165
|
+
(999+), a transparent mesh placed directly inside a tracker (wrap it in a `<group>` to warp it),
|
|
166
|
+
your own content at 998 or above.
|
|
167
|
+
- **Opaque screen UI** (`transparent={false}`) draws before it and warps.
|
|
168
|
+
- **Render targets.** Multisampled or float targets (effect composers), WebXR and multi-target passes
|
|
169
|
+
are drawn unwarped, with one console warning.
|
|
170
|
+
- **Cost.** Each face copies and redraws only its warp area. Check phone performance before shipping a
|
|
171
|
+
multi-face effect.
|
|
172
|
+
|
|
173
|
+
## Example
|
|
174
|
+
|
|
175
|
+
`/face-warp` in the SDK playground, mode "2D liquify", has the preset sliders, a custom-warp editor
|
|
176
|
+
that shows the code to paste, an animate toggle, one or two faces, hands in front and the debug
|
|
177
|
+
circles. Settings are in the URL: `?lq=bigEyes:1,smile:2`, `?lqdebug=1`, `?lqanim=1`,
|
|
178
|
+
`?lqfaces=2`, `?hands=0`. Mode "both" adds the 3D shape keys under the liquify.
|
|
179
|
+
|
|
180
|
+
## Manual visual test plan
|
|
181
|
+
|
|
182
|
+
Open `/face-warp` on the webcam.
|
|
183
|
+
|
|
184
|
+
1. **Weight 0** (all presets off): the image is untouched. No edge, band or shimmer around the face.
|
|
185
|
+
2. **Each preset at 1, then 3**: 1 looks natural, 3 is a strong cartoon. No tearing, no fold, no hard
|
|
186
|
+
circle edge.
|
|
187
|
+
3. **Sides**: with debug on, the circles sit on your own eyes, mouth corners, jaw and chin, and follow
|
|
188
|
+
tilt and turn.
|
|
189
|
+
4. **Turned head**: turn far to one side with `chubbyCheeks` at 3. The far cheek fades instead of
|
|
190
|
+
smearing over the nose.
|
|
191
|
+
5. **Dropout**: cover the camera for a moment. The warp holds briefly, then fades out; it fades back
|
|
192
|
+
in when you reappear.
|
|
193
|
+
6. **Hands**: with hands in front, put a hand over your mouth with `bigMouth` at 3. The hand keeps its
|
|
194
|
+
real size, with no hand colour spreading into the face. Show a hand away from your face: no hole
|
|
195
|
+
appears in the warp.
|
|
196
|
+
7. **Two faces**: faces "two" on the two-people clip warps both people.
|