@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,350 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Face Swap"
|
|
3
|
+
description: "Two people swap faces, a photo or a painted face goes on every face, or your own face is mirrored, live on the camera, in the wearer's skin tone and light."
|
|
4
|
+
sidebarTitle: "Face Swap"
|
|
5
|
+
icon: "people-arrows"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
`FaceSwap` and `FaceMirror` draw a face on a tracked face, live on the camera:
|
|
9
|
+
|
|
10
|
+
- **Two people swap faces.** It starts by itself when two faces are in view.
|
|
11
|
+
- **A photo or a painted face** goes on every face (or only one).
|
|
12
|
+
- **Your own face, mirrored:** one half doubled, the halves swapped, or the eyes and mouth upside
|
|
13
|
+
down.
|
|
14
|
+
|
|
15
|
+
The drawn face moves with the wearer's expression, takes the wearer's skin tone and light, and
|
|
16
|
+
fades in centimetres inside the face edge. Both components start the face model themselves.
|
|
17
|
+
Import from `@vincentt-xr/sdk/face-effects` ([#275](https://github.com/vincentt-xr/sdk/issues/275)).
|
|
18
|
+
|
|
19
|
+
## Quick start
|
|
20
|
+
|
|
21
|
+
```tsx
|
|
22
|
+
import { VideoBackground, XRProvider, XRScene } from "@vincentt-xr/sdk";
|
|
23
|
+
import { FaceMirror, FaceSwap } from "@vincentt-xr/sdk/face-effects";
|
|
24
|
+
|
|
25
|
+
<XRProvider>
|
|
26
|
+
<XRScene>
|
|
27
|
+
<VideoBackground />
|
|
28
|
+
{/* Two people swap faces automatically; with one face the camera shows as is */}
|
|
29
|
+
<FaceSwap onStatus={(s) => setSwapping(s.active)} />
|
|
30
|
+
</XRScene>
|
|
31
|
+
</XRProvider>;
|
|
32
|
+
|
|
33
|
+
// Any photo: File, Blob, URL, <img>, canvas or ImageBitmap
|
|
34
|
+
<FaceSwap source={{ kind: "photo", src: file }} onStatus={(s) => setWarnings(s.warnings)} />;
|
|
35
|
+
// A face painted in the face atlas: keeps its paint, takes the room's light
|
|
36
|
+
<FaceSwap source={{ kind: "canonicalTexture", src: paintedUrl }} />;
|
|
37
|
+
// Your own face, the left half twice
|
|
38
|
+
<FaceMirror variant="leftLeft" />;
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Which component
|
|
42
|
+
|
|
43
|
+
| Goal | Use |
|
|
44
|
+
| -------------------------------------------------------------- | ------------------------------------------------------------------------ |
|
|
45
|
+
| Two people swap faces, or a photo / painted face on every face | `FaceSwap` |
|
|
46
|
+
| Your own face mirrored | `FaceMirror variant` |
|
|
47
|
+
| Your own face texture on a live face (a custom effect) | `FaceTextureLayer face`, fed by `useFaceTexture` or `useLiveFaceTexture` |
|
|
48
|
+
| A face drawn into a picture or a render target, or no React | `FaceTransfer` with `createFaceTexture` |
|
|
49
|
+
|
|
50
|
+
**Mounting.** Mount them anywhere in `<XRScene>`, also inside a `<FaceTracker>`. They draw in
|
|
51
|
+
screen space and need no `FaceRig`. With no `FaceTracker` above, they start the face model
|
|
52
|
+
themselves: `FaceSwap` with two faces for a two-person swap, otherwise one. The first component to
|
|
53
|
+
start the model sets its face count, so anything else that may start it first needs the same
|
|
54
|
+
`numFaces`. A console warning names the fix when a face the component needs can never be tracked.
|
|
55
|
+
Keep hands in front with `<HandTracker><HandCutout /></HandTracker>`.
|
|
56
|
+
|
|
57
|
+
## FaceSwap
|
|
58
|
+
|
|
59
|
+
### Sources
|
|
60
|
+
|
|
61
|
+
| `source` | What is drawn |
|
|
62
|
+
| ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
|
|
63
|
+
| `{ kind: "eachOther" }` (default) | Faces 0 and 1 swap. |
|
|
64
|
+
| `{ kind: "photo", src, mirrored?, pick?, maxSize? }` | The face found in a photo, on every tracked face. `pick`: `"largest"` (default) or the n-th face from the left. |
|
|
65
|
+
| `{ kind: "canonicalTexture", src, mirrored? }` | A face painted in the face atlas (a URL or a `THREE.Texture`), on every tracked face. |
|
|
66
|
+
| `{ kind: "faceTexture", face }` | A `FaceTexture` you made (`useFaceTexture`, `createFaceTexture`, `useLiveFaceTexture`); it stays yours to dispose. |
|
|
67
|
+
|
|
68
|
+
`mirrored` says the image itself is mirrored (some phones save selfies mirrored). A mirrored selfie
|
|
69
|
+
cannot be detected from the pixels, so it is your app's toggle.
|
|
70
|
+
|
|
71
|
+
### Props
|
|
72
|
+
|
|
73
|
+
Every setting below is also a prop, flat (`<FaceSwap matchLighting={0.5} />`), plus:
|
|
74
|
+
|
|
75
|
+
| Prop | Default | What it does |
|
|
76
|
+
| ----------- | ------------------------ | ----------------------------------------------------------------------------------- |
|
|
77
|
+
| `source` | `{ kind: "eachOther" }` | The face drawn (above). |
|
|
78
|
+
| `amount` | `1` | 0..1, or a ref read every frame, so it can fade without re-rendering. |
|
|
79
|
+
| `faceIndex` | every tracked face | Photo, painted and `faceTexture` sources: only this face. Ignored for two people. |
|
|
80
|
+
| `numFaces` | 2 for two people, else 1 | Faces to start the face model with. |
|
|
81
|
+
| `quality` | `"auto"` | `"auto"` follows the session's quality tier; or `"high"`, `"medium"`, `"low"`. |
|
|
82
|
+
| `active` | `true` | `false` hides it and stops its passes and its face model, but keeps a loaded photo. |
|
|
83
|
+
| `onStatus` | | Called whenever the status changes (not every frame). |
|
|
84
|
+
|
|
85
|
+
The status is `{ active, faces, source, warnings, error }`:
|
|
86
|
+
|
|
87
|
+
- `active`: drawn now (fading in, shown or fading out);
|
|
88
|
+
- `faces`: faces in the newest face result;
|
|
89
|
+
- `source`: `"waiting"` (no source yet, or fewer than two ready faces for a two-person swap),
|
|
90
|
+
`"loading"`, `"ready"` or `"error"`;
|
|
91
|
+
- `warnings`: for photos, any of `turned` (head turned more than 25°), `eyesClosed`, `mouthOpen`,
|
|
92
|
+
`small` (eyes less than 60 px apart) and `severalFaces`;
|
|
93
|
+
- `error`: `{ code, message }` with code `noFace`, `decode`, `cors`, `model` or `aborted`.
|
|
94
|
+
|
|
95
|
+
### Behaviour
|
|
96
|
+
|
|
97
|
+
- **Two people.** The swap starts once both faces have been tracked for 5 face results and fades
|
|
98
|
+
in over 200 ms. It holds through a dropout of up to 250 ms, then fades back to the plain camera
|
|
99
|
+
(also after 1 s with no face results at all). MediaPipe reordering the faces changes nothing.
|
|
100
|
+
Where the faces overlap, the larger face draws on top. With three or more faces, only faces 0 and
|
|
101
|
+
1 swap.
|
|
102
|
+
- **Photos and painted faces.** Each tracked face fades in with its first result and out 250 ms
|
|
103
|
+
after it is lost.
|
|
104
|
+
- **Own eyes and mouth.** By default the wearer keeps their own live eyes and mouth inside the drawn
|
|
105
|
+
face (`ownEyes`, `ownMouth`), so blinks, gaze, teeth and tongue stay real. Turn them off for the
|
|
106
|
+
source's own eyes and mouth: a photo's or painting's stay still.
|
|
107
|
+
- **Expression.** The wearer's expression moves the drawn face. A still face has a neutral, closed
|
|
108
|
+
mouth, so its lips stretch when the wearer talks.
|
|
109
|
+
|
|
110
|
+
## Settings and presets
|
|
111
|
+
|
|
112
|
+
| Field | Range | Default | What it does |
|
|
113
|
+
| ----------------- | -------- | --------- | ----------------------------------------------------------------------------------------- |
|
|
114
|
+
| `preset` | | `natural` | `natural`, `keepColors`, `raw`, or `"custom"`. |
|
|
115
|
+
| `matchSkinTone` | 0..1 | 1 | The drawn face takes the wearer's skin tone, exposure and white balance. |
|
|
116
|
+
| `matchLighting` | 0..1 | 1 | The wearer's light and shadow fall on the drawn face. |
|
|
117
|
+
| `edgeMatch` | 0..1 | 1 | The band inside the face edge always takes the wearer's tone and light, so no seam shows. |
|
|
118
|
+
| `edgeSoftness` | 0.3..3 | 1.2 | Width of the fade inside the face edge, cm. |
|
|
119
|
+
| `edgeInset` | 0..1.5 | 0.3 | Pulls the edge inside the tracked outline, cm. |
|
|
120
|
+
| `ownEyes` | boolean | true | The wearer keeps their live eyes. |
|
|
121
|
+
| `ownMouth` | boolean | true | The wearer keeps their live mouth interior. |
|
|
122
|
+
| `featureSoftness` | 0.1..0.6 | 0.25 | Soft rim around the kept eyes and mouth, cm (0.1 for painted faces). |
|
|
123
|
+
| `detail` | 0..1 | 1 | Sharpness of the drawn face; lower softens it to match a soft camera. |
|
|
124
|
+
| `smoothing` | 0..1 | 0.35 | Landmark smoothing. Shared per face: the most any component asks for wins. |
|
|
125
|
+
| `amount` | 0..1 | 1 | Overall strength. |
|
|
126
|
+
|
|
127
|
+
| Preset | For | Sets |
|
|
128
|
+
| ------------ | ------------------------- | ---------------------------------------------------------------------------- |
|
|
129
|
+
| `natural` | photos and two people | Full skin-tone and light match, 1.2 cm edge, own eyes and mouth. |
|
|
130
|
+
| `keepColors` | painted or stylised faces | No skin-tone match, 0.7 light match, 1 cm edge: the paint keeps its colours. |
|
|
131
|
+
| `raw` | a mask look, or debugging | No matching, a short 0.4 cm edge: the face as captured. |
|
|
132
|
+
|
|
133
|
+
- Without `preset`, a painted face starts from `keepColors` with a 0.1 cm feature rim; photos and
|
|
134
|
+
two people start from `natural`.
|
|
135
|
+
- A named preset always means its values: an explicit value that moves a field the preset sets
|
|
136
|
+
makes it `"custom"`. Smoothing, inset, feature softness and amount are never set by a preset.
|
|
137
|
+
- `resolveFaceSwapSettings(input, { source })` resolves props (defaults, then the preset, then your
|
|
138
|
+
values, clamped). `patchFaceSwapSettings(prev, patch)` applies a panel edit: choosing a preset
|
|
139
|
+
applies it, editing a field it sets makes it `"custom"`. `FACE_SWAP_SETTINGS_FIELDS` drives a
|
|
140
|
+
settings panel; `FaceSwapSettingsPanel` from `@vincentt-xr/sdk/debug-ui` is a ready one.
|
|
141
|
+
|
|
142
|
+
## Colour and edges
|
|
143
|
+
|
|
144
|
+
**Colour.** The drawn face is multiplied by a gain per colour channel, in linear light, computed per
|
|
145
|
+
vertex:
|
|
146
|
+
|
|
147
|
+
- **Skin tone** (`matchSkinTone`): the ratio of the wearer's mean skin colour to the source's. It
|
|
148
|
+
carries skin tone, exposure and white balance.
|
|
149
|
+
- **Light** (`matchLighting`): the ratio of the wearer's local, low-frequency skin colour to the
|
|
150
|
+
source's, relative to their means. It is applied at full strength for brightness and half
|
|
151
|
+
strength for colour, so coloured light does not tint the skin. A painted face only takes the
|
|
152
|
+
wearer's light: its own painted shading keeps its contrast.
|
|
153
|
+
- The gain is clamped to 0.25–4.
|
|
154
|
+
|
|
155
|
+
The statistics are skin only: brows, eyes, lips and nostrils are masked out, and outliers
|
|
156
|
+
(speculars, beard, glasses frames) are rejected. They are blurred to 64² and smoothed over 250 ms,
|
|
157
|
+
so a flicker in one frame never shows.
|
|
158
|
+
|
|
159
|
+
**Edges.** Every distance is in cm on the face, measured from a smoothed face outline, so the fade
|
|
160
|
+
lines are smooth curves. The alpha is the product of:
|
|
161
|
+
|
|
162
|
+
- the edge fade: from `edgeInset` inside the outline, over `edgeSoftness`;
|
|
163
|
+
- how squarely the wearer's face points at the camera there;
|
|
164
|
+
- how much of the source was seen there (a photo's turned-away cheek is filled from the other side
|
|
165
|
+
when it is baked);
|
|
166
|
+
- soft rims of `featureSoftness` around the kept eyes and mouth.
|
|
167
|
+
|
|
168
|
+
Inside the fade, a band twice as wide always takes the wearer's tone and light (`edgeMatch`), so
|
|
169
|
+
the drawn face meets the real skin with no seam even when `matchSkinTone` is 0.
|
|
170
|
+
|
|
171
|
+
## FaceMirror
|
|
172
|
+
|
|
173
|
+
```tsx
|
|
174
|
+
<FaceMirror variant="leftLeft" /> // both halves are your own LEFT half
|
|
175
|
+
<FaceMirror variant="rightRight" /> // both halves are your own RIGHT half
|
|
176
|
+
<FaceMirror variant="flip" /> // left and right swapped: a left wink shows on the right
|
|
177
|
+
<FaceMirror variant="upsideDown" /> // each eye and the mouth flipped top to bottom in place
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
| Prop | Default | What it does |
|
|
181
|
+
| --------------- | ------------------ | ---------------------------------------------------------------------------- |
|
|
182
|
+
| `variant` | required | `leftLeft`, `rightRight`, `flip` or `upsideDown`. |
|
|
183
|
+
| `matchLighting` | `1` | The real side light stays where it falls; `0` shows the raw mirrored pixels. |
|
|
184
|
+
| `edgeSoftness` | `1.2` | Width of the fade inside the face edge, cm. |
|
|
185
|
+
| `smoothing` | `0.35` | Landmark smoothing. |
|
|
186
|
+
| `amount` | `1` | 0..1, or a ref. |
|
|
187
|
+
| `faceIndex` | every tracked face | Only this face. |
|
|
188
|
+
| `numFaces` | `1` | Faces to start the face model with. |
|
|
189
|
+
| `quality` | `"auto"` | As for `FaceSwap`. |
|
|
190
|
+
| `active` | `true` | `false` hides it and stops its passes. |
|
|
191
|
+
|
|
192
|
+
- Left and right are the person's own sides on the mirrored webcam, the rear camera and videos
|
|
193
|
+
alike.
|
|
194
|
+
- The eyes and mouth are part of every variant: they always come from the mirrored face, so a left
|
|
195
|
+
wink in `leftLeft` winks both eyes.
|
|
196
|
+
- Where the far side of a turned face was not seen, the real face shows.
|
|
197
|
+
|
|
198
|
+
## Sides
|
|
199
|
+
|
|
200
|
+
Left and right always mean the person's own side. A face texture's `mirrored` flag says which side
|
|
201
|
+
of the canonical face is the person's left: `true` for a live face on the mirrored webcam or a
|
|
202
|
+
selfie saved mirrored, `false` for a photo as stored, a painted face, and a live face on the rear
|
|
203
|
+
camera or a video. When a face is drawn on another, the sides are matched through that flag and the
|
|
204
|
+
exact landmark mirror map (`FACE_UNWRAP_MIRROR`, `resolveFaceSourceMirror`), never by flipping the
|
|
205
|
+
texture. A photo's left cheek lands on the wearer's left cheek on every feed.
|
|
206
|
+
|
|
207
|
+
## Face textures and FaceTextureLayer
|
|
208
|
+
|
|
209
|
+
A `FaceTexture` is one face laid flat in the face atlas (`FACE_ATLAS_UVS`): its `map`, its skin
|
|
210
|
+
statistics `low` and `mean`, `mirrored`, and for photos the detected `landmarks`.
|
|
211
|
+
|
|
212
|
+
```tsx
|
|
213
|
+
import {
|
|
214
|
+
FaceTextureLayer,
|
|
215
|
+
useFaceTexture,
|
|
216
|
+
useLiveFaceTexture,
|
|
217
|
+
} from "@vincentt-xr/sdk/face-effects";
|
|
218
|
+
|
|
219
|
+
// Inside <XRScene>: these need the renderer.
|
|
220
|
+
const photo = useFaceTexture({ kind: "photo", src: file }); // { face, status, warnings, error, faceCount }
|
|
221
|
+
const second = useLiveFaceTexture(1); // stable, updated in place; null until made
|
|
222
|
+
|
|
223
|
+
<FaceTextureLayer face={photo.face} />;
|
|
224
|
+
<FaceTextureLayer face={second} faceIndex={0} />;
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
- `useFaceTexture(source)` bakes a photo or painted face once per URL or object, aborts a stale load
|
|
228
|
+
and disposes the face on change or unmount.
|
|
229
|
+
- `useLiveFaceTexture(faceIndex)` is shared and refcounted per face: every component asking for the
|
|
230
|
+
same face shares one unwrap and one set of statistics. It updates only when a new face result
|
|
231
|
+
arrives, from smoothed landmarks, so it never swims.
|
|
232
|
+
- `FaceTextureLayer` draws any face texture on a tracked face with the same settings as `FaceSwap`,
|
|
233
|
+
plus `layout` (`asIs`, `flip`, `leftLeft`, `rightRight`, `upsideDown`) and `targetStats`. It starts
|
|
234
|
+
the face model one commit after it mounts, so `useLiveFaceTexture(1)` above it starts the model
|
|
235
|
+
with two faces.
|
|
236
|
+
- Without React: `createFaceTexture(renderer, source)` bakes a face (you dispose it), and
|
|
237
|
+
`FaceTransfer` draws it: `setTarget(landmarks, aspect)` or a live map, `setSource`,
|
|
238
|
+
`setTargetStats`, `setLayout`, `setSettings`, `setAmount`, then render its `mesh` into the scene or
|
|
239
|
+
into a picture-sized render target.
|
|
240
|
+
- `detectFaceImage(image)` finds the faces in a still image (the same face model, run in image mode
|
|
241
|
+
on the CPU).
|
|
242
|
+
|
|
243
|
+
## Painting a face
|
|
244
|
+
|
|
245
|
+
A painted face is one image in the face atlas layout:
|
|
246
|
+
|
|
247
|
+
- **Layout.** Upright, chin at the bottom, image left = the character's own RIGHT, as on an
|
|
248
|
+
unmirrored photo. The template labels both halves.
|
|
249
|
+
- **Coverage.** Opaque about 5 mm past the face outline; the fade sits inside it. Straight alpha.
|
|
250
|
+
- **Look.** A neutral face, eyes open, lips closed, in flat even light: `matchLighting` adds the
|
|
251
|
+
room's light.
|
|
252
|
+
- **Eyes and mouth.** Paint the eye and mouth fills too: they show when `ownEyes` or `ownMouth` is
|
|
253
|
+
off. Keep liner and lip lines outside the dashed feature rims in the template, or the wearer's own
|
|
254
|
+
lid and lips show through them.
|
|
255
|
+
- **Size.** 1024², WebP or PNG.
|
|
256
|
+
|
|
257
|
+
Template: [`docs/guides/face-texture-template.svg`](/guides/face-texture-template.svg), or in your
|
|
258
|
+
app `createFaceTextureGuideSvg()` / `createFaceTextureGuidePngBlob()`, which draw the outline, the
|
|
259
|
+
edge fade lines of a preset, the feature rims, the skin-statistics area and the side labels.
|
|
260
|
+
`createFaceTextureSideTestSvg()` draws a test face with an "L" on the character's own left cheek:
|
|
261
|
+
worn as a source, it reads like a sticker on the wearer's left cheek. The Blender pipeline used for
|
|
262
|
+
the two example faces is in `assets-src/face-swap/README.md`.
|
|
263
|
+
|
|
264
|
+
## Layering
|
|
265
|
+
|
|
266
|
+
The swap, the mirror and `FaceTextureLayer` _are_ the face (render order −2):
|
|
267
|
+
|
|
268
|
+
| Layer | Order | With the swap |
|
|
269
|
+
| -------------------------------------------- | ------------- | ------------------------------------------------------------------------------------------------ |
|
|
270
|
+
| Camera background | −1000 | Under it. |
|
|
271
|
+
| `HandCutout` | −900 | Hands stay in front. |
|
|
272
|
+
| `FaceRetouch` | −2.5 | Covered where the swap draws; do not combine. |
|
|
273
|
+
| `FaceSwap`, `FaceMirror`, `FaceTextureLayer` | −2 | The face. One face effect per face: not with `FaceWarp3D`, `FaceMorph` or an `ExternalFaceMesh`. |
|
|
274
|
+
| Makeup, `LipEffect` | −1.99 … −1.55 | Paint on top, shaded from the raw camera. |
|
|
275
|
+
| `FaceInset` | −1.5 | Shows the raw camera part. |
|
|
276
|
+
| Head occluder | −1 | Unchanged. |
|
|
277
|
+
| Accessories | 0+ | Draw on top. |
|
|
278
|
+
|
|
279
|
+
## Performance
|
|
280
|
+
|
|
281
|
+
Targets: about 30 fps on a mid-range phone with one feature on. The numbers below are estimates
|
|
282
|
+
until they are measured on devices.
|
|
283
|
+
|
|
284
|
+
| Mode | GPU per frame | Per face result | One-time |
|
|
285
|
+
| --------------------- | ------------------------ | -------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
|
|
286
|
+
| Photo or painted face | 1 draw, about 0.3–0.5 ms | skin statistics at 6–15 Hz, under 0.1 ms | Photo: decode 20–60 ms; detector start 0.3–1.5 s (first photo); detection 30–100 ms; bake under 5 ms |
|
|
287
|
+
| Mirror | 1 draw | one unwrap, 512–1024², about 0.2–0.5 ms | none |
|
|
288
|
+
| Two people | 2 draws, about 0.6–1 ms | two unwraps with mirror fill, about 0.6–1 ms | none |
|
|
289
|
+
|
|
290
|
+
- **Two people cost most in inference:** two-face tracking runs on a larger analysis image and
|
|
291
|
+
re-runs face detection while fewer than two faces are tracked. Expect 1.6–2.5× the one-face
|
|
292
|
+
inference time; `FaceSwap` cannot reduce it.
|
|
293
|
+
- **Quality tiers** (`quality: "auto"` follows the session tier):
|
|
294
|
+
|
|
295
|
+
| Tier | Mesh | Live map max | Mirror fill (two people) | Statistics |
|
|
296
|
+
| ------ | ------------------------ | ------------ | ------------------------ | ---------- |
|
|
297
|
+
| high | level 2, 14.5k triangles | 1024 | on | 15 Hz |
|
|
298
|
+
| medium | level 2 | 768 | on | 10 Hz |
|
|
299
|
+
| low | level 1, 3.6k triangles | 512 | off | 6 Hz |
|
|
300
|
+
|
|
301
|
+
The live map is also capped by the face's size on screen.
|
|
302
|
+
|
|
303
|
+
- **Memory:** a photo or painted face is about 5.6 MB of GPU memory; a live map 1.4–5.6 MB per face.
|
|
304
|
+
The photo detector is a second MediaPipe instance (20–40 MB, with its own small WebGL context); it
|
|
305
|
+
closes after 30 s idle or with `disposeFaceImageLandmarker()`.
|
|
306
|
+
|
|
307
|
+
Device results (device, browser, tier, fps, date) are recorded here once measured.
|
|
308
|
+
|
|
309
|
+
## Privacy
|
|
310
|
+
|
|
311
|
+
The SDK accepts any photo, so a real person's face can be swapped. Photos are decoded in memory
|
|
312
|
+
only: nothing is uploaded, stored or put in the URL, and a baked face is disposed when it is
|
|
313
|
+
replaced. No real person's face ships with the SDK. Ask for consent before using someone's photo;
|
|
314
|
+
whether captures that contain a swap carry a disclosure is your product's decision.
|
|
315
|
+
|
|
316
|
+
## Example
|
|
317
|
+
|
|
318
|
+
`/face-reprojection` has `?mode=swap` and `?mode=mirror` (with `?mode=character` for the face
|
|
319
|
+
character):
|
|
320
|
+
|
|
321
|
+
- `?mode=swap&with=eachOther&source=sdk-video-5`: two people swap on the two-person clip;
|
|
322
|
+
- `?mode=swap&with=painted-female&preset=keepColors`: a painted face on yours;
|
|
323
|
+
- `?mode=swap&with=sideTest`: the side test;
|
|
324
|
+
- `?mode=mirror&variant=upsideDown&matchLighting=0`: the Thatcher effect, raw.
|
|
325
|
+
|
|
326
|
+
## Manual visual test plan
|
|
327
|
+
|
|
328
|
+
Record each run with the device and the date.
|
|
329
|
+
|
|
330
|
+
1. **Sides.** `?mode=swap&with=sideTest` on the webcam, the rear camera and a clip: the "L" lands on
|
|
331
|
+
the person's own left cheek every time. With a sticker on your real left cheek: `leftLeft` shows
|
|
332
|
+
it on both cheeks, `rightRight` on neither, `flip` on the right. A left wink in `leftLeft` winks
|
|
333
|
+
both eyes.
|
|
334
|
+
2. **Registration.** `<FaceTextureLayer face={useLiveFaceTexture(0)} layout="asIs" />` looks like the
|
|
335
|
+
plain camera while talking and turning: no shift, no swimming.
|
|
336
|
+
3. **Turned head.** At about 30° of yaw in a two-person swap, the nose covers the far cheek and no
|
|
337
|
+
cheek is painted over the nose.
|
|
338
|
+
4. **Two people.** On `sdk-video-5` and with two real people: when one leaves, the camera is back to
|
|
339
|
+
normal within about 0.5 s; when they return, the swap comes back after a few frames and the fade;
|
|
340
|
+
when the faces reorder, there is no colour flash.
|
|
341
|
+
5. **Photos.** Local photos only, never committed: an EXIF-rotated portrait, a 12 MP image, a face
|
|
342
|
+
turned 30° (the far cheek is filled; `turned` warning), closed eyes (warning), a group photo (the
|
|
343
|
+
largest face is used).
|
|
344
|
+
6. **Colour.** Several skin tones, side light, warm and cool white balance, and a dark-skin /
|
|
345
|
+
light-skin pair: no seam with `natural` at `edgeSoftness` 0.5, 1.2 and 3. `raw` shows the raw
|
|
346
|
+
difference. A painted face with `keepColors` keeps its paint and blends at the edge.
|
|
347
|
+
7. **Occluders.** A hand over the face (`HandCutout`), glasses and earrings drawing on top, bangs.
|
|
348
|
+
8. **Mirror variants.** Each one, including `upsideDown` with the mouth open.
|
|
349
|
+
9. **Performance.** Every tier on a Pixel 6a, a Galaxy A54 and an iPhone 12, with
|
|
350
|
+
`useXRDiagnostics`. Memory stays flat after 10 photo re-picks.
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Face Warp 3D"
|
|
3
|
+
description: "Reshape the live face with blend shapes — bigger eyes, a longer nose, chubby cheeks — using the camera image itself as the texture."
|
|
4
|
+
sidebarTitle: "Face Warp 3D"
|
|
5
|
+
icon: "face-grin-tongue-wink"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
`FaceWarp3D` reshapes the person's real face with blend shapes (shape keys), as Spark AR's face mesh
|
|
9
|
+
deformation did: bigger eyes, a longer nose, chubby cheeks, a big forehead.
|
|
10
|
+
|
|
11
|
+
- **Real pixels.** Every pixel is the camera image itself, moved, so the result is photoreal and
|
|
12
|
+
the person's own expression carries on underneath.
|
|
13
|
+
- **Weight 0** leaves the camera image untouched.
|
|
14
|
+
|
|
15
|
+
It is part of the face-character pipeline ([#194](https://github.com/vincentt-xr/sdk/issues/194)).
|
|
16
|
+
Import from `@vincentt-xr/sdk/face-effects`.
|
|
17
|
+
|
|
18
|
+
## Quick start
|
|
19
|
+
|
|
20
|
+
```tsx
|
|
21
|
+
import { FaceWarp3D } from "@vincentt-xr/sdk/face-effects";
|
|
22
|
+
import { FaceTracker } from "@vincentt-xr/sdk/tracking";
|
|
23
|
+
|
|
24
|
+
<FaceTracker>
|
|
25
|
+
<FaceWarp3D deformation={gltf.scene} weights={{ bigEyes: 0.8, longNose: 0.3 }} />
|
|
26
|
+
</FaceTracker>;
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## FaceWarp3D or FaceMorph?
|
|
30
|
+
|
|
31
|
+
They are different effects.
|
|
32
|
+
|
|
33
|
+
| | `FaceWarp3D` | [`FaceMorph`](/api/face-morph) |
|
|
34
|
+
| ------------ | --------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
|
|
35
|
+
| What you see | The person, photoreal: their own skin, hair and expression, reshaped | Another object (a ball, a box, a character shape) wearing the camera face |
|
|
36
|
+
| How | Shape keys move the camera's own pixels; weight 0 = the image untouched | A mesh is rendered, textured with the unwrapped camera face |
|
|
37
|
+
| Best for | Big eyes, a big nose, chubby or slim faces, chibi or alien proportions, your face shaped like a character | Turning into a shape, transformation sweeps, stylised heads |
|
|
38
|
+
| Avoid for | Changing the skull or hair (face only) | Realistic heads (their skull shows the model's material, not hair) |
|
|
39
|
+
|
|
40
|
+
Use one face effect per face; they all draw over the face.
|
|
41
|
+
|
|
42
|
+
## Authoring blend shapes
|
|
43
|
+
|
|
44
|
+
Shape keys live on a model in the canonical head frame (centimetres, Y up, Z out of the face), exported
|
|
45
|
+
as glTF morph targets.
|
|
46
|
+
|
|
47
|
+
- **On the canonical face (exact).** Sculpt on the reference mesh
|
|
48
|
+
`assets-src/face-character/canonical-face-reference.glb` in the SDK repo, or export
|
|
49
|
+
`createCanonicalFaceGeometry()` with three's `GLTFExporter`. Its 468 vertices are the face
|
|
50
|
+
landmarks, in order. Every key applies exactly, and key names become the `weights` names.
|
|
51
|
+
- **On any other mesh (transferred).** A head in the same frame, such as Snap's face + skull mesh
|
|
52
|
+
with a sculpted key, has its keys transferred: each point of the face takes the offset at its
|
|
53
|
+
closest point on the mesh's base surface.
|
|
54
|
+
- **A model's own shape.** A model without shape keys gives one key, `"shape"`, measured along the
|
|
55
|
+
face's normal: the face takes the model's proportions. The facecap example reads best this way.
|
|
56
|
+
|
|
57
|
+
### In Blender
|
|
58
|
+
|
|
59
|
+
1. **Import.** File → Import → glTF 2.0, with default settings. Leave its location, rotation and
|
|
60
|
+
scale as they are.
|
|
61
|
+
2. **Add a key.** Object Data properties → Shape Keys: click `+` once for the Basis, then `+` again
|
|
62
|
+
for your key. Rename it (`bigEyes`).
|
|
63
|
+
3. **Sculpt.** With the key selected, sculpt or edit the mesh, with X symmetry on for a balanced face.
|
|
64
|
+
Slide the key's value to preview.
|
|
65
|
+
4. **Keep the vertices.** Never add, delete, merge or reorder them: no remesh, no "merge by
|
|
66
|
+
distance", no applied subdivision. Blender's glTF import and export keep the vertices and their
|
|
67
|
+
order (tested).
|
|
68
|
+
5. **Export.** File → Export → glTF 2.0 (`.glb`), with Data → Shape Keys on and Apply Modifiers off.
|
|
69
|
+
+Y up is the default.
|
|
70
|
+
6. **More keys.** One file can carry many keys (up to `FACE_WARP_MAX_KEYS`, 16, apply). Give each its
|
|
71
|
+
own slider through `weights`.
|
|
72
|
+
|
|
73
|
+
The warp mesh is the face with the eyes and mouth covered, so keys can move the eyes and lips too.
|
|
74
|
+
Two **skirt** rings past the face's edge stretch the surrounding hair, ears and neck pixels. That lets
|
|
75
|
+
the edge of the face move (puffed cheeks, a smaller chin) without uncovering the original or leaving
|
|
76
|
+
a seam.
|
|
77
|
+
|
|
78
|
+
## Props
|
|
79
|
+
|
|
80
|
+
| Prop | Default | What it does |
|
|
81
|
+
| -------------- | ------- | --------------------------------------------------------------------------------- |
|
|
82
|
+
| `deformation` | `null` | The model with shape keys (see above). `null` shows the face mesh only. |
|
|
83
|
+
| `weights` | — | A weight per shape key, by name. A key left out is at 1. Also a ref. |
|
|
84
|
+
| `weight` | `1` | Overall strength, multiplying every key. Also a ref. |
|
|
85
|
+
| `expression` | `1` | The face's own expression: 0 freezes it, more than 1 exaggerates it. Also a ref. |
|
|
86
|
+
| `subdivisions` | `2` | Face mesh density (2 ≈ 7,500 vertices; smoother sculpts). |
|
|
87
|
+
| `opacity` | `1` | Opacity of the warped face. |
|
|
88
|
+
| `onKeys` | — | Receives the shape-key names found on `deformation`, for sliders. |
|
|
89
|
+
| rig props | — | `faceIndex`, `smoothing`, `holdMs`, `neutral` … (when it runs its own `FaceRig`). |
|
|
90
|
+
|
|
91
|
+
## Animating without re-rendering
|
|
92
|
+
|
|
93
|
+
`weights`, `weight` and `expression` also take a ref (`LiveValue<T>`), read every frame. Drive them from
|
|
94
|
+
`useFrame`, or from a `FaceExpressionController` `set` output, without re-rendering React:
|
|
95
|
+
|
|
96
|
+
```tsx
|
|
97
|
+
const keys = useRef({ bigEyes: 0 });
|
|
98
|
+
useFrame(({ clock }) => {
|
|
99
|
+
keys.current.bigEyes = (Math.sin(clock.elapsedTime) + 1) / 2;
|
|
100
|
+
});
|
|
101
|
+
<FaceWarp3D deformation={gltf.scene} weights={keys} />;
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## How it works
|
|
105
|
+
|
|
106
|
+
1. **Live face.** Every frame the CPU writes the live face (`FaceRigState.local`, 471 points with the
|
|
107
|
+
eye and mouth centres) into a small float texture. That is all the per-frame CPU work.
|
|
108
|
+
2. **Deformation, on the GPU.** The vertex shader interpolates each vertex's live point, then adds
|
|
109
|
+
the shape keys' offsets (a float texture) times their weights:
|
|
110
|
+
`position = live + weight · Σ key · offset`. Skirt vertices follow their edge vertex with a
|
|
111
|
+
fading share of its move.
|
|
112
|
+
3. **Projective texture.** The shader projects each vertex's undeformed live position to the
|
|
113
|
+
screen. The camera image is drawn full-screen in the same space, so that point is the camera
|
|
114
|
+
texel under it. Every fragment samples there, which gives an exact identity at weight 0 even
|
|
115
|
+
while the head moves.
|
|
116
|
+
|
|
117
|
+
**Limitation (shared with Spark AR):** shrinking a feature far inside the face (a tiny mouth) can
|
|
118
|
+
show the original pixels that were there. Enlarging is always clean.
|
|
119
|
+
|
|
120
|
+
**Pure pieces:**
|
|
121
|
+
|
|
122
|
+
- `createFaceWarpMesh`, `bindFaceWarpDeformation`;
|
|
123
|
+
- `stepFaceWarp3D`, the CPU reference of the shader;
|
|
124
|
+
- `createFaceWarpGpuData` and `writeFaceWarpLiveTexels`, what the shader reads;
|
|
125
|
+
- `createCanonicalFaceGeometry`, `subdivideFaceUnwrap` and `createClosestPointSearch`.
|
|
126
|
+
|
|
127
|
+
## Migrating from the old FaceWarp3D
|
|
128
|
+
|
|
129
|
+
The 2.0.0-alpha.9 FaceWarp3D replaces the proportion sliders. These are removed:
|
|
130
|
+
|
|
131
|
+
- `FaceWarp3DSettings`, `FACE_WARP_3D_PRESET` and `DEFAULT_FACE_WARP_3D_SETTINGS`;
|
|
132
|
+
- `CanonicalFaceMeshRenderer`'s `faceWarp3D` prop;
|
|
133
|
+
- `FaceWarp3DHead`;
|
|
134
|
+
- the `FaceWarp3DSettingsPanel` debug panel.
|
|
135
|
+
|
|
136
|
+
To get the same looks, sculpt them as shape keys on the canonical face and give each a weight.
|
|
137
|
+
|
|
138
|
+
## Example
|
|
139
|
+
|
|
140
|
+
`/face-warp` in its 3D mode (`?mode=3d`; the old `/face-warp-3d` redirects there) has three sources:
|
|
141
|
+
|
|
142
|
+
- **facecap:** its own shape (local; the default when present);
|
|
143
|
+
- **demo:** shape keys sculpted in code on the canonical face (big eyes, long nose, chubby cheeks,
|
|
144
|
+
tiny mouth, big forehead), with one slider each;
|
|
145
|
+
- **Lens Studio head:** the chibi shape key, sculpted on Snap's face + skull + ears mesh
|
|
146
|
+
(local, git-ignored).
|
|
147
|
+
|
|
148
|
+
It also has controls for weight (or a looping animation, driven through a ref), expression and
|
|
149
|
+
opacity.
|
|
150
|
+
|
|
151
|
+
## Manual visual test plan
|
|
152
|
+
|
|
153
|
+
Open `/face-warp?mode=3d` on the webcam.
|
|
154
|
+
|
|
155
|
+
1. **Weight 0**: the image is untouched. No edge, band or shimmer, even while you move.
|
|
156
|
+
2. **Big eyes**: your eyes grow, your lids still blink, and your gaze still moves.
|
|
157
|
+
3. **Long nose / chubby cheeks / big forehead**: each reads clearly from the front and stays
|
|
158
|
+
photoreal (your own skin and hair). The edge of the face blends into the hair, ears and neck.
|
|
159
|
+
4. **Expressions**: talk, smile and raise your brows with keys on. Your expression carries through
|
|
160
|
+
the shape. `expression` 0 freezes it; 2 exaggerates it.
|
|
161
|
+
5. **Lens Studio head**: the cheeks puff and the forehead swells into the hair, with no double chin
|
|
162
|
+
or seam.
|
|
163
|
+
6. **Head turn**: turn and tilt. The warp stays on the face and the skirt follows.
|
|
164
|
+
7. **Animate**: the warp breathes in and out smoothly.
|
|
165
|
+
8. **Dropout**: cover the camera. The warp holds briefly, hides when the face is lost, and comes
|
|
166
|
+
back.
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Faceless (experimental)"
|
|
3
|
+
description: "Erase the eyes, brows, nose and mouth with the person's own skin, or even the whole face into a mannequin. Every tracked face, with makeup, glasses and liquify on top."
|
|
4
|
+
sidebarTitle: "Faceless"
|
|
5
|
+
icon: "face-meh-blank"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
`Faceless` erases a face's features with the person's own skin. The face keeps its real light, colour
|
|
9
|
+
and outline; only the eyes, brows, nose and mouth are gone.
|
|
10
|
+
|
|
11
|
+
- **Two looks.** `"real"` erases the features and keeps the rest of the face as the camera sees it,
|
|
12
|
+
with grain matched to the skin's own texture. `"smooth"` evens the whole face into a mannequin.
|
|
13
|
+
- **Blinks and an open mouth never show.** The erase covers the eye and mouth openings too.
|
|
14
|
+
- **It is the face.** It draws in the face layer, so makeup, designs, glasses and hats draw over it,
|
|
15
|
+
and `FaceLiquify` warps it.
|
|
16
|
+
|
|
17
|
+
Experimental: its props and look may change in a later alpha. Import from
|
|
18
|
+
`@vincentt-xr/sdk/face-effects`.
|
|
19
|
+
|
|
20
|
+
## Quick start
|
|
21
|
+
|
|
22
|
+
```tsx
|
|
23
|
+
import { VideoBackground, XRScene } from "@vincentt-xr/sdk";
|
|
24
|
+
import { Faceless } from "@vincentt-xr/sdk/face-effects";
|
|
25
|
+
|
|
26
|
+
<XRScene>
|
|
27
|
+
<VideoBackground />
|
|
28
|
+
<Faceless />
|
|
29
|
+
</XRScene>;
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
It starts the face model itself; no `FaceTracker` is needed.
|
|
33
|
+
|
|
34
|
+
## Looks, amount and grain
|
|
35
|
+
|
|
36
|
+
```tsx
|
|
37
|
+
<Faceless style="smooth" />;
|
|
38
|
+
<Faceless amount={0.5} />;
|
|
39
|
+
<Faceless grain={0} />;
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
- **`style`**: `"real"` (default) or `"smooth"`.
|
|
43
|
+
- **`amount`**: 0 is the real face, 1 is faceless. Pass a ref (`{ current: n }`) to fade it every
|
|
44
|
+
frame without re-rendering.
|
|
45
|
+
- **`grain`**: 0..1, `"real"` only. 1 (default) matches the fine detail measured on the person's own
|
|
46
|
+
cheeks, forehead and chin; 0 leaves the erased skin smooth. There is no grain in the eye and mouth
|
|
47
|
+
openings or on the lips, which stretch on screen when they open.
|
|
48
|
+
|
|
49
|
+
## Faces
|
|
50
|
+
|
|
51
|
+
- **Every tracked face** goes faceless, up to four. `faceIndex` picks one; `numFaces` sets how many
|
|
52
|
+
faces the face model tracks.
|
|
53
|
+
- Inside a `FaceTracker`, it follows that tracker's face.
|
|
54
|
+
- A face fades in with its first result and out shortly after it is lost.
|
|
55
|
+
|
|
56
|
+
## Hands in front (experimental)
|
|
57
|
+
|
|
58
|
+
With `HandCutout` in the scene, a hand over the face stays in front of the faceless face.
|
|
59
|
+
|
|
60
|
+
```tsx
|
|
61
|
+
import { HandCutout, HandTracker } from "@vincentt-xr/sdk/tracking";
|
|
62
|
+
|
|
63
|
+
<>
|
|
64
|
+
<HandTracker>
|
|
65
|
+
<HandCutout />
|
|
66
|
+
</HandTracker>
|
|
67
|
+
<Faceless />
|
|
68
|
+
</>;
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Props
|
|
72
|
+
|
|
73
|
+
| Prop | Default | Meaning |
|
|
74
|
+
| ------------- | ------------------ | ------------------------------------------------------------------------------ |
|
|
75
|
+
| `style` | `"real"` | `"real"`: features erased with the own skin; `"smooth"`: the whole face evened |
|
|
76
|
+
| `amount` | 1 | 0 the real face … 1 faceless, or a ref read every frame |
|
|
77
|
+
| `grain` | 1 | Grain on the erased skin, 0..1 (`"real"` only) |
|
|
78
|
+
| `faceIndex` | every tracked face | Only this face (default: the enclosing `FaceTracker`'s face, else every face) |
|
|
79
|
+
| `numFaces` | 1 | Faces the face model tracks when this starts it |
|
|
80
|
+
| `smoothing` | the live face's | Landmark smoothing 0..1 |
|
|
81
|
+
| `quality` | `"auto"` | Mesh level and statistics rate, as face swap's |
|
|
82
|
+
| `active` | true | False: nothing drawn |
|
|
83
|
+
| `renderOrder` | −2 | The face layer |
|
|
84
|
+
|
|
85
|
+
## Your own layer
|
|
86
|
+
|
|
87
|
+
`useFacelessTexture(faceIndex, options)` returns the faceless face texture for your own
|
|
88
|
+
`FaceTextureLayer`, for example to fade it with your own logic or draw it on another face:
|
|
89
|
+
|
|
90
|
+
```tsx
|
|
91
|
+
import { FaceTextureLayer, useFacelessTexture } from "@vincentt-xr/sdk/face-effects";
|
|
92
|
+
|
|
93
|
+
const Blank = () => {
|
|
94
|
+
const face = useFacelessTexture(0, { style: "smooth" });
|
|
95
|
+
return (
|
|
96
|
+
<FaceTextureLayer
|
|
97
|
+
face={face}
|
|
98
|
+
faceIndex={0}
|
|
99
|
+
preset="raw"
|
|
100
|
+
ownEyes={false}
|
|
101
|
+
ownMouth={false}
|
|
102
|
+
unseen="cover"
|
|
103
|
+
/>
|
|
104
|
+
);
|
|
105
|
+
};
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
- `ownEyes` and `ownMouth` off draw the erased eye and mouth openings.
|
|
109
|
+
- `unseen="cover"` also covers the parts the camera sees edge-on (nostril undersides, the lips'
|
|
110
|
+
seam); with the default `"fade"` the camera shows through there.
|
|
111
|
+
|
|
112
|
+
Lower level: `FacelessTexture` is the composite pass (`update(renderer, liveFace, { style, grain })`,
|
|
113
|
+
`dispose()`), with its masks from `createFacelessMask` and `createFacelessStretchMask` and its shader
|
|
114
|
+
`FACELESS_FRAGMENT`.
|
|
115
|
+
|
|
116
|
+
## Limits
|
|
117
|
+
|
|
118
|
+
- **Beards and stubble** under the erased mouth are replaced by smooth skin; the stubble around it
|
|
119
|
+
stays.
|
|
120
|
+
- **Real glasses** are part of the camera image: the lenses are erased with the eyes, the frames
|
|
121
|
+
outside the eye area stay. Draw 3D glasses over the faceless face instead.
|
|
122
|
+
- **Cost.** One composite per face per new face result, at the live face texture's size. Check phone
|
|
123
|
+
performance before shipping a multi-face effect.
|
|
124
|
+
|
|
125
|
+
## Example
|
|
126
|
+
|
|
127
|
+
`/face-reprojection` in the SDK playground, mode "faceless", has both looks, the amount and grain
|
|
128
|
+
sliders, hands in front and the face count. Settings are in the URL: `?mode=faceless`,
|
|
129
|
+
`?fstyle=smooth`, `?famount=0.5`, `?grain=0`. The two-people clip shows two faces.
|
|
130
|
+
|
|
131
|
+
## Manual visual test plan
|
|
132
|
+
|
|
133
|
+
Open `/face-reprojection?mode=faceless` on the webcam.
|
|
134
|
+
|
|
135
|
+
1. **Real**: eyes, brows, nose and mouth are gone. No brow line, lash line, lip line or nostril
|
|
136
|
+
remains; the erased skin has the face's own colour, light and fine texture.
|
|
137
|
+
2. **Smooth**: the whole face is even skin, with no feature or line showing through.
|
|
138
|
+
3. **Blink and open the mouth wide**: nothing shows, and no streaks appear.
|
|
139
|
+
4. **Turn the head** far left and right, and tilt: the erase stays on the features with no edge
|
|
140
|
+
sliding off the face.
|
|
141
|
+
5. **Amount**: 0 is the real face, 0.5 a half fade, 1 faceless.
|
|
142
|
+
6. **Hands**: with hands in front, a hand over the mouth stays in front of the face.
|
|
143
|
+
7. **Two faces**: on the two-people clip, both faces are faceless.
|