@vincentt-xr/sdk 2.0.0-alpha.8 → 2.0.0-alpha.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/GROUNDING.md +4643 -170
- package/README.md +1 -0
- package/dist/CanonicalHeadFrame-BHcWyaiK.js +1506 -0
- package/dist/CanonicalHeadFrame-D-_T1OMU.cjs +1 -0
- package/dist/DebuggerUI-7ngnJsBe.js +275 -0
- package/dist/DebuggerUI-CoglgKdO.cjs +1 -0
- package/dist/FaceRetouch-CLoTfrcs.js +1071 -0
- package/dist/FaceRetouch-J1lC1WbS.cjs +134 -0
- package/dist/FaceSurface-CHAMEeG1.cjs +1 -0
- package/dist/FaceSurface-DmP9AEeC.js +27 -0
- package/dist/SegmentationOverlay-D_FWkcyP.cjs +35 -0
- package/dist/SegmentationOverlay-vn5x_knv.js +6237 -0
- package/dist/SkeletonUtils-C2r90MtN.js +21 -0
- package/dist/SkeletonUtils-CddIup1F.cjs +1 -0
- package/dist/TextLabel-XE0rQSDn.cjs +2 -0
- package/dist/TextLabel-c9BCucOI.js +961 -0
- package/dist/assets/gltfLoader.d.ts +16 -0
- package/dist/assets/loaders.d.ts +16 -1
- package/dist/body-pose/index.d.ts +521 -0
- package/dist/body-trigger/__fixtures__/syntheticBody.d.ts +83 -0
- package/dist/body-trigger/frame.d.ts +88 -0
- package/dist/body-trigger/index.d.ts +6 -0
- package/dist/body-trigger/moves.d.ts +235 -0
- package/dist/body-trigger/trigger.d.ts +75 -0
- package/dist/calibration/calibration.d.ts +11 -6
- package/dist/canonicalFace-BHwyCx1c.js +9 -0
- package/dist/canonicalFace-C83I225R.cjs +1 -0
- package/dist/components/BodyInstruction/BodyPoseHint.d.ts +63 -0
- package/dist/components/BodyInstruction/index.d.ts +69 -0
- package/dist/components/BodyInstruction/useBodyPose.d.ts +23 -0
- package/dist/components/BodyTracker/index.d.ts +10 -2
- package/dist/components/BodyTrigger/index.d.ts +49 -0
- package/dist/components/Debugger/DebuggerProvider.d.ts +14 -1
- package/dist/components/Debugger/DebuggerUI.d.ts +3 -1
- package/dist/components/FaceAtlas/FaceAtlasLayer.d.ts +114 -0
- package/dist/components/FaceAtlas/MadeUpCamera.d.ts +80 -0
- package/dist/components/FaceAtlas/constants.d.ts +8 -0
- package/dist/components/FaceAtlas/index.d.ts +7 -0
- package/dist/components/FaceAtlas/useFaceAtlasSurface.d.ts +84 -0
- package/dist/components/FaceAtlas/useFaceSkin.d.ts +84 -0
- package/dist/components/FaceCharacter/ExternalFaceMesh.d.ts +109 -0
- package/dist/components/FaceCharacter/FaceExpressionController.d.ts +53 -0
- package/dist/components/FaceCharacter/FaceMorph.d.ts +71 -0
- package/dist/components/FaceCharacter/FacePiercing.d.ts +65 -0
- package/dist/components/FaceCharacter/FaceReprojection.d.ts +85 -0
- package/dist/components/FaceCharacter/FaceRig.d.ts +38 -0
- package/dist/components/FaceCharacter/FaceSurface.d.ts +49 -0
- package/dist/components/FaceCharacter/FaceSurfaceOccluder.d.ts +39 -0
- package/dist/components/FaceCharacter/PinToFaceMesh.d.ts +68 -0
- package/dist/components/FaceCharacter/index.d.ts +18 -0
- package/dist/components/FaceCharacter/useFaceReprojector.d.ts +10 -0
- package/dist/components/FaceInset/FaceInset.d.ts +68 -0
- package/dist/components/FaceInset/frame.d.ts +94 -0
- package/dist/components/FaceInset/index.d.ts +6 -0
- package/dist/components/FaceInset/material.d.ts +40 -0
- package/dist/components/FaceInset/useFaceInsetTexture.d.ts +37 -0
- package/dist/components/FaceInstruction/FaceExpressionHint.d.ts +43 -0
- package/dist/components/FaceInstruction/index.d.ts +56 -0
- package/dist/components/FaceInstruction/useFaceExpression.d.ts +20 -0
- package/dist/components/FaceLiquify/FaceLiquify.d.ts +49 -0
- package/dist/components/FaceLiquify/debug.d.ts +37 -0
- package/dist/components/FaceLiquify/frame.d.ts +55 -0
- package/dist/components/FaceLiquify/index.d.ts +10 -0
- package/dist/components/FaceLiquify/material.d.ts +39 -0
- package/dist/components/FaceLiquify/pass.d.ts +49 -0
- package/dist/components/FaceLiquify/presence.d.ts +25 -0
- package/dist/components/FaceLiquify/presets.d.ts +82 -0
- package/dist/components/FaceLiquify/selfTest.d.ts +66 -0
- package/dist/components/FaceLiquify/target.d.ts +85 -0
- package/dist/components/FaceLiquify/warp.d.ts +72 -0
- package/dist/components/FaceMesh/canonical/CanonicalFaceMeshRenderer.d.ts +5 -3
- package/dist/components/FaceMesh/canonical/geometryGroups.d.ts +21 -0
- package/dist/components/FaceMesh/canonical/parseCanonicalFaceModel.d.ts +9 -0
- package/dist/components/FaceMesh/index.d.ts +1 -1
- package/dist/components/FaceRetouch/Background.d.ts +3 -1
- package/dist/components/FaceRetouch/FaceRetouch.d.ts +5 -0
- package/dist/components/FaceRetouch/renderState.d.ts +19 -0
- package/dist/components/FaceSwap/FaceMirror.d.ts +46 -0
- package/dist/components/FaceSwap/FaceSwap.d.ts +58 -0
- package/dist/components/FaceSwap/FaceTextureLayer.d.ts +72 -0
- package/dist/components/FaceSwap/faceSwapPlan.d.ts +91 -0
- package/dist/components/FaceSwap/index.d.ts +13 -0
- package/dist/components/FaceSwap/settings.d.ts +300 -0
- package/dist/components/FaceSwap/useFaceTexture.d.ts +35 -0
- package/dist/components/FaceSwap/useLiveFace.d.ts +38 -0
- package/dist/components/FaceSwap/useLiveFaceTexture.d.ts +31 -0
- package/dist/components/FaceWarp3D/FaceWarp3D.d.ts +50 -0
- package/dist/components/FaceWarp3D/index.d.ts +2 -3
- package/dist/components/Faceless/Faceless.d.ts +51 -0
- package/dist/components/Faceless/index.d.ts +2 -0
- package/dist/components/HairLock/HairLock.d.ts +39 -0
- package/dist/components/HairLock/index.d.ts +2 -0
- package/dist/components/HairLock/lockGeometry.d.ts +15 -0
- package/dist/components/HandCutout/index.d.ts +35 -0
- package/dist/components/HandInstruction/HandGestureHint.d.ts +70 -0
- package/dist/components/HandInstruction/index.d.ts +74 -0
- package/dist/components/HandInstruction/useHandGesture.d.ts +22 -0
- package/dist/components/HandRig/ForearmOccluder.d.ts +29 -0
- package/dist/components/HandRig/HandAttachment.d.ts +34 -0
- package/dist/components/HandRig/HandOccluder.d.ts +55 -0
- package/dist/components/HandRig/HandTattoo.d.ts +61 -0
- package/dist/components/HandRig/WristAttachment.d.ts +34 -0
- package/dist/components/HandRig/index.d.ts +101 -0
- package/dist/components/HandRig/useArmMask.d.ts +29 -0
- package/dist/components/HandRig/wristSolve.d.ts +69 -0
- package/dist/components/HandTouch/HandTouch.d.ts +62 -0
- package/dist/components/HandTouch/Touchable.d.ts +36 -0
- package/dist/components/HandTouch/index.d.ts +2 -0
- package/dist/components/HeadBinding/index.d.ts +14 -0
- package/dist/components/HeadOccluder/CanonicalHeadFrame.d.ts +22 -0
- package/dist/components/HeadOccluder/Earrings.d.ts +55 -0
- package/dist/components/HeadOccluder/HeadAttachment.d.ts +38 -0
- package/dist/components/HeadOccluder/NeckOccluder.d.ts +64 -0
- package/dist/components/HeadOccluder/earringPlacement.d.ts +31 -0
- package/dist/components/HeadOccluder/headAttachmentPoints.d.ts +69 -0
- package/dist/components/HeadOccluder/index.d.ts +57 -3
- package/dist/components/HeadOccluder/useCanonicalHeadFit.d.ts +36 -0
- package/dist/components/HeadOccluder/useLandmarkPoseFit.d.ts +80 -0
- package/dist/components/Instruction/HintStage.d.ts +29 -0
- package/dist/components/Instruction/InstructionCue.d.ts +126 -0
- package/dist/components/Instruction/gestureHold.d.ts +20 -0
- package/dist/components/Instruction/ghost.d.ts +129 -0
- package/dist/components/Instruction/hintBlend.d.ts +19 -0
- package/dist/components/Instruction/hintLook.d.ts +81 -0
- package/dist/components/Instruction/hintLoop.d.ts +36 -0
- package/dist/components/Instruction/index.d.ts +41 -0
- package/dist/components/Instruction/useGhostModel.d.ts +33 -0
- package/dist/components/Instruction/useInstructionHold.d.ts +72 -0
- package/dist/components/LipEffect/LipEffect.d.ts +22 -2
- package/dist/components/LipEffect/LipEffectMaterial.d.ts +62 -10
- package/dist/components/LipEffect/LipEffects.d.ts +5 -2
- package/dist/components/LipEffect/defaults.d.ts +21 -2
- package/dist/components/LipEffect/index.d.ts +1 -1
- package/dist/components/LipEffect/lipShading.d.ts +73 -0
- package/dist/components/LipEffect/settings.d.ts +117 -13
- package/dist/components/LipEffect/shader.d.ts +39 -0
- package/dist/components/LipEffect/types.d.ts +82 -10
- package/dist/components/LipEffect/useLipDesignTextures.d.ts +6 -0
- package/dist/components/LipEffect/uvGuide.d.ts +31 -16
- package/dist/components/Makeup/Blush.d.ts +18 -0
- package/dist/components/Makeup/Brows.d.ts +20 -0
- package/dist/components/Makeup/Contour.d.ts +17 -0
- package/dist/components/Makeup/Eyeliner.d.ts +20 -0
- package/dist/components/Makeup/Eyeshadow.d.ts +20 -0
- package/dist/components/Makeup/Highlighter.d.ts +18 -0
- package/dist/components/Makeup/MakeupDesign.d.ts +37 -0
- package/dist/components/Makeup/MakeupRegion.d.ts +132 -0
- package/dist/components/Makeup/constants.d.ts +44 -0
- package/dist/components/Makeup/design.d.ts +106 -0
- package/dist/components/Makeup/designSamples.d.ts +42 -0
- package/dist/components/Makeup/eyes.d.ts +114 -0
- package/dist/components/Makeup/fields.d.ts +10 -0
- package/dist/components/Makeup/geometry.d.ts +106 -0
- package/dist/components/Makeup/index.d.ts +26 -0
- package/dist/components/Makeup/looks.d.ts +28 -0
- package/dist/components/Makeup/material.d.ts +239 -0
- package/dist/components/Makeup/settings.d.ts +54 -0
- package/dist/components/Makeup/shades.d.ts +143 -0
- package/dist/components/Makeup/shapes.d.ts +27 -0
- package/dist/components/Makeup/skinTone.d.ts +135 -0
- package/dist/components/Makeup/types.d.ts +110 -0
- package/dist/components/Makeup/useMakeupSkinTone.d.ts +40 -0
- package/dist/components/Necklace/Necklace.d.ts +44 -0
- package/dist/components/Necklace/index.d.ts +1 -0
- package/dist/components/ParticleEmitter/ParticleEmitter.d.ts +69 -0
- package/dist/components/ParticleEmitter/index.d.ts +1 -0
- package/dist/components/ShoulderOccluder/index.d.ts +43 -0
- package/dist/components/ShoulderOccluder/useCanonicalTorsoFit.d.ts +24 -0
- package/dist/components/SpringSwing/SpringSwing.d.ts +22 -0
- package/dist/components/SpringSwing/index.d.ts +1 -0
- package/dist/components/XRScene/renderOutputTarget.d.ts +12 -0
- package/dist/components/index.d.ts +8 -0
- package/dist/config/index.d.ts +0 -1
- package/dist/context-DTxSQvp4.js +13 -0
- package/dist/context-hA0Rb2Xa.cjs +1 -0
- package/dist/contexts-BH7PdKFS.cjs +1 -0
- package/dist/contexts-jak8-tND.js +667 -0
- package/dist/coordinates/index.d.ts +2 -0
- package/dist/coordinates/side.d.ts +40 -0
- package/dist/debug-ui/default-setting.cjs +2 -2
- package/dist/debug-ui/face-swap-settings/index.d.ts +22 -0
- package/dist/debug-ui/hierarchy-panel/index.d.ts +3 -2
- package/dist/debug-ui/index.d.ts +4 -3
- package/dist/debug-ui/media-source/index.d.ts +1 -1
- package/dist/debug-ui/media-source/session.d.ts +30 -2
- package/dist/debug-ui/media-source.cjs +1 -1
- package/dist/debug-ui/media-source.js +1 -1
- package/dist/debug-ui/object-inspector-panel/index.d.ts +3 -2
- package/dist/debug-ui/product-hotspots/index.d.ts +3 -2
- package/dist/debug-ui/scene-editor/hierarchy-panel.d.ts +3 -1
- package/dist/debug-ui/scene-editor/inspector-panel.d.ts +3 -1
- package/dist/debug-ui/screen-image-settings/index.d.ts +3 -1
- package/dist/debug-ui/screen-text-settings/ScreenTextSettingsPanel.d.ts +1 -1
- package/dist/debug-ui/screen-text-settings/types.d.ts +2 -0
- package/dist/debug-ui/settings-panel/index.d.ts +6 -1
- package/dist/debug-ui/shared/debugWindow.d.ts +51 -0
- package/dist/debug-ui/xr-diagnostics/index.d.ts +3 -2
- package/dist/debug-ui.cjs +3 -3
- package/dist/debug-ui.js +2250 -2472
- package/dist/entries/all.d.ts +3 -1
- package/dist/entries/core.d.ts +3 -2
- package/dist/entries/face-effects.d.ts +114 -8
- package/dist/entries/instructions.d.ts +48 -0
- package/dist/entries/internal.d.ts +2 -1
- package/dist/entries/low-level.d.ts +28 -1
- package/dist/entries/particles.d.ts +11 -0
- package/dist/entries/tracking.d.ts +37 -2
- package/dist/face-atlas/attributes.d.ts +30 -0
- package/dist/face-atlas/eyes.d.ts +272 -0
- package/dist/face-atlas/faceAtlas.generated.d.ts +46 -0
- package/dist/face-atlas/glsl/atlasVertex.d.ts +46 -0
- package/dist/face-atlas/glsl/common.d.ts +55 -0
- package/dist/face-atlas/glsl/design.d.ts +49 -0
- package/dist/face-atlas/glsl/eyes.d.ts +73 -0
- package/dist/face-atlas/glsl/finish.d.ts +24 -0
- package/dist/face-atlas/glsl/format.d.ts +4 -0
- package/dist/face-atlas/glsl/index.d.ts +59 -0
- package/dist/face-atlas/glsl/shading.d.ts +15 -0
- package/dist/face-atlas/glsl/shapes.d.ts +66 -0
- package/dist/face-atlas/glsl/sparkle.d.ts +19 -0
- package/dist/face-atlas/glsl/uniforms.d.ts +106 -0
- package/dist/face-atlas/guide.d.ts +51 -0
- package/dist/face-atlas/index.d.ts +25 -0
- package/dist/face-atlas/lead.d.ts +117 -0
- package/dist/face-atlas/madeUpCamera.d.ts +125 -0
- package/dist/face-atlas/masks.d.ts +53 -0
- package/dist/face-atlas/obj.d.ts +69 -0
- package/dist/face-atlas/polylines.d.ts +63 -0
- package/dist/face-atlas/probe/FaceSkinProbe.d.ts +208 -0
- package/dist/face-atlas/probe/__fixtures__/emulate.d.ts +9 -0
- package/dist/face-atlas/probe/__fixtures__/face.d.ts +24 -0
- package/dist/face-atlas/probe/constants.d.ts +137 -0
- package/dist/face-atlas/probe/glsl.d.ts +43 -0
- package/dist/face-atlas/probe/lightFit.d.ts +108 -0
- package/dist/face-atlas/probe/schedule.d.ts +44 -0
- package/dist/face-atlas/probe/selfTest.d.ts +87 -0
- package/dist/face-atlas/probe/stats.d.ts +143 -0
- package/dist/face-atlas/probe/targets.d.ts +70 -0
- package/dist/face-atlas/probe/unwrap.d.ts +76 -0
- package/dist/face-atlas/quality.d.ts +28 -0
- package/dist/face-atlas/regions.d.ts +31 -0
- package/dist/face-atlas/registry.d.ts +252 -0
- package/dist/face-atlas/renderState.d.ts +86 -0
- package/dist/face-atlas/selfOcclusion.d.ts +62 -0
- package/dist/face-atlas/shading.d.ts +406 -0
- package/dist/face-atlas/shapes.d.ts +86 -0
- package/dist/face-atlas/sides.d.ts +41 -0
- package/dist/face-atlas/skinMask.d.ts +35 -0
- package/dist/face-atlas/surface.d.ts +155 -0
- package/dist/face-atlas/topology.d.ts +44 -0
- package/dist/face-character/__fixtures__/faceImageDetections.d.ts +25 -0
- package/dist/face-character/__fixtures__/faceNode.d.ts +22 -0
- package/dist/face-character/bindFaceModel.d.ts +106 -0
- package/dist/face-character/canonicalFace.d.ts +17 -0
- package/dist/face-character/canonicalFaceGeometry.d.ts +11 -0
- package/dist/face-character/canonicalFacePositions.d.ts +7 -0
- package/dist/face-character/driveFaceModel.d.ts +57 -0
- package/dist/face-character/expressionOutputs.d.ts +45 -0
- package/dist/face-character/faceExpressions.d.ts +104 -0
- package/dist/face-character/faceImageLandmarker.d.ts +93 -0
- package/dist/face-character/faceMeshBinding.d.ts +62 -0
- package/dist/face-character/faceMorph.d.ts +77 -0
- package/dist/face-character/faceMorphs.d.ts +46 -0
- package/dist/face-character/facePhoto.d.ts +138 -0
- package/dist/face-character/facePiercings.d.ts +116 -0
- package/dist/face-character/facePin.d.ts +131 -0
- package/dist/face-character/faceReprojection.d.ts +273 -0
- package/dist/face-character/faceReprojector.d.ts +171 -0
- package/dist/face-character/faceRig.d.ts +176 -0
- package/dist/face-character/faceSwapPresence.d.ts +85 -0
- package/dist/face-character/faceTexture.d.ts +169 -0
- package/dist/face-character/faceTextureBaker.d.ts +86 -0
- package/dist/face-character/faceTextureGuide.d.ts +106 -0
- package/dist/face-character/faceTextureStats.d.ts +298 -0
- package/dist/face-character/faceTransfer.d.ts +396 -0
- package/dist/face-character/faceTransferGeometry.d.ts +109 -0
- package/dist/face-character/faceTransferSelfTest.d.ts +94 -0
- package/dist/face-character/faceWarp3D.d.ts +101 -0
- package/dist/face-character/faceless.d.ts +79 -0
- package/dist/face-character/featureWarp.d.ts +28 -0
- package/dist/face-character/liveFaceRegistry.d.ts +370 -0
- package/dist/face-character/liveValue.d.ts +12 -0
- package/dist/face-character/memo.d.ts +15 -0
- package/dist/face-effects.cjs +2252 -83
- package/dist/face-effects.js +14234 -1231
- package/dist/face-expression/index.d.ts +182 -0
- package/dist/face-info/landmarks.d.ts +17 -3
- package/dist/face-info/types.d.ts +20 -3
- package/dist/gestures/definitions.d.ts +15 -2
- package/dist/gestures/index.d.ts +1 -1
- package/dist/gestures/measures.d.ts +21 -8
- package/dist/getFaceInfo-B1otSDMX.cjs +1 -0
- package/dist/getFaceInfo-Cu4xDWiL.js +62 -0
- package/dist/hand/armFit.d.ts +46 -0
- package/dist/hand/armMask.d.ts +178 -0
- package/dist/hand/handCutout.d.ts +23 -0
- package/dist/hand/handCutoutRegistry.d.ts +7 -0
- package/dist/hand/handGestures.d.ts +524 -0
- package/dist/hand/handPose.d.ts +98 -0
- package/dist/hand/handRigSolver.d.ts +159 -0
- package/dist/hand/handTattoo.d.ts +81 -0
- package/dist/hand/handTouch.d.ts +240 -0
- package/dist/hand/wrist.d.ts +44 -0
- package/dist/hand/wristFilter.d.ts +44 -0
- package/dist/hooks/selectors.d.ts +8 -0
- package/dist/hooks/useFaceModelAcquisition.d.ts +38 -0
- package/dist/hooks/useTrackerContext.d.ts +6 -0
- package/dist/index-B1_TzJaI.js +1104 -0
- package/dist/index-BavF06C6.js +190 -0
- package/dist/index-BfFmpddl.cjs +21 -0
- package/dist/index-BuBzneeW.cjs +46 -0
- package/dist/index-CGsQWodV.cjs +1 -0
- package/dist/index-CIe7eCMH.js +3200 -0
- package/dist/index-CfSF8LXa.cjs +1 -0
- package/dist/index-D5GTzOzD.cjs +1 -0
- package/dist/index-DBhQzvVa.js +314 -0
- package/dist/index-DE17y0ZI.cjs +1 -0
- package/dist/index-JII7huPk.js +442 -0
- package/dist/index-tpCr9CLj.cjs +1 -0
- package/dist/{renderPasses-NnKZVfBy.js → index-w1S7fI2B.js} +219 -247
- package/dist/index-zGaqrz_K.js +188 -0
- package/dist/instructions.cjs +30 -0
- package/dist/instructions.js +1507 -0
- package/dist/{internal-vsfNQycj.js → internal-B90P-clC.js} +138 -118
- package/dist/internal-Cjinca64.cjs +1 -0
- package/dist/internal.cjs +1 -1
- package/dist/internal.js +15 -10
- package/dist/iris/compute.d.ts +7 -5
- package/dist/iris/types.d.ts +6 -4
- package/dist/{landmarkMask-CbTFzBYG.js → landmarkMask-BFDyBnKM.js} +6 -6
- package/dist/landmarks-BlUqf5MZ.cjs +1 -0
- package/dist/landmarks-bftdwq6Z.js +76 -0
- package/dist/loaders-BGAUACsd.js +363 -0
- package/dist/loaders-BJ1_QCHt.cjs +1 -0
- package/dist/low-level.cjs +1 -1
- package/dist/low-level.js +666 -602
- package/dist/main.cjs +1 -1
- package/dist/main.js +866 -1182
- package/dist/models/Body/index.d.ts +2 -0
- package/dist/models/Face/constants.d.ts +8 -0
- package/dist/models/Face/index.d.ts +3 -11
- package/dist/models/Face/rotation.d.ts +18 -3
- package/dist/models/Hand/HandTracking.d.ts +17 -1
- package/dist/models/Segmentation/index.d.ts +2 -0
- package/dist/models/nodeSource.d.ts +9 -0
- package/dist/particles/emission.d.ts +24 -0
- package/dist/particles/eyes.d.ts +24 -0
- package/dist/particles/glsl.d.ts +14 -0
- package/dist/particles/index.d.ts +10 -0
- package/dist/particles/motion.d.ts +42 -0
- package/dist/particles/presets.d.ts +12 -0
- package/dist/particles/ring.d.ts +58 -0
- package/dist/particles/selfTest.d.ts +53 -0
- package/dist/particles/settings.d.ts +127 -0
- package/dist/particles/shapes.d.ts +29 -0
- package/dist/particles/spawner.d.ts +60 -0
- package/dist/particles/system.d.ts +64 -0
- package/dist/particles.cjs +122 -0
- package/dist/particles.js +774 -0
- package/dist/product.cjs +1 -1
- package/dist/product.js +29 -29
- package/dist/{providers-C0Dlhh9Z.js → providers-C8rE26Uf.js} +127 -126
- package/dist/providers-DHsrhDI2.cjs +62 -0
- package/dist/render/renderPasses.d.ts +8 -0
- package/dist/render/sceneBeforeRender.d.ts +12 -0
- package/dist/{renderGroups-CN1cGFUo.js → renderGroups-B38pUaX2.js} +1 -1
- package/dist/{renderGroups-O4KmaMl9.cjs → renderGroups-Cb_4Ar1Q.cjs} +1 -1
- package/dist/renderPasses-B6l8IpJv.js +1290 -0
- package/dist/renderPasses-dqmkft4P.cjs +158 -0
- package/dist/renderState-CJNmj5jz.js +39 -0
- package/dist/renderState-apSfg4eR.cjs +1 -0
- package/dist/scene-object.cjs +1 -1
- package/dist/scene-object.js +2 -2
- package/dist/segmentation-Cb3ouK6Z.js +1758 -0
- package/dist/segmentation-D9pYO6aR.cjs +1 -0
- package/dist/segmentation2d/types.d.ts +6 -0
- package/dist/select-Ck5LGz-J.cjs +1 -0
- package/dist/select-pYRo_win.js +233 -0
- package/dist/selectors-C4X71aoD.cjs +1 -0
- package/dist/selectors-DmNaKIwE.js +196 -0
- package/dist/session-BrH8G7iJ.cjs +31 -0
- package/dist/session-DgA_z6O1.js +418 -0
- package/dist/{settings-aQk845NJ.js → settings-BJ7FMBsO.js} +53 -15
- package/dist/settings-C63FMBlF.cjs +1 -0
- package/dist/similarityFit-BFqHND2e.cjs +1 -0
- package/dist/similarityFit-Bbz-R8AY.js +91 -0
- package/dist/spring/index.d.ts +2 -0
- package/dist/spring/spring.d.ts +69 -0
- package/dist/spring/swing.d.ts +54 -0
- package/dist/tracking.cjs +10 -1
- package/dist/tracking.js +1002 -855
- package/dist/trigger-D0Pm9noT.cjs +49 -0
- package/dist/trigger-IQeys0oS.js +2128 -0
- package/dist/types/face.d.ts +20 -1
- package/dist/types/hand-tracking.d.ts +9 -0
- package/dist/types/nodes.d.ts +20 -1
- package/dist/types/segmentation.d.ts +5 -0
- package/dist/updateThrottle-BseecYag.js +4 -0
- package/dist/updateThrottle-Of5Y4SVa.cjs +1 -0
- package/dist/useFaceInfo-BHDNCvsJ.cjs +1 -0
- package/dist/useFaceInfo-J4x7LsqL.js +76 -0
- package/dist/useFaceResultReader-BvEo5REG.js +61 -0
- package/dist/useFaceResultReader-DuaL1KJG.cjs +1 -0
- package/dist/useInstructionHold-DOu-RpCM.js +53 -0
- package/dist/useInstructionHold-DwJY1Alr.cjs +1 -0
- package/dist/useLandmarkPoseFit-Bg-h9BPb.cjs +1 -0
- package/dist/useLandmarkPoseFit-Bmb3h6Mw.js +87 -0
- package/dist/{useXRCapabilities-B1R2ghy-.cjs → useXRCapabilities-Cr3RzuAW.cjs} +1 -1
- package/dist/{useXRCapabilities-C68v__wB.js → useXRCapabilities-Cxmlmpbd.js} +1 -1
- package/dist/utils/canonicalRigidLandmarks.d.ts +8 -0
- package/dist/utils/headOccluderFit.d.ts +42 -0
- package/dist/utils/integrity.d.ts +17 -0
- package/dist/utils/resolveNumFaces.d.ts +13 -0
- package/dist/utils/shoulderOccluderFit.d.ts +38 -0
- package/dist/utils/similarityFit.d.ts +23 -0
- package/dist/uv-BMFt19bg.cjs +1 -0
- package/dist/{index-CsUdQ-pn.js → uv-DJU_XfmN.js} +15 -249
- package/docs/SDK_DOCUMENTATION.md +1 -2
- package/docs/api/adaptive-quality.mdx +1 -1
- package/docs/api/body-instructions.mdx +285 -0
- package/docs/api/body-triggers.mdx +234 -0
- package/docs/api/camera-permission.mdx +1 -1
- package/docs/api/coordinate-spaces.mdx +7 -4
- package/docs/api/cross-camera.mdx +3 -2
- package/docs/api/debug-ui-scene-editor.mdx +23 -2
- package/docs/api/external-face-mesh.mdx +231 -0
- package/docs/api/face-actions.mdx +20 -16
- package/docs/api/face-attribute-expression.mdx +1 -1
- package/docs/api/face-binding-anchors.mdx +4 -2
- package/docs/api/face-character.mdx +157 -0
- package/docs/api/face-effects.mdx +3 -0
- package/docs/api/face-expression-controller.mdx +153 -0
- package/docs/api/face-info.mdx +17 -11
- package/docs/api/face-inset.mdx +204 -0
- package/docs/api/face-instructions.mdx +183 -0
- package/docs/api/face-liquify.mdx +196 -0
- package/docs/api/face-mesh.mdx +4 -7
- package/docs/api/face-morph.mdx +117 -0
- package/docs/api/face-painting.mdx +7 -0
- package/docs/api/face-reprojection.mdx +154 -0
- package/docs/api/face-retouching.mdx +18 -10
- package/docs/api/face-swap.mdx +350 -0
- package/docs/api/face-warp-3d.mdx +166 -0
- package/docs/api/faceless.mdx +143 -0
- package/docs/api/gestures.mdx +68 -32
- package/docs/api/hair.mdx +97 -0
- package/docs/api/hand-instructions.mdx +222 -0
- package/docs/api/hand-rig.mdx +535 -0
- package/docs/api/hand-touch.mdx +162 -0
- package/docs/api/head-occluder.mdx +563 -0
- package/docs/api/holistic-tracker.mdx +6 -1
- package/docs/api/instructions.mdx +323 -0
- package/docs/api/iris-tracking.mdx +24 -19
- package/docs/api/made-up-camera.mdx +131 -0
- package/docs/api/makeup-skin-tone.mdx +135 -0
- package/docs/api/makeup.mdx +353 -0
- package/docs/api/multi-subject.mdx +4 -1
- package/docs/api/particles.mdx +155 -0
- package/docs/api/person-cutout.mdx +1 -1
- package/docs/api/pin-to-face-mesh.mdx +274 -0
- package/docs/api/product-ar.mdx +5 -2
- package/docs/api/segmentation-overlay.mdx +1 -1
- package/docs/docs.json +29 -1
- package/docs/examples/lip-shaders.mdx +82 -33
- package/docs/guides/face-atlas-template.svg +1 -0
- package/docs/guides/face-atlas-textures.mdx +186 -0
- package/docs/guides/face-texture-template.svg +1 -0
- package/docs/guides/harness-debug-ui.mdx +4 -4
- package/docs/guides/lip-effect-textures.mdx +178 -102
- package/docs/guides/lip-uv-template.png +0 -0
- package/docs/guides/lip-uv-template.svg +1 -1
- package/docs/guides/makeup-design-textures.mdx +109 -0
- package/docs/introduction.mdx +1 -2
- package/package.json +11 -1
- package/dist/DebuggerUI-C-ldiozL.js +0 -269
- package/dist/DebuggerUI-CWX5EtQv.cjs +0 -1
- package/dist/FaceMeshRenderer-BEEXZwS6.cjs +0 -158
- package/dist/FaceMeshRenderer-UuH5sTXG.js +0 -1322
- package/dist/FaceRetouch-C7h7x9kd.js +0 -683
- package/dist/FaceRetouch-DqftT26Y.cjs +0 -134
- package/dist/GLTFLoader-C5q63sKO.js +0 -1633
- package/dist/GLTFLoader-Cb_CRwmG.cjs +0 -1
- package/dist/SegmentationOverlay-DQuW3dsc.js +0 -133
- package/dist/SegmentationOverlay-aWVod8Kl.cjs +0 -1
- package/dist/components/FaceWarp3D/FaceWarp3DHead.d.ts +0 -15
- package/dist/components/FaceWarp3D/defaults.d.ts +0 -37
- package/dist/components/FaceWarp3D/warp.d.ts +0 -13
- package/dist/contexts-CO0sd4JQ.cjs +0 -1
- package/dist/contexts-FzlnnMYD.js +0 -669
- package/dist/debug-ui/face-warp-3d/index.d.ts +0 -6
- package/dist/getFaceInfo-BkZfaQs-.js +0 -118
- package/dist/getFaceInfo-ahPxQFGu.cjs +0 -1
- package/dist/index--RgGzZ6X.cjs +0 -47
- package/dist/index-CHVbH0hz.js +0 -214
- package/dist/index-CeVkgsag.cjs +0 -1
- package/dist/index-CnGox6Xr.js +0 -3054
- package/dist/index-DKBAh6hV.cjs +0 -1
- package/dist/index-DsZwTfG0.cjs +0 -1
- package/dist/index-Dw6tj2Mi.js +0 -144
- package/dist/index-OCPjOaeP.cjs +0 -1
- package/dist/index-s9pF4zkG.js +0 -2053
- package/dist/internal-BYza1h8_.cjs +0 -1
- package/dist/measures-9dQPdw96.js +0 -154
- package/dist/measures-KfJzpvod.cjs +0 -1
- package/dist/providers-YNwkmNeK.cjs +0 -62
- package/dist/renderPasses-Cg-zqmEz.cjs +0 -21
- package/dist/screenTransform-BenfCtZt.js +0 -44
- package/dist/screenTransform-BiXdpVf0.cjs +0 -1
- package/dist/segmentation-9PhSvc-R.cjs +0 -1
- package/dist/segmentation-CeOTKemr.js +0 -5
- package/dist/selectors-C5G1PMYL.js +0 -195
- package/dist/selectors-Du_PsVnW.cjs +0 -1
- package/dist/session-BBr0yN8h.cjs +0 -31
- package/dist/session-Cy0m7l7-.js +0 -363
- package/dist/settings-DRR7-snV.cjs +0 -1
- package/dist/useFaceInfo-Blf7FCu3.js +0 -303
- package/dist/useFaceInfo-C5mO8NQY.cjs +0 -1
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Face Character (end to end)"
|
|
3
|
+
description: "Every face-character piece together: a cute warp of your real face, a transform into a character, the character with your eyes and mouth, pins, a hat behind the head and hands in front."
|
|
4
|
+
sidebarTitle: "Face Character"
|
|
5
|
+
icon: "masks-theater"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
This page puts the face-character pipeline ([#194](https://github.com/vincentt-xr/sdk/issues/194),
|
|
9
|
+
#200) together in one lens, for up to two people at once. Each piece has its own page:
|
|
10
|
+
|
|
11
|
+
| Piece | What it does here |
|
|
12
|
+
| ------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
|
|
13
|
+
| [`FaceWarp3D`](/api/face-warp-3d) | "You": your real face made cute (a bigger-eyes shape key), photoreal |
|
|
14
|
+
| [`FaceMorph`](/api/face-morph) | "Transform": your face swells into the character, your eyes flowing into its eyes |
|
|
15
|
+
| [`ExternalFaceMesh`](/api/external-face-mesh) | "Character": the character head, following your head |
|
|
16
|
+
| [`FaceExpressionController`](/api/face-expression-controller) | Plays the character's shape keys from your expression, plus blush, sparkles and a wink counter |
|
|
17
|
+
| [`FaceReprojection`](/api/face-reprojection) | Your eyes and mouth on the character (`align` for its cartoon proportions) |
|
|
18
|
+
| [`PinToFaceMesh`](/api/pin-to-face-mesh) | A bow and a star that ride the warp, the morph and the character's skin |
|
|
19
|
+
| [`HeadAttachment`](/api/head-occluder) + occluder | A party hat whose back goes behind your head |
|
|
20
|
+
| `HandCutout` | Your hands stay in front of all of it |
|
|
21
|
+
|
|
22
|
+
## The structure
|
|
23
|
+
|
|
24
|
+
```tsx
|
|
25
|
+
import {
|
|
26
|
+
ExternalFaceMesh,
|
|
27
|
+
FaceExpressionController,
|
|
28
|
+
FaceMorph,
|
|
29
|
+
FaceReprojection,
|
|
30
|
+
FaceRig,
|
|
31
|
+
FaceWarp3D,
|
|
32
|
+
HeadAttachment,
|
|
33
|
+
HeadBinding,
|
|
34
|
+
PinToFaceMesh,
|
|
35
|
+
} from "@vincentt-xr/sdk/face-effects";
|
|
36
|
+
import { HandCutout, HandTracker } from "@vincentt-xr/sdk/tracking";
|
|
37
|
+
|
|
38
|
+
<HandTracker>
|
|
39
|
+
<HandCutout />
|
|
40
|
+
</HandTracker>;
|
|
41
|
+
|
|
42
|
+
{
|
|
43
|
+
[0, 1].map((faceIndex) => (
|
|
44
|
+
<HeadBinding key={faceIndex} faceIndex={faceIndex} numFaces={2} occluder={{ url: occluderUrl }}>
|
|
45
|
+
<FaceRig>
|
|
46
|
+
{phase === "you" && (
|
|
47
|
+
<FaceWarp3D deformation={cuteShapes} weights={{ cute: 0.7 }}>
|
|
48
|
+
<Pins /> {/* children ride the warp */}
|
|
49
|
+
</FaceWarp3D>
|
|
50
|
+
)}
|
|
51
|
+
{phase === "transform" && (
|
|
52
|
+
<FaceMorph shape={character} align={GHOST_ALIGN} weight={sweepRef} falloff={[4, 9]}>
|
|
53
|
+
<Pins /> {/* children ride the morph */}
|
|
54
|
+
</FaceMorph>
|
|
55
|
+
)}
|
|
56
|
+
{phase === "character" && (
|
|
57
|
+
<FaceExpressionController rules={ghostRules}>
|
|
58
|
+
<group ref={characterRef}>
|
|
59
|
+
<ExternalFaceMesh model={character} drive="none">
|
|
60
|
+
<FaceReprojection region="eyesAndMouth" align={GHOST_ALIGN} meshes={GHOST_WEARS} />
|
|
61
|
+
</ExternalFaceMesh>
|
|
62
|
+
</group>
|
|
63
|
+
<Pins onto={characterRef} /> {/* on the character's skin */}
|
|
64
|
+
</FaceExpressionController>
|
|
65
|
+
)}
|
|
66
|
+
</FaceRig>
|
|
67
|
+
<HeadAttachment point="crown" offset={{ position: [0, 0.6, 0.4] }}>
|
|
68
|
+
<PartyHat />
|
|
69
|
+
</HeadAttachment>
|
|
70
|
+
</HeadBinding>
|
|
71
|
+
));
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Stylised characters
|
|
76
|
+
|
|
77
|
+
The SDK ghost head (`face-v1.glb`) has cartoon proportions: big eyes 3 cm lower than a real face's.
|
|
78
|
+
Pass its own eye and mouth centres as `align` (`{ leftEye, rightEye, mouth }`). `FaceReprojection` and
|
|
79
|
+
`FaceMorph` then bind it as if those sat on your face, so your eyes land on its eyes.
|
|
80
|
+
|
|
81
|
+
Being rounder than a real face, it also needs a wider `FaceMorph` `falloff` (`[4, 9]`). Name the parts
|
|
82
|
+
that wear your face with `meshes`. Eye parts are found by mesh or material name (`eye…`, `iris…`).
|
|
83
|
+
|
|
84
|
+
### Expressions on a character's own shape keys
|
|
85
|
+
|
|
86
|
+
The ghost's shape keys (`smile`, `wink`, `surprised`, `kiss`, `puffCheeks`, `frown`, `scrunch`) are
|
|
87
|
+
played by `FaceExpressionController` rules from ARKit channels. That's why the `ExternalFaceMesh` uses
|
|
88
|
+
`drive="none"`.
|
|
89
|
+
|
|
90
|
+
The same controller also handles the extras:
|
|
91
|
+
|
|
92
|
+
- the blush's opacity follows your smile;
|
|
93
|
+
- sparkles show while your mouth is open;
|
|
94
|
+
- each wink triggers a counter.
|
|
95
|
+
|
|
96
|
+
### Draw order and the head occluder
|
|
97
|
+
|
|
98
|
+
The occluder is your real head, skull included. It must hide what is behind your head, like the
|
|
99
|
+
hat's back. It must never hide the face effects, including a character head smaller than your skull.
|
|
100
|
+
|
|
101
|
+
Everything that is the face draws first, at `FACE_SURFACE_RENDER_ORDER` (-2), before the occluder
|
|
102
|
+
(-1, on its meshes). Accessories come after (0). Set render orders on meshes, never on a `Group`:
|
|
103
|
+
three sorts by the nearest group first.
|
|
104
|
+
|
|
105
|
+
### Hands in front
|
|
106
|
+
|
|
107
|
+
`HandCutout` draws your hands' silhouettes as near-plane depth before everything else. A hand over your
|
|
108
|
+
face shows the real hand in front of the warp, the character, the pins and the hat.
|
|
109
|
+
|
|
110
|
+
## Example
|
|
111
|
+
|
|
112
|
+
`/face-character` has:
|
|
113
|
+
|
|
114
|
+
- **A Transform button.**
|
|
115
|
+
- **Controls:**
|
|
116
|
+
- the character (the ghost head, or facecap when the local file is present);
|
|
117
|
+
- "cute you";
|
|
118
|
+
- your eyes and mouth on the character;
|
|
119
|
+
- a toon material;
|
|
120
|
+
- the head occluder;
|
|
121
|
+
- hands in front;
|
|
122
|
+
- one or two people.
|
|
123
|
+
- **Badges** for each face's tracking and a wink count.
|
|
124
|
+
|
|
125
|
+
URL options:
|
|
126
|
+
|
|
127
|
+
- `?phase=character` starts as the character;
|
|
128
|
+
- `?hold=0.5` freezes the transform at that weight, for inspection;
|
|
129
|
+
- `?faces=1`, `?occluder=0`, `?hands=0`, `?wear=0` and `?toon=1` set the controls.
|
|
130
|
+
|
|
131
|
+
## Manual visual test plan
|
|
132
|
+
|
|
133
|
+
Open `/face-character` on the webcam.
|
|
134
|
+
|
|
135
|
+
1. **You**: your eyes are bigger and the face looks real. The bow sits on the side of your forehead
|
|
136
|
+
and the star on your cheek; both move with your face. The hat sits on your crown, and turning your
|
|
137
|
+
head hides its back behind your head.
|
|
138
|
+
2. **Transform**: your face swells into the ghost over about 1.5 s. Your eyes flow into its eyes, and
|
|
139
|
+
the bow and star ride along. "Back to you" reverses it.
|
|
140
|
+
3. **Character**:
|
|
141
|
+
- the whole round ghost is visible, with nothing cut away by the occluder;
|
|
142
|
+
- your eyes and mouth are on it;
|
|
143
|
+
- smile: it smiles and blushes;
|
|
144
|
+
- wink: the counter goes up;
|
|
145
|
+
- open your mouth: sparkles;
|
|
146
|
+
- puff your cheeks, kiss, frown and scrunch: it does too.
|
|
147
|
+
4. **Occluder**: toggle the head occluder. The face effects never change; only the hat's back hides
|
|
148
|
+
or shows.
|
|
149
|
+
5. **Hands**: put a hand over your face in every phase. The real hand stays in front of the warp, the
|
|
150
|
+
character, the pins and the hat. Turn the toggle off and they draw over your hand.
|
|
151
|
+
6. **Two people**: with two faces in view, each gets its own lens. The badges follow each face.
|
|
152
|
+
7. **Tracking loss**: cover your face. The lens holds briefly, then hides (the badge says "lost") and
|
|
153
|
+
comes back on reacquire.
|
|
154
|
+
8. **Mirror**: switch between the webcam and the sample media. Everything stays on the right side of
|
|
155
|
+
the face.
|
|
156
|
+
9. **facecap** (local): pick facecap. The transform and the character work on a realistic head, with
|
|
157
|
+
no `align` needed.
|
|
@@ -9,6 +9,9 @@ This section is split into focused pages:
|
|
|
9
9
|
|
|
10
10
|
- [Face Mesh](/api/face-mesh) for the base 3D face mesh, canonical renderer,
|
|
11
11
|
and face mesh material settings.
|
|
12
|
+
- [Head Occluder](/api/head-occluder) for `HeadBinding`, the canonical-fit
|
|
13
|
+
depth-only head mesh and `CanonicalHeadFrame`, so 3D accessories pass behind
|
|
14
|
+
the tracked head.
|
|
12
15
|
- [Face Painting](/api/face-painting) for the composite shader variant used to
|
|
13
16
|
paint onto the live face mesh.
|
|
14
17
|
- [Face Retouching](/api/face-retouching) for the legacy skin-retouch shader
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Face Expression Controller"
|
|
3
|
+
description: "Turn the tracked expression into behaviour with typed rules: morph targets, material values, visibility, transforms, triggers and your own setters."
|
|
4
|
+
sidebarTitle: "Face Expression Controller"
|
|
5
|
+
icon: "sliders"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
`FaceExpressionController` turns the tracked face's expression into behaviour. Each rule has three
|
|
9
|
+
parts:
|
|
10
|
+
|
|
11
|
+
- an **input**, such as a blendshape, a combination of them, a Face Action or your own function;
|
|
12
|
+
- its **shaping**: range, curve, multiplier, clamp and smoothing;
|
|
13
|
+
- its **outputs**: morph targets, material values, visibility, transforms, triggers or a setter.
|
|
14
|
+
|
|
15
|
+
It is part of the face-character pipeline ([#194](https://github.com/vincentt-xr/sdk/issues/194)):
|
|
16
|
+
#196 is the controller, and #197 is custom morph mapping. It runs on a
|
|
17
|
+
[`FaceRig`](/api/external-face-mesh#facerig).
|
|
18
|
+
|
|
19
|
+
Import from `@vincentt-xr/sdk/face-effects`.
|
|
20
|
+
|
|
21
|
+
## Quick start
|
|
22
|
+
|
|
23
|
+
```tsx
|
|
24
|
+
import { ExternalFaceMesh, FaceExpressionController, FaceRig } from "@vincentt-xr/sdk/face-effects";
|
|
25
|
+
import { FaceTracker } from "@vincentt-xr/sdk/tracking";
|
|
26
|
+
|
|
27
|
+
<FaceTracker>
|
|
28
|
+
<FaceRig>
|
|
29
|
+
<FaceExpressionController
|
|
30
|
+
rules={[
|
|
31
|
+
{ input: "jawOpen", morph: "jawOpen", multiplier: 1.4 },
|
|
32
|
+
{ input: { action: "mouthOpen" }, target: "bubble", visible: { above: 0.45 } },
|
|
33
|
+
{ input: { action: "eyeBlink" }, onStart: () => playBlinkSound() },
|
|
34
|
+
]}
|
|
35
|
+
>
|
|
36
|
+
<ExternalFaceMesh model={head.scene} drive="none" />
|
|
37
|
+
<group name="bubble">…</group>
|
|
38
|
+
</FaceExpressionController>
|
|
39
|
+
</FaceRig>
|
|
40
|
+
</FaceTracker>;
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
The outputs act on the controller's children, which sit in the canonical head frame (centimetres).
|
|
44
|
+
Inside a `FaceRig` the controller shares that rig; otherwise it runs its own, so mount it in a
|
|
45
|
+
`FaceTracker`.
|
|
46
|
+
|
|
47
|
+
## Inputs
|
|
48
|
+
|
|
49
|
+
| `input` | Reads |
|
|
50
|
+
| ------------------------------------- | -------------------------------------------------------------------------------------------- |
|
|
51
|
+
| `"jawOpen"` | A blendshape channel (ARKit names, `FACE_MORPH_NAMES`), with the person's neutral removed. |
|
|
52
|
+
| `{ channels: [...], combine: "avg" }` | Several channels: `"max"` (default), `"min"`, `"avg"` or `"sum"`. |
|
|
53
|
+
| `{ action: "mouthOpen" }` | A Face Action's value, as `useFaceAction` reads it (raw blendshapes, head turns in radians). |
|
|
54
|
+
| `(frame) => number` | Your own function of `{ morphs, face, live }`. |
|
|
55
|
+
|
|
56
|
+
An unknown channel or action reads 0 and warns once, listing the valid names.
|
|
57
|
+
|
|
58
|
+
## Shaping
|
|
59
|
+
|
|
60
|
+
Every frame, a rule's value goes through these steps in order:
|
|
61
|
+
|
|
62
|
+
```text
|
|
63
|
+
input → range (→ 0..1) → curve → × multiplier → clamp → smoothing
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
| Field | Default | What it does |
|
|
67
|
+
| ------------ | ---------------- | ----------------------------------------------------------------------------------------- |
|
|
68
|
+
| `range` | `[0, 1]` | The input span mapped onto 0..1: below the first value reads 0, above the second reads 1. |
|
|
69
|
+
| `curve` | `1` | An exponent: above 1 eases in (subtle until strong), below 1 eases out. |
|
|
70
|
+
| `multiplier` | `1` | A scale after the curve: above 1 exaggerates. |
|
|
71
|
+
| `clamp` | `[0, max(1, ×)]` | Limits after the multiplier. |
|
|
72
|
+
| `smoothing` | `0.6` | A per-frame EMA factor, or `{ attack, release }` to rise and fall at different speeds. |
|
|
73
|
+
| `rest` | `0` | The value at rest: after a reset, and on face loss. |
|
|
74
|
+
| `onLost` | `"rest"` | On face loss, ease back to `rest`, or `"hold"` the last value. |
|
|
75
|
+
|
|
76
|
+
## Outputs
|
|
77
|
+
|
|
78
|
+
Outputs act on the object named `target` in the subtree; without a `target`, on the whole subtree.
|
|
79
|
+
|
|
80
|
+
| Output | Writes |
|
|
81
|
+
| ------------------- | ------------------------------------------------------------------------------------------------------------- |
|
|
82
|
+
| `morph` | Morph target name(s) on every mesh under it. An ARKit name also matches the Face Cap spelling (`eyeBlink_L`). |
|
|
83
|
+
| `property` | A material uniform (`uniforms[name].value`) or a numeric property (`opacity`, `emissiveIntensity`). |
|
|
84
|
+
| `visible` | Shown while the value is ≥ `above` and/or ≤ `below` (default: ≥ 0.5). |
|
|
85
|
+
| `transform` | An offset from the target's rest at value 1: `position`, `rotation` (degrees), `scale` (factor). |
|
|
86
|
+
| `set` | Your own setter, called every frame with the value. |
|
|
87
|
+
| `onStart` / `onEnd` | Edge callbacks, with `trigger: [on, off]` hysteresis (default `[0.5, 0.35]`). |
|
|
88
|
+
|
|
89
|
+
Several `transform` rules on one target add up, and the target returns to its rest pose every frame
|
|
90
|
+
before they apply. Bindings re-resolve once a second, so children that load later (a GLTF behind
|
|
91
|
+
`Suspense`) are picked up. A target, morph or property that is still missing after that warns once.
|
|
92
|
+
|
|
93
|
+
**Morphs and `ExternalFaceMesh`.** When the controller drives a face model's morphs, set that
|
|
94
|
+
model's `drive` to `"none"` or `"landmarks"`. Otherwise both write the morphs. For a simple gain on
|
|
95
|
+
the automatic mapping, `ExternalFaceMesh`'s `morphGain` is enough.
|
|
96
|
+
|
|
97
|
+
## Reset and face loss
|
|
98
|
+
|
|
99
|
+
- **Reset:** a new `resetKey` puts every rule back at `rest` and ends active triggers, firing
|
|
100
|
+
`onEnd`.
|
|
101
|
+
- **Face loss:** values ease back to `rest`, unless a rule sets `onLost: "hold"`.
|
|
102
|
+
- **Neutral:** recalibrating the person's neutral is the rig's job (`FaceRig`'s `neutralKey`).
|
|
103
|
+
|
|
104
|
+
## Headless use
|
|
105
|
+
|
|
106
|
+
`useExpressionValues(rules)` runs the same rules without outputs. Read the values in `useFrame`:
|
|
107
|
+
|
|
108
|
+
```tsx
|
|
109
|
+
const expr = useExpressionValues([
|
|
110
|
+
{ id: "smile", input: { channels: ["mouthSmileLeft", "mouthSmileRight"], combine: "avg" } },
|
|
111
|
+
]);
|
|
112
|
+
useFrame(() => {
|
|
113
|
+
shader.uniforms.uSmile.value = expr.get("smile");
|
|
114
|
+
});
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
The engine is pure and exported:
|
|
118
|
+
|
|
119
|
+
- `compileExpressionInput`, `createExpressionState` and
|
|
120
|
+
`stepExpressions(state, rules, readers, frame)`;
|
|
121
|
+
- `shapeExpressionValue` and `resetExpressions`;
|
|
122
|
+
- `expressionFrame(rig)`;
|
|
123
|
+
- `createExpressionOutputs(root)`, which has `resolve(rules, warn)` and `apply(rules, state)`.
|
|
124
|
+
|
|
125
|
+
## Example
|
|
126
|
+
|
|
127
|
+
`/external-face-mesh?rules=1` runs on the facecap head when it is present locally (see
|
|
128
|
+
[External Face Mesh](/api/external-face-mesh#example)). It shows:
|
|
129
|
+
|
|
130
|
+
- **Custom morph mapping:** a cartoon mapping with an "exaggerate" slider. A toggle compares it with
|
|
131
|
+
`ExternalFaceMesh`'s automatic mapping.
|
|
132
|
+
- **Props:** a hat that lifts and tilts with the brows, a bubble that appears when the mouth opens,
|
|
133
|
+
and a cheek blush that follows the smile.
|
|
134
|
+
- **Triggers:** blink and mouth-open counters.
|
|
135
|
+
- **Readout:** the live rule values.
|
|
136
|
+
|
|
137
|
+
## Manual visual test plan
|
|
138
|
+
|
|
139
|
+
Open `/external-face-mesh?rules=1` on the webcam and look at the camera, relaxed, when the head
|
|
140
|
+
appears. That captures the neutral.
|
|
141
|
+
|
|
142
|
+
1. **At rest**: every bar reads 0. The hat sits on the crown, there is no bubble and no blush.
|
|
143
|
+
2. **Mouth**: open your mouth wide. With the custom mapping on, the model's jaw opens wider than
|
|
144
|
+
yours (exaggerate 1.4), and the bubble pops up. The mouth counter goes up once per opening, not
|
|
145
|
+
once per frame.
|
|
146
|
+
3. **Blink**: each blink snaps the lids shut and reopens them softly, and the blink counter goes up
|
|
147
|
+
once.
|
|
148
|
+
4. **Brows and smile**: raising your brows lifts and tilts the hat. Smiling brings up the blush,
|
|
149
|
+
up to 0.75 opacity.
|
|
150
|
+
5. **Exaggerate**: at 0.5 everything is subdued; at 2 it is cartoonish but clamped.
|
|
151
|
+
6. **Auto vs custom**: untick "custom morph mapping". `ExternalFaceMesh` drives the morphs one to
|
|
152
|
+
one, with no exaggeration and no soft reopen.
|
|
153
|
+
7. **Face loss**: cover the camera. Everything eases back to rest, and the hat comes down.
|
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.
|