@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.
Files changed (639) hide show
  1. package/GROUNDING.md +5651 -82
  2. package/README.md +1 -0
  3. package/dist/CanonicalHeadFrame-BHcWyaiK.js +1506 -0
  4. package/dist/CanonicalHeadFrame-D-_T1OMU.cjs +1 -0
  5. package/dist/DebuggerUI-7ngnJsBe.js +275 -0
  6. package/dist/DebuggerUI-CoglgKdO.cjs +1 -0
  7. package/dist/FaceRetouch-CLoTfrcs.js +1071 -0
  8. package/dist/FaceRetouch-J1lC1WbS.cjs +134 -0
  9. package/dist/FaceSurface-CHAMEeG1.cjs +1 -0
  10. package/dist/FaceSurface-DmP9AEeC.js +27 -0
  11. package/dist/SegmentationOverlay-D_FWkcyP.cjs +35 -0
  12. package/dist/SegmentationOverlay-vn5x_knv.js +6237 -0
  13. package/dist/SkeletonUtils-C2r90MtN.js +21 -0
  14. package/dist/SkeletonUtils-CddIup1F.cjs +1 -0
  15. package/dist/TextLabel-XE0rQSDn.cjs +2 -0
  16. package/dist/TextLabel-c9BCucOI.js +961 -0
  17. package/dist/assets/cache.d.ts +99 -0
  18. package/dist/assets/estimate.d.ts +11 -0
  19. package/dist/assets/gltfLoader.d.ts +16 -0
  20. package/dist/assets/index.d.ts +7 -0
  21. package/dist/assets/loaders.d.ts +43 -0
  22. package/dist/assets/react.d.ts +33 -0
  23. package/dist/body-pose/index.d.ts +521 -0
  24. package/dist/body-trigger/__fixtures__/syntheticBody.d.ts +83 -0
  25. package/dist/body-trigger/frame.d.ts +88 -0
  26. package/dist/body-trigger/index.d.ts +6 -0
  27. package/dist/body-trigger/moves.d.ts +235 -0
  28. package/dist/body-trigger/trigger.d.ts +75 -0
  29. package/dist/calibration/calibration.d.ts +75 -0
  30. package/dist/calibration/index.d.ts +6 -0
  31. package/dist/calibration/storage.d.ts +13 -0
  32. package/dist/calibration/types.d.ts +53 -0
  33. package/dist/calibration/useXRCalibration.d.ts +46 -0
  34. package/dist/camera/CameraPermissionGate.d.ts +26 -0
  35. package/dist/camera/devices.d.ts +26 -0
  36. package/dist/camera/index.d.ts +8 -0
  37. package/dist/camera/permission.d.ts +86 -0
  38. package/dist/camera/useCameraPermission.d.ts +35 -0
  39. package/dist/canonicalFace-BHwyCx1c.js +9 -0
  40. package/dist/canonicalFace-C83I225R.cjs +1 -0
  41. package/dist/capabilities/detect.d.ts +45 -0
  42. package/dist/capabilities/index.d.ts +5 -0
  43. package/dist/capabilities/types.d.ts +120 -0
  44. package/dist/capabilities/useXRCapabilities.d.ts +18 -0
  45. package/dist/compat/environment.d.ts +5 -0
  46. package/dist/compat/index.d.ts +4 -0
  47. package/dist/compat/run.d.ts +18 -0
  48. package/dist/compat/scenarios.d.ts +10 -0
  49. package/dist/compat/types.d.ts +101 -0
  50. package/dist/components/BodyInstruction/BodyPoseHint.d.ts +63 -0
  51. package/dist/components/BodyInstruction/index.d.ts +69 -0
  52. package/dist/components/BodyInstruction/useBodyPose.d.ts +23 -0
  53. package/dist/components/BodyTracker/index.d.ts +17 -0
  54. package/dist/components/BodyTrigger/index.d.ts +49 -0
  55. package/dist/components/Debugger/DebuggerProvider.d.ts +14 -1
  56. package/dist/components/Debugger/DebuggerUI.d.ts +3 -1
  57. package/dist/components/FaceAtlas/FaceAtlasLayer.d.ts +114 -0
  58. package/dist/components/FaceAtlas/MadeUpCamera.d.ts +80 -0
  59. package/dist/components/FaceAtlas/constants.d.ts +8 -0
  60. package/dist/components/FaceAtlas/index.d.ts +7 -0
  61. package/dist/components/FaceAtlas/useFaceAtlasSurface.d.ts +84 -0
  62. package/dist/components/FaceAtlas/useFaceSkin.d.ts +84 -0
  63. package/dist/components/FaceCharacter/ExternalFaceMesh.d.ts +109 -0
  64. package/dist/components/FaceCharacter/FaceExpressionController.d.ts +53 -0
  65. package/dist/components/FaceCharacter/FaceMorph.d.ts +71 -0
  66. package/dist/components/FaceCharacter/FacePiercing.d.ts +65 -0
  67. package/dist/components/FaceCharacter/FaceReprojection.d.ts +85 -0
  68. package/dist/components/FaceCharacter/FaceRig.d.ts +38 -0
  69. package/dist/components/FaceCharacter/FaceSurface.d.ts +49 -0
  70. package/dist/components/FaceCharacter/FaceSurfaceOccluder.d.ts +39 -0
  71. package/dist/components/FaceCharacter/PinToFaceMesh.d.ts +68 -0
  72. package/dist/components/FaceCharacter/index.d.ts +18 -0
  73. package/dist/components/FaceCharacter/useFaceReprojector.d.ts +10 -0
  74. package/dist/components/FaceInset/FaceInset.d.ts +68 -0
  75. package/dist/components/FaceInset/frame.d.ts +94 -0
  76. package/dist/components/FaceInset/index.d.ts +6 -0
  77. package/dist/components/FaceInset/material.d.ts +40 -0
  78. package/dist/components/FaceInset/useFaceInsetTexture.d.ts +37 -0
  79. package/dist/components/FaceInstruction/FaceExpressionHint.d.ts +43 -0
  80. package/dist/components/FaceInstruction/index.d.ts +56 -0
  81. package/dist/components/FaceInstruction/useFaceExpression.d.ts +20 -0
  82. package/dist/components/FaceLiquify/FaceLiquify.d.ts +49 -0
  83. package/dist/components/FaceLiquify/debug.d.ts +37 -0
  84. package/dist/components/FaceLiquify/frame.d.ts +55 -0
  85. package/dist/components/FaceLiquify/index.d.ts +10 -0
  86. package/dist/components/FaceLiquify/material.d.ts +39 -0
  87. package/dist/components/FaceLiquify/pass.d.ts +49 -0
  88. package/dist/components/FaceLiquify/presence.d.ts +25 -0
  89. package/dist/components/FaceLiquify/presets.d.ts +82 -0
  90. package/dist/components/FaceLiquify/selfTest.d.ts +66 -0
  91. package/dist/components/FaceLiquify/target.d.ts +85 -0
  92. package/dist/components/FaceLiquify/warp.d.ts +72 -0
  93. package/dist/components/FaceMesh/canonical/CanonicalFaceMeshRenderer.d.ts +37 -5
  94. package/dist/components/FaceMesh/canonical/geometryGroups.d.ts +21 -0
  95. package/dist/components/FaceMesh/canonical/parseCanonicalFaceModel.d.ts +21 -0
  96. package/dist/components/FaceMesh/canonical/shaders.d.ts +1 -1
  97. package/dist/components/FaceMesh/index.d.ts +2 -2
  98. package/dist/components/FaceRetouch/Background.d.ts +3 -1
  99. package/dist/components/FaceRetouch/FaceRetouch.d.ts +5 -0
  100. package/dist/components/FaceRetouch/renderState.d.ts +19 -0
  101. package/dist/components/FaceSwap/FaceMirror.d.ts +46 -0
  102. package/dist/components/FaceSwap/FaceSwap.d.ts +58 -0
  103. package/dist/components/FaceSwap/FaceTextureLayer.d.ts +72 -0
  104. package/dist/components/FaceSwap/faceSwapPlan.d.ts +91 -0
  105. package/dist/components/FaceSwap/index.d.ts +13 -0
  106. package/dist/components/FaceSwap/settings.d.ts +300 -0
  107. package/dist/components/FaceSwap/useFaceTexture.d.ts +35 -0
  108. package/dist/components/FaceSwap/useLiveFace.d.ts +38 -0
  109. package/dist/components/FaceSwap/useLiveFaceTexture.d.ts +31 -0
  110. package/dist/components/FaceWarp3D/FaceWarp3D.d.ts +50 -0
  111. package/dist/components/FaceWarp3D/index.d.ts +2 -3
  112. package/dist/components/Faceless/Faceless.d.ts +51 -0
  113. package/dist/components/Faceless/index.d.ts +2 -0
  114. package/dist/components/GestureListener/index.d.ts +11 -0
  115. package/dist/components/HairLock/HairLock.d.ts +39 -0
  116. package/dist/components/HairLock/index.d.ts +2 -0
  117. package/dist/components/HairLock/lockGeometry.d.ts +15 -0
  118. package/dist/components/HandCutout/index.d.ts +35 -0
  119. package/dist/components/HandInstruction/HandGestureHint.d.ts +70 -0
  120. package/dist/components/HandInstruction/index.d.ts +74 -0
  121. package/dist/components/HandInstruction/useHandGesture.d.ts +22 -0
  122. package/dist/components/HandRig/ForearmOccluder.d.ts +29 -0
  123. package/dist/components/HandRig/HandAttachment.d.ts +34 -0
  124. package/dist/components/HandRig/HandOccluder.d.ts +55 -0
  125. package/dist/components/HandRig/HandTattoo.d.ts +61 -0
  126. package/dist/components/HandRig/WristAttachment.d.ts +34 -0
  127. package/dist/components/HandRig/index.d.ts +101 -0
  128. package/dist/components/HandRig/useArmMask.d.ts +29 -0
  129. package/dist/components/HandRig/wristSolve.d.ts +69 -0
  130. package/dist/components/HandTouch/HandTouch.d.ts +62 -0
  131. package/dist/components/HandTouch/Touchable.d.ts +36 -0
  132. package/dist/components/HandTouch/index.d.ts +2 -0
  133. package/dist/components/HandTracker/index.d.ts +10 -0
  134. package/dist/components/HeadBinding/index.d.ts +14 -0
  135. package/dist/components/HeadOccluder/CanonicalHeadFrame.d.ts +22 -0
  136. package/dist/components/HeadOccluder/Earrings.d.ts +55 -0
  137. package/dist/components/HeadOccluder/HeadAttachment.d.ts +38 -0
  138. package/dist/components/HeadOccluder/NeckOccluder.d.ts +64 -0
  139. package/dist/components/HeadOccluder/earringPlacement.d.ts +31 -0
  140. package/dist/components/HeadOccluder/headAttachmentPoints.d.ts +69 -0
  141. package/dist/components/HeadOccluder/index.d.ts +57 -3
  142. package/dist/components/HeadOccluder/useCanonicalHeadFit.d.ts +36 -0
  143. package/dist/components/HeadOccluder/useLandmarkPoseFit.d.ts +80 -0
  144. package/dist/components/HolisticTracker/index.d.ts +69 -0
  145. package/dist/components/HolisticTracker/settings.d.ts +58 -0
  146. package/dist/components/HolisticTracker/signals.d.ts +49 -0
  147. package/dist/components/Instruction/HintStage.d.ts +29 -0
  148. package/dist/components/Instruction/InstructionCue.d.ts +126 -0
  149. package/dist/components/Instruction/gestureHold.d.ts +20 -0
  150. package/dist/components/Instruction/ghost.d.ts +129 -0
  151. package/dist/components/Instruction/hintBlend.d.ts +19 -0
  152. package/dist/components/Instruction/hintLook.d.ts +81 -0
  153. package/dist/components/Instruction/hintLoop.d.ts +36 -0
  154. package/dist/components/Instruction/index.d.ts +41 -0
  155. package/dist/components/Instruction/useGhostModel.d.ts +33 -0
  156. package/dist/components/Instruction/useInstructionHold.d.ts +72 -0
  157. package/dist/components/IrisEffect/IrisMaterial.d.ts +73 -0
  158. package/dist/components/IrisEffect/index.d.ts +51 -0
  159. package/dist/components/IrisEffect/settings.d.ts +117 -0
  160. package/dist/components/LipEffect/LipEffect.d.ts +27 -1
  161. package/dist/components/LipEffect/LipEffectMaterial.d.ts +95 -7
  162. package/dist/components/LipEffect/LipEffects.d.ts +12 -0
  163. package/dist/components/LipEffect/defaults.d.ts +46 -4
  164. package/dist/components/LipEffect/index.d.ts +11 -3
  165. package/dist/components/LipEffect/lipShading.d.ts +73 -0
  166. package/dist/components/LipEffect/settings.d.ts +375 -0
  167. package/dist/components/LipEffect/shader.d.ts +39 -0
  168. package/dist/components/LipEffect/types.d.ts +128 -9
  169. package/dist/components/LipEffect/useLipDesignTextures.d.ts +17 -0
  170. package/dist/components/LipEffect/uvGuide.d.ts +74 -0
  171. package/dist/components/Makeup/Blush.d.ts +18 -0
  172. package/dist/components/Makeup/Brows.d.ts +20 -0
  173. package/dist/components/Makeup/Contour.d.ts +17 -0
  174. package/dist/components/Makeup/Eyeliner.d.ts +20 -0
  175. package/dist/components/Makeup/Eyeshadow.d.ts +20 -0
  176. package/dist/components/Makeup/Highlighter.d.ts +18 -0
  177. package/dist/components/Makeup/MakeupDesign.d.ts +37 -0
  178. package/dist/components/Makeup/MakeupRegion.d.ts +132 -0
  179. package/dist/components/Makeup/constants.d.ts +44 -0
  180. package/dist/components/Makeup/design.d.ts +106 -0
  181. package/dist/components/Makeup/designSamples.d.ts +42 -0
  182. package/dist/components/Makeup/eyes.d.ts +114 -0
  183. package/dist/components/Makeup/fields.d.ts +10 -0
  184. package/dist/components/Makeup/geometry.d.ts +106 -0
  185. package/dist/components/Makeup/index.d.ts +26 -0
  186. package/dist/components/Makeup/looks.d.ts +28 -0
  187. package/dist/components/Makeup/material.d.ts +239 -0
  188. package/dist/components/Makeup/settings.d.ts +54 -0
  189. package/dist/components/Makeup/shades.d.ts +143 -0
  190. package/dist/components/Makeup/shapes.d.ts +27 -0
  191. package/dist/components/Makeup/skinTone.d.ts +135 -0
  192. package/dist/components/Makeup/types.d.ts +110 -0
  193. package/dist/components/Makeup/useMakeupSkinTone.d.ts +40 -0
  194. package/dist/components/Necklace/Necklace.d.ts +44 -0
  195. package/dist/components/Necklace/index.d.ts +1 -0
  196. package/dist/components/ParticleEmitter/ParticleEmitter.d.ts +69 -0
  197. package/dist/components/ParticleEmitter/index.d.ts +1 -0
  198. package/dist/components/PersonCutout/index.d.ts +50 -0
  199. package/dist/components/PersonCutout/personCutout.d.ts +16 -0
  200. package/dist/components/ScreenImage/components/ScreenImageBody.d.ts +1 -1
  201. package/dist/components/ScreenImage/index.d.ts +3 -1
  202. package/dist/components/ScreenImage/materials/ScreenImageBlendMaterial.d.ts +1 -1
  203. package/dist/components/ScreenImage/materials/ScreenImageMaskMaterial.d.ts +11 -0
  204. package/dist/components/ScreenImage/source.d.ts +6 -0
  205. package/dist/components/ScreenImage/types.d.ts +18 -0
  206. package/dist/components/SegmentationOverlay/SegmentationOverlay.d.ts +37 -0
  207. package/dist/components/SegmentationOverlay/SegmentationOverlayMaterial.d.ts +31 -0
  208. package/dist/components/SegmentationOverlay/index.d.ts +9 -0
  209. package/dist/components/SegmentationOverlay/maskTexture.d.ts +23 -0
  210. package/dist/components/SegmentationOverlay/providers.d.ts +72 -0
  211. package/dist/components/SegmentationOverlay/settings.d.ts +65 -0
  212. package/dist/components/ShoulderOccluder/index.d.ts +43 -0
  213. package/dist/components/ShoulderOccluder/useCanonicalTorsoFit.d.ts +24 -0
  214. package/dist/components/SpringSwing/SpringSwing.d.ts +22 -0
  215. package/dist/components/SpringSwing/index.d.ts +1 -0
  216. package/dist/components/XRProvider/index.d.ts +16 -2
  217. package/dist/components/XRScene/renderOutputTarget.d.ts +12 -0
  218. package/dist/components/XRViewport/hooks/useViewportExternalFaces.d.ts +1 -1
  219. package/dist/components/XRViewport/hooks/useViewportMediaSource.d.ts +1 -1
  220. package/dist/components/XRViewport/hooks/useViewportPipeline.d.ts +1 -1
  221. package/dist/components/index.d.ts +11 -0
  222. package/dist/config/index.d.ts +0 -1
  223. package/dist/constants/index.d.ts +4 -1
  224. package/dist/context-DTxSQvp4.js +13 -0
  225. package/dist/context-hA0Rb2Xa.cjs +1 -0
  226. package/dist/contexts-BH7PdKFS.cjs +1 -0
  227. package/dist/contexts-jak8-tND.js +667 -0
  228. package/dist/coordinates/feed.d.ts +52 -0
  229. package/dist/coordinates/index.d.ts +7 -0
  230. package/dist/coordinates/side.d.ts +40 -0
  231. package/dist/coordinates/spaces.d.ts +49 -0
  232. package/dist/coordinates/viewport.d.ts +22 -0
  233. package/dist/coordinates/world.d.ts +15 -0
  234. package/dist/debug-ui/default-setting.cjs +2 -2
  235. package/dist/debug-ui/face-swap-settings/index.d.ts +22 -0
  236. package/dist/debug-ui/gesture-settings/index.d.ts +14 -0
  237. package/dist/debug-ui/hierarchy-panel/index.d.ts +3 -2
  238. package/dist/debug-ui/holistic-tracker-settings/index.d.ts +16 -0
  239. package/dist/debug-ui/index.d.ts +18 -3
  240. package/dist/debug-ui/iris-effect-settings/index.d.ts +12 -0
  241. package/dist/debug-ui/lip-effect-settings/index.d.ts +15 -0
  242. package/dist/debug-ui/media-source/index.d.ts +1 -1
  243. package/dist/debug-ui/media-source/session.d.ts +30 -2
  244. package/dist/debug-ui/media-source.cjs +1 -1
  245. package/dist/debug-ui/media-source.js +1 -1
  246. package/dist/debug-ui/object-inspector-panel/index.d.ts +3 -2
  247. package/dist/debug-ui/product-hotspots/index.d.ts +25 -0
  248. package/dist/debug-ui/scene-editor/hierarchy-panel.d.ts +3 -1
  249. package/dist/debug-ui/scene-editor/inspector-panel.d.ts +3 -1
  250. package/dist/debug-ui/screen-image-settings/index.d.ts +3 -1
  251. package/dist/debug-ui/screen-text-settings/ScreenTextSettingsPanel.d.ts +1 -1
  252. package/dist/debug-ui/screen-text-settings/types.d.ts +2 -0
  253. package/dist/debug-ui/segmentation-overlay-settings/index.d.ts +12 -0
  254. package/dist/debug-ui/settings-panel/index.d.ts +6 -1
  255. package/dist/debug-ui/shared/debugWindow.d.ts +51 -0
  256. package/dist/debug-ui/xr-diagnostics/index.d.ts +26 -0
  257. package/dist/debug-ui.cjs +3 -3
  258. package/dist/debug-ui.js +2695 -2547
  259. package/dist/detector-K8aej4MB.js +59 -0
  260. package/dist/detector-ijypGtse.cjs +1 -0
  261. package/dist/entries/all.d.ts +3 -1
  262. package/dist/entries/core.d.ts +20 -2
  263. package/dist/entries/face-effects.d.ts +123 -9
  264. package/dist/entries/instructions.d.ts +48 -0
  265. package/dist/entries/internal.d.ts +2 -1
  266. package/dist/entries/low-level.d.ts +49 -3
  267. package/dist/entries/particles.d.ts +11 -0
  268. package/dist/entries/product.d.ts +11 -0
  269. package/dist/entries/tracking.d.ts +60 -2
  270. package/dist/face-atlas/attributes.d.ts +30 -0
  271. package/dist/face-atlas/eyes.d.ts +272 -0
  272. package/dist/face-atlas/faceAtlas.generated.d.ts +46 -0
  273. package/dist/face-atlas/glsl/atlasVertex.d.ts +46 -0
  274. package/dist/face-atlas/glsl/common.d.ts +55 -0
  275. package/dist/face-atlas/glsl/design.d.ts +49 -0
  276. package/dist/face-atlas/glsl/eyes.d.ts +73 -0
  277. package/dist/face-atlas/glsl/finish.d.ts +24 -0
  278. package/dist/face-atlas/glsl/format.d.ts +4 -0
  279. package/dist/face-atlas/glsl/index.d.ts +59 -0
  280. package/dist/face-atlas/glsl/shading.d.ts +15 -0
  281. package/dist/face-atlas/glsl/shapes.d.ts +66 -0
  282. package/dist/face-atlas/glsl/sparkle.d.ts +19 -0
  283. package/dist/face-atlas/glsl/uniforms.d.ts +106 -0
  284. package/dist/face-atlas/guide.d.ts +51 -0
  285. package/dist/face-atlas/index.d.ts +25 -0
  286. package/dist/face-atlas/lead.d.ts +117 -0
  287. package/dist/face-atlas/madeUpCamera.d.ts +125 -0
  288. package/dist/face-atlas/masks.d.ts +53 -0
  289. package/dist/face-atlas/obj.d.ts +69 -0
  290. package/dist/face-atlas/polylines.d.ts +63 -0
  291. package/dist/face-atlas/probe/FaceSkinProbe.d.ts +208 -0
  292. package/dist/face-atlas/probe/__fixtures__/emulate.d.ts +9 -0
  293. package/dist/face-atlas/probe/__fixtures__/face.d.ts +24 -0
  294. package/dist/face-atlas/probe/constants.d.ts +137 -0
  295. package/dist/face-atlas/probe/glsl.d.ts +43 -0
  296. package/dist/face-atlas/probe/lightFit.d.ts +108 -0
  297. package/dist/face-atlas/probe/schedule.d.ts +44 -0
  298. package/dist/face-atlas/probe/selfTest.d.ts +87 -0
  299. package/dist/face-atlas/probe/stats.d.ts +143 -0
  300. package/dist/face-atlas/probe/targets.d.ts +70 -0
  301. package/dist/face-atlas/probe/unwrap.d.ts +76 -0
  302. package/dist/face-atlas/quality.d.ts +28 -0
  303. package/dist/face-atlas/regions.d.ts +31 -0
  304. package/dist/face-atlas/registry.d.ts +252 -0
  305. package/dist/face-atlas/renderState.d.ts +86 -0
  306. package/dist/face-atlas/selfOcclusion.d.ts +62 -0
  307. package/dist/face-atlas/shading.d.ts +406 -0
  308. package/dist/face-atlas/shapes.d.ts +86 -0
  309. package/dist/face-atlas/sides.d.ts +41 -0
  310. package/dist/face-atlas/skinMask.d.ts +35 -0
  311. package/dist/face-atlas/surface.d.ts +155 -0
  312. package/dist/face-atlas/topology.d.ts +44 -0
  313. package/dist/face-character/__fixtures__/faceImageDetections.d.ts +25 -0
  314. package/dist/face-character/__fixtures__/faceNode.d.ts +22 -0
  315. package/dist/face-character/bindFaceModel.d.ts +106 -0
  316. package/dist/face-character/canonicalFace.d.ts +17 -0
  317. package/dist/face-character/canonicalFaceGeometry.d.ts +11 -0
  318. package/dist/face-character/canonicalFacePositions.d.ts +7 -0
  319. package/dist/face-character/driveFaceModel.d.ts +57 -0
  320. package/dist/face-character/expressionOutputs.d.ts +45 -0
  321. package/dist/face-character/faceExpressions.d.ts +104 -0
  322. package/dist/face-character/faceImageLandmarker.d.ts +93 -0
  323. package/dist/face-character/faceMeshBinding.d.ts +62 -0
  324. package/dist/face-character/faceMorph.d.ts +77 -0
  325. package/dist/face-character/faceMorphs.d.ts +46 -0
  326. package/dist/face-character/facePhoto.d.ts +138 -0
  327. package/dist/face-character/facePiercings.d.ts +116 -0
  328. package/dist/face-character/facePin.d.ts +131 -0
  329. package/dist/face-character/faceReprojection.d.ts +273 -0
  330. package/dist/face-character/faceReprojector.d.ts +171 -0
  331. package/dist/face-character/faceRig.d.ts +176 -0
  332. package/dist/face-character/faceSwapPresence.d.ts +85 -0
  333. package/dist/face-character/faceTexture.d.ts +169 -0
  334. package/dist/face-character/faceTextureBaker.d.ts +86 -0
  335. package/dist/face-character/faceTextureGuide.d.ts +106 -0
  336. package/dist/face-character/faceTextureStats.d.ts +298 -0
  337. package/dist/face-character/faceTransfer.d.ts +396 -0
  338. package/dist/face-character/faceTransferGeometry.d.ts +109 -0
  339. package/dist/face-character/faceTransferSelfTest.d.ts +94 -0
  340. package/dist/face-character/faceWarp3D.d.ts +101 -0
  341. package/dist/face-character/faceless.d.ts +79 -0
  342. package/dist/face-character/featureWarp.d.ts +28 -0
  343. package/dist/face-character/liveFaceRegistry.d.ts +370 -0
  344. package/dist/face-character/liveValue.d.ts +12 -0
  345. package/dist/face-character/memo.d.ts +15 -0
  346. package/dist/face-effects.cjs +2324 -1
  347. package/dist/face-effects.js +14208 -2268
  348. package/dist/face-expression/index.d.ts +182 -0
  349. package/dist/face-info/landmarks.d.ts +17 -3
  350. package/dist/face-info/types.d.ts +20 -3
  351. package/dist/gestures/definitions.d.ts +98 -0
  352. package/dist/gestures/detector.d.ts +87 -0
  353. package/dist/gestures/index.d.ts +8 -0
  354. package/dist/gestures/measures.d.ts +114 -0
  355. package/dist/gestures/settings.d.ts +49 -0
  356. package/dist/getFaceInfo-B1otSDMX.cjs +1 -0
  357. package/dist/getFaceInfo-Cu4xDWiL.js +62 -0
  358. package/dist/hand/armFit.d.ts +46 -0
  359. package/dist/hand/armMask.d.ts +178 -0
  360. package/dist/hand/handCutout.d.ts +23 -0
  361. package/dist/hand/handCutoutRegistry.d.ts +7 -0
  362. package/dist/hand/handGestures.d.ts +524 -0
  363. package/dist/hand/handPose.d.ts +98 -0
  364. package/dist/hand/handRigSolver.d.ts +159 -0
  365. package/dist/hand/handTattoo.d.ts +81 -0
  366. package/dist/hand/handTouch.d.ts +240 -0
  367. package/dist/hand/wrist.d.ts +44 -0
  368. package/dist/hand/wristFilter.d.ts +44 -0
  369. package/dist/hooks/selectors.d.ts +76 -1
  370. package/dist/hooks/useCalibrationFaceTracker.d.ts +1 -1
  371. package/dist/hooks/useFaceInfo.d.ts +13 -1
  372. package/dist/hooks/useFaceInfos.d.ts +1 -1
  373. package/dist/hooks/useFaceModelAcquisition.d.ts +38 -0
  374. package/dist/hooks/useGesture.d.ts +32 -0
  375. package/dist/hooks/useIrisTracking.d.ts +45 -0
  376. package/dist/hooks/useTrackerContext.d.ts +6 -0
  377. package/dist/hooks/useXRDiagnostics.d.ts +81 -0
  378. package/dist/hooks/useXRModel.d.ts +7 -0
  379. package/dist/hooks/useXRSession/facade.d.ts +42 -2
  380. package/dist/hooks/useXRSession/index.d.ts +2 -2
  381. package/dist/hooks/useXRSession/reason.d.ts +3 -1
  382. package/dist/hooks/useXRSession/registry.d.ts +14 -0
  383. package/dist/hooks/useXRSession/store.d.ts +52 -3
  384. package/dist/index-B1_TzJaI.js +1104 -0
  385. package/dist/index-BavF06C6.js +190 -0
  386. package/dist/index-BfFmpddl.cjs +21 -0
  387. package/dist/index-BuBzneeW.cjs +46 -0
  388. package/dist/index-CGsQWodV.cjs +1 -0
  389. package/dist/index-CIe7eCMH.js +3200 -0
  390. package/dist/index-CfSF8LXa.cjs +1 -0
  391. package/dist/index-D5GTzOzD.cjs +1 -0
  392. package/dist/index-DBhQzvVa.js +314 -0
  393. package/dist/index-DE17y0ZI.cjs +1 -0
  394. package/dist/index-JII7huPk.js +442 -0
  395. package/dist/index-tpCr9CLj.cjs +1 -0
  396. package/dist/index-w1S7fI2B.js +1432 -0
  397. package/dist/index-zGaqrz_K.js +188 -0
  398. package/dist/instructions.cjs +30 -0
  399. package/dist/instructions.js +1507 -0
  400. package/dist/{internal-Dmk1cTXq.js → internal-B90P-clC.js} +138 -119
  401. package/dist/internal-Cjinca64.cjs +1 -0
  402. package/dist/internal.cjs +1 -1
  403. package/dist/internal.js +15 -10
  404. package/dist/iris/compute.d.ts +27 -0
  405. package/dist/iris/index.d.ts +4 -0
  406. package/dist/iris/lead.d.ts +19 -0
  407. package/dist/iris/types.d.ts +89 -0
  408. package/dist/landmarkMask-BFDyBnKM.js +224 -0
  409. package/dist/landmarkMask-u7es2k4X.cjs +1 -0
  410. package/dist/landmarks-BlUqf5MZ.cjs +1 -0
  411. package/dist/landmarks-bftdwq6Z.js +76 -0
  412. package/dist/loaders-BGAUACsd.js +363 -0
  413. package/dist/loaders-BJ1_QCHt.cjs +1 -0
  414. package/dist/low-level.cjs +1 -1
  415. package/dist/low-level.js +1190 -675
  416. package/dist/main.cjs +1 -1
  417. package/dist/main.js +1190 -452
  418. package/dist/models/Base/index.d.ts +49 -0
  419. package/dist/models/Body/index.d.ts +3 -1
  420. package/dist/models/Face/constants.d.ts +8 -0
  421. package/dist/models/Face/index.d.ts +4 -12
  422. package/dist/models/Face/rotation.d.ts +18 -3
  423. package/dist/models/Hand/GestureTracking.d.ts +1 -1
  424. package/dist/models/Hand/HandTracking.d.ts +17 -1
  425. package/dist/models/Holistic/index.d.ts +49 -0
  426. package/dist/models/Holistic/result.d.ts +68 -0
  427. package/dist/models/Segmentation/index.d.ts +2 -0
  428. package/dist/models/SemanticSegmentation/index.d.ts +31 -0
  429. package/dist/models/SemanticSegmentation/presets.d.ts +28 -0
  430. package/dist/models/index.d.ts +2 -0
  431. package/dist/models/nodeSource.d.ts +9 -0
  432. package/dist/particles/emission.d.ts +24 -0
  433. package/dist/particles/eyes.d.ts +24 -0
  434. package/dist/particles/glsl.d.ts +14 -0
  435. package/dist/particles/index.d.ts +10 -0
  436. package/dist/particles/motion.d.ts +42 -0
  437. package/dist/particles/presets.d.ts +12 -0
  438. package/dist/particles/ring.d.ts +58 -0
  439. package/dist/particles/selfTest.d.ts +53 -0
  440. package/dist/particles/settings.d.ts +127 -0
  441. package/dist/particles/shapes.d.ts +29 -0
  442. package/dist/particles/spawner.d.ts +60 -0
  443. package/dist/particles/system.d.ts +64 -0
  444. package/dist/particles.cjs +122 -0
  445. package/dist/particles.js +774 -0
  446. package/dist/product/ProductDimensions.d.ts +16 -0
  447. package/dist/product/ProductHotspot.d.ts +16 -0
  448. package/dist/product/ProductViewer.d.ts +9 -0
  449. package/dist/product/details.d.ts +53 -0
  450. package/dist/product/index.d.ts +14 -0
  451. package/dist/product/loadModelViewer.d.ts +4 -0
  452. package/dist/product/types.d.ts +71 -0
  453. package/dist/product/useProductAr.d.ts +37 -0
  454. package/dist/product/useProductDetails.d.ts +60 -0
  455. package/dist/product.cjs +1 -0
  456. package/dist/product.js +414 -0
  457. package/dist/providers-C8rE26Uf.js +366 -0
  458. package/dist/providers-DHsrhDI2.cjs +62 -0
  459. package/dist/quality/XRQualityController.d.ts +25 -0
  460. package/dist/quality/controller.d.ts +33 -0
  461. package/dist/quality/index.d.ts +6 -0
  462. package/dist/quality/types.d.ts +100 -0
  463. package/dist/quality/useXRQuality.d.ts +28 -0
  464. package/dist/render/renderPasses.d.ts +8 -0
  465. package/dist/render/sceneBeforeRender.d.ts +12 -0
  466. package/dist/{renderGroups-KZk6eRiY.js → renderGroups-B38pUaX2.js} +1 -1
  467. package/dist/{renderGroups-80H3DpTl.cjs → renderGroups-Cb_4Ar1Q.cjs} +1 -1
  468. package/dist/renderPasses-B6l8IpJv.js +1290 -0
  469. package/dist/renderPasses-dqmkft4P.cjs +158 -0
  470. package/dist/renderState-CJNmj5jz.js +39 -0
  471. package/dist/renderState-apSfg4eR.cjs +1 -0
  472. package/dist/scene-object.cjs +1 -1
  473. package/dist/scene-object.js +2 -2
  474. package/dist/segmentation-Cb3ouK6Z.js +1758 -0
  475. package/dist/segmentation-D9pYO6aR.cjs +1 -0
  476. package/dist/segmentation2d/faceMemory.d.ts +28 -0
  477. package/dist/segmentation2d/faceRegions.d.ts +24 -0
  478. package/dist/segmentation2d/index.d.ts +9 -0
  479. package/dist/segmentation2d/maskUv.d.ts +23 -0
  480. package/dist/segmentation2d/rasterize.d.ts +14 -0
  481. package/dist/segmentation2d/types.d.ts +52 -0
  482. package/dist/select-Ck5LGz-J.cjs +1 -0
  483. package/dist/select-pYRo_win.js +233 -0
  484. package/dist/selectors-C4X71aoD.cjs +1 -0
  485. package/dist/selectors-DmNaKIwE.js +196 -0
  486. package/dist/session-BrH8G7iJ.cjs +31 -0
  487. package/dist/session-DgA_z6O1.js +418 -0
  488. package/dist/settings-BJ7FMBsO.js +111 -0
  489. package/dist/settings-C63FMBlF.cjs +1 -0
  490. package/dist/similarityFit-BFqHND2e.cjs +1 -0
  491. package/dist/similarityFit-Bbz-R8AY.js +91 -0
  492. package/dist/spring/index.d.ts +2 -0
  493. package/dist/spring/spring.d.ts +69 -0
  494. package/dist/spring/swing.d.ts +54 -0
  495. package/dist/subjects/index.d.ts +2 -0
  496. package/dist/subjects/select.d.ts +62 -0
  497. package/dist/subjects/types.d.ts +55 -0
  498. package/dist/tracking-config/apply.d.ts +57 -0
  499. package/dist/tracking-config/index.d.ts +7 -0
  500. package/dist/tracking-config/resolve.d.ts +25 -0
  501. package/dist/tracking-config/storage.d.ts +8 -0
  502. package/dist/tracking-config/types.d.ts +106 -0
  503. package/dist/tracking-config/useXRTrackingConfig.d.ts +38 -0
  504. package/dist/tracking.cjs +10 -1
  505. package/dist/tracking.js +1326 -506
  506. package/dist/trigger-D0Pm9noT.cjs +49 -0
  507. package/dist/trigger-IQeys0oS.js +2128 -0
  508. package/dist/types/compositor.d.ts +21 -0
  509. package/dist/types/face.d.ts +20 -1
  510. package/dist/types/hand-tracking.d.ts +9 -0
  511. package/dist/types/holistic.d.ts +121 -0
  512. package/dist/types/index.d.ts +1 -0
  513. package/dist/types/model.d.ts +22 -2
  514. package/dist/types/nodes.d.ts +47 -3
  515. package/dist/types/segmentation.d.ts +24 -0
  516. package/dist/types/session.d.ts +41 -3
  517. package/dist/updateThrottle-BseecYag.js +4 -0
  518. package/dist/updateThrottle-Of5Y4SVa.cjs +1 -0
  519. package/dist/useFaceInfo-BHDNCvsJ.cjs +1 -0
  520. package/dist/useFaceInfo-J4x7LsqL.js +76 -0
  521. package/dist/useFaceResultReader-BvEo5REG.js +61 -0
  522. package/dist/useFaceResultReader-DuaL1KJG.cjs +1 -0
  523. package/dist/useInstructionHold-DOu-RpCM.js +53 -0
  524. package/dist/useInstructionHold-DwJY1Alr.cjs +1 -0
  525. package/dist/useLandmarkPoseFit-Bg-h9BPb.cjs +1 -0
  526. package/dist/useLandmarkPoseFit-Bmb3h6Mw.js +87 -0
  527. package/dist/useXRCapabilities-Cr3RzuAW.cjs +1 -0
  528. package/dist/useXRCapabilities-Cxmlmpbd.js +30 -0
  529. package/dist/utils/canonicalRigidLandmarks.d.ts +8 -0
  530. package/dist/utils/fns.d.ts +6 -3
  531. package/dist/utils/headOccluderFit.d.ts +42 -0
  532. package/dist/utils/integrity.d.ts +21 -1
  533. package/dist/utils/resolveNumFaces.d.ts +13 -0
  534. package/dist/utils/shoulderOccluderFit.d.ts +38 -0
  535. package/dist/utils/similarityFit.d.ts +23 -0
  536. package/dist/utils/updateThrottle.d.ts +2 -0
  537. package/dist/utils/useStableUniforms.d.ts +18 -0
  538. package/dist/uv-BMFt19bg.cjs +1 -0
  539. package/dist/{index-ByoNj0QP.js → uv-DJU_XfmN.js} +15 -247
  540. package/docs/SDK_DOCUMENTATION.md +1 -2
  541. package/docs/api/adaptive-quality.mdx +104 -0
  542. package/docs/api/asset-lifecycle.mdx +78 -0
  543. package/docs/api/body-instructions.mdx +285 -0
  544. package/docs/api/body-triggers.mdx +234 -0
  545. package/docs/api/camera-permission.mdx +142 -0
  546. package/docs/api/coordinate-spaces.mdx +168 -0
  547. package/docs/api/cross-camera.mdx +89 -0
  548. package/docs/api/debug-ui-scene-editor.mdx +23 -2
  549. package/docs/api/diagnostics-calibration.mdx +97 -0
  550. package/docs/api/external-face-mesh.mdx +231 -0
  551. package/docs/api/face-actions.mdx +20 -16
  552. package/docs/api/face-attribute-expression.mdx +1 -1
  553. package/docs/api/face-binding-anchors.mdx +4 -2
  554. package/docs/api/face-character.mdx +157 -0
  555. package/docs/api/face-effects.mdx +9 -0
  556. package/docs/api/face-expression-controller.mdx +153 -0
  557. package/docs/api/face-info.mdx +17 -11
  558. package/docs/api/face-inset.mdx +204 -0
  559. package/docs/api/face-instructions.mdx +183 -0
  560. package/docs/api/face-liquify.mdx +196 -0
  561. package/docs/api/face-mesh.mdx +8 -9
  562. package/docs/api/face-morph.mdx +117 -0
  563. package/docs/api/face-painting.mdx +7 -0
  564. package/docs/api/face-reprojection.mdx +154 -0
  565. package/docs/api/face-retouching.mdx +18 -10
  566. package/docs/api/face-swap.mdx +350 -0
  567. package/docs/api/face-warp-3d.mdx +166 -0
  568. package/docs/api/faceless.mdx +143 -0
  569. package/docs/api/gestures.mdx +209 -0
  570. package/docs/api/hair.mdx +97 -0
  571. package/docs/api/hand-instructions.mdx +222 -0
  572. package/docs/api/hand-rig.mdx +535 -0
  573. package/docs/api/hand-touch.mdx +162 -0
  574. package/docs/api/head-occluder.mdx +563 -0
  575. package/docs/api/holistic-tracker.mdx +164 -0
  576. package/docs/api/instructions.mdx +323 -0
  577. package/docs/api/iris-tracking.mdx +247 -0
  578. package/docs/api/made-up-camera.mdx +131 -0
  579. package/docs/api/makeup-skin-tone.mdx +135 -0
  580. package/docs/api/makeup.mdx +353 -0
  581. package/docs/api/multi-subject.mdx +98 -0
  582. package/docs/api/particles.mdx +155 -0
  583. package/docs/api/person-cutout.mdx +136 -0
  584. package/docs/api/pin-to-face-mesh.mdx +274 -0
  585. package/docs/api/product-ar.mdx +114 -0
  586. package/docs/api/product-details.mdx +78 -0
  587. package/docs/api/screen-space-coordinates.mdx +4 -1
  588. package/docs/api/segmentation-overlay.mdx +301 -0
  589. package/docs/api/session-lifecycle.mdx +136 -0
  590. package/docs/api/trackers.mdx +5 -0
  591. package/docs/api/tracking-config.mdx +108 -0
  592. package/docs/docs.json +51 -1
  593. package/docs/examples/lip-shaders.mdx +273 -0
  594. package/docs/guides/face-atlas-template.svg +1 -0
  595. package/docs/guides/face-atlas-textures.mdx +186 -0
  596. package/docs/guides/face-texture-template.svg +1 -0
  597. package/docs/guides/harness-debug-ui.mdx +4 -4
  598. package/docs/guides/lip-effect-textures.mdx +368 -0
  599. package/docs/guides/lip-uv-template.png +0 -0
  600. package/docs/guides/lip-uv-template.svg +1 -0
  601. package/docs/guides/makeup-design-textures.mdx +109 -0
  602. package/docs/introduction.mdx +1 -2
  603. package/package.json +23 -1
  604. package/dist/DebuggerUI-B6bP6P9r.cjs +0 -1
  605. package/dist/DebuggerUI-BjOMr8q_.js +0 -269
  606. package/dist/FaceMeshRenderer-C5l6VLdO.cjs +0 -155
  607. package/dist/FaceMeshRenderer-wjAHrJzP.js +0 -1270
  608. package/dist/FaceRetouch-BkJzoA79.cjs +0 -134
  609. package/dist/FaceRetouch-DwbKQJAN.js +0 -551
  610. package/dist/components/FaceWarp3D/FaceWarp3DHead.d.ts +0 -15
  611. package/dist/components/FaceWarp3D/defaults.d.ts +0 -37
  612. package/dist/components/FaceWarp3D/warp.d.ts +0 -13
  613. package/dist/contexts-ByhzppYl.js +0 -663
  614. package/dist/contexts-Dr62It_K.cjs +0 -1
  615. package/dist/debug-ui/face-warp-3d/index.d.ts +0 -6
  616. package/dist/getFaceInfo-C4QpCQIY.js +0 -118
  617. package/dist/getFaceInfo-fA1bFBub.cjs +0 -1
  618. package/dist/index-9dlAQAhy.js +0 -1462
  619. package/dist/index-BjmTe9eM.cjs +0 -1
  620. package/dist/index-BpEf2BBb.cjs +0 -1
  621. package/dist/index-CyUUurQT.cjs +0 -1
  622. package/dist/index-DCiMbxC3.cjs +0 -1
  623. package/dist/index-DXT3WccE.js +0 -2089
  624. package/dist/index-DpI-qo5X.cjs +0 -17
  625. package/dist/index-DyVF4vEW.js +0 -111
  626. package/dist/index-VJ0SJwmG.js +0 -214
  627. package/dist/internal-Cq-TEQ5Y.cjs +0 -1
  628. package/dist/renderLayers-lDtL0_43.cjs +0 -1
  629. package/dist/renderLayers-zrK2pv5O.js +0 -13
  630. package/dist/renderPasses-BOoBSr8z.cjs +0 -21
  631. package/dist/renderPasses-BcquyVtu.js +0 -1500
  632. package/dist/selectors-B8H97CKA.js +0 -59
  633. package/dist/selectors-CZLKT2Iv.cjs +0 -1
  634. package/dist/session-CpkiK5YA.cjs +0 -31
  635. package/dist/session-DLFN_VII.js +0 -363
  636. package/dist/useFaceInfo-BJ8-_MOs.cjs +0 -1
  637. package/dist/useFaceInfo-Dk426LTu.js +0 -62
  638. package/dist/useFaceResults-CtetsO9M.js +0 -19
  639. package/dist/useFaceResults-wBJF3zyp.cjs +0 -1
@@ -0,0 +1,231 @@
1
+ ---
2
+ title: "External Face Mesh"
3
+ description: "Wear your own head or face model on the tracked face: it follows the head pose and the face's expression, with any topology and UV layout."
4
+ sidebarTitle: "External Face Mesh"
5
+ icon: "masks-theater"
6
+ ---
7
+
8
+ `ExternalFaceMesh` puts your own face model on the tracked face. It follows the head pose and the
9
+ face's expression in two ways at once:
10
+
11
+ - **Landmarks:** the tracked landmarks bend the mesh, so the jaw opens and the lips and cheeks move.
12
+ - **Morphs:** the model's own ARKit-named morph targets play the face's blendshapes. That gives an
13
+ authored blink and raised brows, and the eyeballs turn with the gaze.
14
+
15
+ It is the foundation of the face-character pipeline
16
+ ([#194](https://github.com/vincentt-xr/sdk/issues/194)). Expression controllers, pinned accessories
17
+ and face reprojection build on the same `FaceRig`.
18
+
19
+ Import from `@vincentt-xr/sdk/face-effects`.
20
+
21
+ ## Quick start
22
+
23
+ ```tsx
24
+ import { useLoader } from "@react-three/fiber";
25
+ import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";
26
+ import { FaceTracker } from "@vincentt-xr/sdk/tracking";
27
+ import { ExternalFaceMesh } from "@vincentt-xr/sdk/face-effects";
28
+
29
+ const Character = () => {
30
+ const head = useLoader(GLTFLoader, headUrl); // authored in canonical centimetres
31
+ return (
32
+ <FaceTracker>
33
+ <ExternalFaceMesh model={head.scene} />
34
+ </FaceTracker>
35
+ );
36
+ };
37
+ ```
38
+
39
+ It reads the parent `FaceTracker`'s face (or a `HeadBinding`'s) and never acquires the face model
40
+ itself. The model is cloned with its geometry, so one loaded model can back several faces.
41
+
42
+ ## Authoring the model
43
+
44
+ Author the model in the **canonical head frame**, the same frame as `CanonicalHeadFrame` and the v3
45
+ head occluder `.blend` in `assets-src/head-occluder/`:
46
+
47
+ - **Units and axes:** centimetres, +Y up, +Z out of the face toward the camera.
48
+ - **Origin:** landmark 4, just above the nose tip, sits at `(0, -0.46, 7.59)`.
49
+
50
+ The easiest way is to open the occluder `.blend` and fit your head over it. Its first 468 vertices
51
+ are the tracked face landmarks, so the eyes, nose and mouth line up when your model sits on them.
52
+
53
+ Any topology and any UV layout works. The face area should lie close to the canonical face surface:
54
+ the closer it is, the more of the face follows the expression. The rest (skull, ears, neck,
55
+ accessories) can go anywhere and stays rigid.
56
+
57
+ ## How it follows the face
58
+
59
+ **What drives it** is set by `drive`:
60
+
61
+ | `drive` | What moves it |
62
+ | ------------------ | ---------------------------------------------------------------------------------------------------------------- |
63
+ | `"auto"` (default) | `"morphs"` for a full ARKit set (mouth morphs too), `"hybrid"` with only eye or brow morphs, else `"landmarks"`. |
64
+ | `"hybrid"` | Landmarks for the jaw, lips and cheeks; the model's morphs for the eyes and brows. |
65
+ | `"morphs"` | Only the model's morph targets, driven by the blendshapes; otherwise just the head pose. |
66
+ | `"landmarks"` | Only the landmarks bend the mesh. |
67
+ | `"none"` | The head pose only. |
68
+
69
+ For a model with a full ARKit set, such as Face Cap's, the authored morphs look best, so `"auto"`
70
+ picks `"morphs"`. Binding then plays no part, because nothing is bent.
71
+
72
+ Why hybrid for eye and brow morphs: MediaPipe only tracks the edge of each eyelid, 16 points around each eye. Bending a
73
+ sculpted lid with those points drags its edge down without rolling the lid over the eyeball. That
74
+ leaves slits at the corners and creases the lid. An authored `eyeBlink` morph closes it cleanly, so
75
+ hybrid masks the eye and brow landmarks (`FACE_REGION_MASKS`) and lets the morphs move those parts.
76
+
77
+ **Morph names** map to MediaPipe's 51 blendshape channels (`FACE_MORPH_NAMES`, ARKit names). The
78
+ match accepts:
79
+
80
+ - ARKit names, e.g. `eyeBlinkLeft`;
81
+ - Face Cap and Blender styles, e.g. `eyeBlink_L`, `eyeBlink.L`, `eyeBlink_left`;
82
+ - any case;
83
+ - exporter prefixes such as `blendShape1.`.
84
+
85
+ `Left` is the model's own left (landmark 263's side, MediaPipe's left), as in ARKit. It is driven
86
+ mesh to mesh, so the model's eye in front of the person's blinking eye blinks on every feed (on the
87
+ mirrored webcam that is MediaPipe's right channel for the person's real left eye; GROUNDING "Left
88
+ and right"). MediaPipe has no `tongueOut`.
89
+ Morphs that no channel drives are left alone, so your own animation keeps them. The model's rest pose
90
+ must have every morph at 0.
91
+
92
+ **Binding** happens once, at load. Each vertex is bound to a point on the canonical face surface,
93
+ which is MediaPipe's 853 face triangles. The mouth and eye openings are holes, so a lip never binds
94
+ across the mouth. `binding` picks how:
95
+
96
+ | `binding` | Binds by |
97
+ | ------------------ | ------------------------------------------------------------------------------------ |
98
+ | `"auto"` (default) | UV when the mesh's UVs are a canonical layout (most UV hits agree with 3D), else 3D. |
99
+ | `"uv"` | UV only, for a mesh whose face UVs follow `CANONICAL_FACE_UVS` (either v direction). |
100
+ | `"surface"` | The closest point in 3D. Any topology and layout. |
101
+
102
+ **Influence** depends on how far a vertex sits from the face surface. Within `falloff[0]` (0.8 cm)
103
+ it follows fully; it fades to rigid at `falloff[1]` (2.5 cm). The back of the head, the ears and the
104
+ neck therefore stay rigid.
105
+
106
+ **Parts:** each mesh of the model follows in one of three ways (`parts`, by object name):
107
+
108
+ - `"surface"`: every vertex follows its own point. Use it for skin.
109
+ - `"follow"`: the whole mesh moves as one with the point under its centre, keeping its shape. Use
110
+ it for eyeballs, teeth or a nose ring. A follow part named like an eye (`eye…`) also turns with
111
+ the gaze (`eyeLookIn/Out/Up/Down`, up to `gazeDegrees` = `[25, 20]`).
112
+ - `"rigid"`: head pose only. Use it for a helmet or hair.
113
+
114
+ By default, a mesh whose median vertex sits more than 0.3 cm behind the face (eyeballs, teeth) is
115
+ `"follow"`, and everything else is `"surface"`.
116
+
117
+ **Neutral.** Only the expression moves the model, not the person's own face shape or resting
118
+ expression. With `neutral: "auto"` (default), the rig averages the landmarks and the blendshape
119
+ scores over the first `neutralMs` (600 ms) after the face is found, and subtracts that rest face. The
120
+ blendshapes are rescaled, so a resting 0.1 reads 0 and a full blink still reads 1. It recaptures every time the face is found again, and when
121
+ `neutralKey` changes: bind it to a "Recalibrate" button and ask the person to relax and look at the
122
+ camera. With `neutral: "none"` the model also takes on the person's face shape (wider eyes, a longer
123
+ jaw).
124
+
125
+ ## `ExternalFaceMesh`
126
+
127
+ | Prop | Default | What it does |
128
+ | --------------------- | ------------- | ------------------------------------------------------------------------------------------- |
129
+ | `model` | — | The face model (e.g. a GLTF scene) in the canonical head frame. |
130
+ | `drive` | `"auto"` | What moves it: `"auto"`, `"hybrid"`, `"morphs"`, `"landmarks"` or `"none"`. |
131
+ | `binding` | `"auto"` | `"auto"`, `"uv"` or `"surface"`. |
132
+ | `falloff` | `[0.8, 2.5]` | Full influence up to the first distance (cm), rigid beyond the second. |
133
+ | `parts` | auto | Per mesh name: `"surface"`, `"follow"` or `"rigid"`. |
134
+ | `expression` | `1` | 0 = rigid, 1 = the tracked face, > 1 exaggerates. |
135
+ | `morphGain` | — | A gain per channel on its morph, e.g. `{ eyeBlinkLeft: 1.2 }`. |
136
+ | `gazeDegrees` | `[25, 20]` | How far a full look turns an eyeball: sideways, up/down (degrees). |
137
+ | `onBind` | — | Called once per model with every mesh's binding (readouts, debug views). |
138
+ | `faceIndex` | the tracker's | Which tracked face (when not inside a `FaceRig`; likewise the rows below). |
139
+ | `smoothing` | `0.5` | Head pose EMA while still (`1` = none). Fast turns follow at once, so a shake never trails. |
140
+ | `expressionSmoothing` | `0.6` | Expression EMA, `1` = none. MediaPipe's depth is noisy; a little keeps the mesh calm. |
141
+ | `holdMs` | `250` | Keep the last pose and expression through shorter dropouts. |
142
+ | `neutral` | `"auto"` | `"auto"` subtracts the captured rest face; `"none"` keeps the person's face shape. |
143
+ | `neutralMs` | `600` | How long the neutral capture averages. |
144
+ | `neutralKey` | — | A new value captures the neutral again. |
145
+ | `leadMs` | `0` | Landmark lead between inferences (One Euro + velocity, at most this long). 0 = raw. |
146
+ | `onTrackingChange` | — | Called once on found (`true`) and once on lost (`false`). |
147
+ | `children` | — | More content in the canonical head frame. |
148
+
149
+ ## `FaceRig`
150
+
151
+ `FaceRig` is the engine underneath, and every face-character component shares one. It is a group in
152
+ the canonical head frame, like `CanonicalHeadFrame`, that also publishes the face's expression. Put
153
+ several components inside one `FaceRig` to share it:
154
+
155
+ ```tsx
156
+ <FaceTracker>
157
+ <FaceRig neutralKey={recalibrations}>
158
+ <ExternalFaceMesh model={head.scene} />
159
+ <ExternalFaceMesh model={beard.scene} />
160
+ </FaceRig>
161
+ </FaceTracker>
162
+ ```
163
+
164
+ `useFaceRig()` returns a ref to the live `FaceRigState`. Read it inside `useFrame`:
165
+
166
+ - `tracking`: `"tracked"`, `"held"` or `"lost"`.
167
+ - `pose`: `{ position, quaternion, scale }`, canonical cm → world.
168
+ - `local`: the 468 landmarks in the head frame (cm).
169
+ - `residual`: the expression, as each landmark's offset from the rest face (cm, 468 × 3).
170
+ - `morphs`: the 51 blendshape channels (0..1, neutral removed).
171
+ - `neutral`, `morphNeutral` and `neutralState`.
172
+
173
+ The rig holds its last state through dropouts shorter than `holdMs`, hides when the face is lost,
174
+ and snaps on reacquire.
175
+
176
+ The pure pieces are exported for custom renderers:
177
+
178
+ - `stepFaceRig(state, worldLandmarks, nowMs, options, scores)`, `createFaceRigState()` and
179
+ `recalibrateFaceRig(state)`.
180
+ - `bindFaceMesh(positionsCm, uvs, { mode, falloff, uvTolerance })` and
181
+ `deformFaceMesh(binding, rest, residual, out, amount, toLocal)`.
182
+ - `bindFaceModel(root, options)`, `planFaceDrive(meshes, mode)` and
183
+ `driveFaceModel(meshes, plan, rig, options)`.
184
+ - `faceMorphChannel(name)`, `faceMorphRegion`, `FACE_GAZE_CHANNELS` and `FACE_REGION_MASKS`.
185
+ - The canonical data: `CANONICAL_FACE_POSITIONS`, `CANONICAL_FACE_TRIANGLES` and
186
+ `CANONICAL_FACE_UVS`.
187
+
188
+ ## Example
189
+
190
+ `/external-face-mesh` wears the three.js "facecap" head when it is present. The file goes in the
191
+ git-ignored `example/src/assets/models/local/facecap-canonical.glb`; it has no redistribution
192
+ licence, so it is never committed. That copy is prepared as follows:
193
+
194
+ - aligned to the canonical frame;
195
+ - ears raised to the anatomical height (brow to nose base);
196
+ - every morph zeroed at rest (the original kept a frame of its animation).
197
+
198
+ It carries all 52 ARKit morphs, of which 51 are tracked. Without it, the page uses the canonical
199
+ head.
200
+
201
+ The page has controls for:
202
+
203
+ - drive, binding, expression and falloff;
204
+ - a binding heat map (red follows, blue rigid);
205
+ - keeping the face shape;
206
+ - recalibrating the neutral;
207
+ - the head occluder and two faces.
208
+
209
+ ## Manual visual test plan
210
+
211
+ Open `/external-face-mesh` on the webcam.
212
+
213
+ 1. **Placement**: the model sits on your head, with its eyes, nose and mouth on yours, and stays
214
+ there as you turn and tilt.
215
+ 2. **Neutral**: look at the camera relaxed when it appears. At rest it keeps its own shape: eyes
216
+ not stretched, jaw not lengthened. Tick "keep the person's face shape" and it conforms to yours;
217
+ untick it.
218
+ 3. **Expression**: open your mouth (the jaw drops and the lips part, never stretching across), smile
219
+ (the mouth corners and cheeks move), raise your brows. With drive "none", nothing moves but the
220
+ pose.
221
+ 4. **Blink and gaze** (facecap, drive "auto" = morphs): blink one eye, then both. The lid rolls down over the
222
+ eye and closes, with no slit at the corners and no crease. Look left, right, up and down: the
223
+ eyeballs turn with you. Open your mouth and smile: facecap's own jawOpen and smile shapes play.
224
+ Switch drive to "landmarks" to see the difference.
225
+ 5. **Parts**: the eyes and teeth move as whole pieces, never squashed. The back of the head and the
226
+ ears stay rigid; the heat map shows red on the face fading to blue.
227
+ 6. **Recalibrate**: start with your mouth open, then relax and press Recalibrate. The rest pose is
228
+ corrected.
229
+ 7. **Dropouts**: a brief cover of the camera holds the head. Longer, and it hides, then snaps back
230
+ on reacquire.
231
+ 8. **Two faces**: on the two-people image, each face wears its own copy.
@@ -37,21 +37,23 @@ const isPouting = hasFaceAction(face, "mouthPout");
37
37
 
38
38
  ## Actions
39
39
 
40
- | Name | Meaning |
41
- | ------------------------------- | ---------------------------- |
42
- | `browRaise` | Either brow is raised |
43
- | `eyeBlink` | Both eyes blink |
44
- | `eyeBlinkEither` | Either eye blinks |
45
- | `eyeBlinkLeft`, `eyeBlinkRight` | Viewer-left/right eye blinks |
46
- | `mouthOpen` | Jaw opens |
47
- | `mouthPout` | Lips pucker |
48
- | `headUp`, `headDown` | Pitch from neutral |
49
- | `headTurnLeft`, `headTurnRight` | Yaw from neutral |
50
- | `headTiltLeft`, `headTiltRight` | Roll from neutral |
40
+ | Name | Meaning |
41
+ | ------------------------------- | ---------------------------------------------------------------- |
42
+ | `browRaise` | Either brow is raised |
43
+ | `eyeBlink` | Both eyes blink |
44
+ | `eyeBlinkEither` | Either eye blinks |
45
+ | `eyeBlinkLeft`, `eyeBlinkRight` | The person's own left / right eye blinks |
46
+ | `mouthOpen` | Jaw opens |
47
+ | `mouthPout` | Lips pucker |
48
+ | `headUp`, `headDown` | Pitch from neutral |
49
+ | `headTurnLeft`, `headTurnRight` | Yaw from neutral, toward the person's own left / right |
50
+ | `headTiltLeft`, `headTiltRight` | Roll from neutral, toward the person's own left / right shoulder |
51
51
 
52
52
  Blendshape values are in `[0, 1]`. Head values are non-negative radians. Up and
53
- left follow the SDK convention and are positive before they are converted to an
54
- action magnitude.
53
+ the person's own left follow the SDK convention and are positive before they
54
+ are converted to an action magnitude. Left and right are the person's own side
55
+ on every feed: the mirrored webcam, the rear camera, images and video
56
+ (GROUNDING "Left and right").
55
57
 
56
58
  ## Neutral head pose
57
59
 
@@ -89,15 +91,17 @@ left, right, both, and either-eye movement cases. Use `mouthOpen`, `mouthPout`,
89
91
  and `browRaise` for the matching physical movements. These actions report
90
92
  observable pose/blendshape movement; they do not infer emotion.
91
93
 
92
- Left/right blink names use the mirrored viewer-facing convention used by effect
93
- editors. Raw `FaceInfo.blendshapes` retain MediaPipe's anatomical-side names.
94
+ Left/right blink names are the person's own eyes on every feed. Raw
95
+ `FaceInfo.blendshapes` keep MediaPipe's names (`eyeBlinkLeft` = MediaPipe's left
96
+ eye: the person's own left on an unmirrored feed, their right on the mirrored
97
+ webcam); the actions read the right one for `face.mirrored`.
94
98
  The lifecycle guarantees one `stay` frame between `begin` and `end`, including
95
99
  for a blink that drops below its release threshold on the next input frame.
96
100
 
97
101
  For image-based happy, sad, angry, fear, disgust, surprise, neutral, and unknown
98
102
  classification, use the separate `useFaceAttributeExpression` hook. The SDK
99
103
  does not fabricate these labels from movement thresholds. The verified
100
- `/facial-movement-expression` page exposes both independent surfaces.
104
+ `/face-actions` page exposes both independent surfaces.
101
105
 
102
106
  Use `/face-actions` to view every value, calibrate neutral pose, adjust the
103
107
  selected action, and repeat the live verification checklist. All actions and
@@ -82,6 +82,6 @@ Without those headers, ONNX Runtime falls back to single-threaded WASM.
82
82
  Treat classifications as model estimates of visible facial expression—not
83
83
  ground-truth emotion, intent, identity, or mental state.
84
84
 
85
- Use the verified `/facial-movement-expression` page to inspect the live winning
85
+ Use the verified `/face-actions` page to inspect the live winning
86
86
  class and all seven probabilities. Its real-camera model flow, including every
87
87
  expression class, was verified on 26 July 2026.
@@ -7,7 +7,9 @@ icon: "locate-fixed"
7
7
 
8
8
  Use `TrackingAnchor` to attach content to semantic face locations. Build editor
9
9
  dropdowns from `FACE_TARGETS`; do not copy landmark indices or invent target
10
- strings. Left and right use the tracked person's perspective.
10
+ strings. Left and right are the tracked person's own side on every feed (GROUNDING "Left and
11
+ right"): `face.leftEarlobe` is their real left ear lobe on the mirrored webcam (the screen's left)
12
+ and on a video (the screen's right).
11
13
 
12
14
  ## Presets
13
15
 
@@ -33,7 +35,7 @@ does not provide anatomical earlobe points.
33
35
  ## Custom points
34
36
 
35
37
  For `face.custom`, pass `customAnchorPoint`. X and Y are clamped to `[-1, 1]`;
36
- the origin is face center, X runs from the person's left to right, Y runs from
38
+ the origin is face center, X runs from the person's own left to right on every feed, Y runs from
37
39
  chin to forehead, and positive Z points toward the camera.
38
40
 
39
41
  ```tsx
@@ -0,0 +1,157 @@
1
+ ---
2
+ title: "Face Character (end to end)"
3
+ description: "Every face-character piece together: a cute warp of your real face, a transform into a character, the character with your eyes and mouth, pins, a hat behind the head and hands in front."
4
+ sidebarTitle: "Face Character"
5
+ icon: "masks-theater"
6
+ ---
7
+
8
+ This page puts the face-character pipeline ([#194](https://github.com/vincentt-xr/sdk/issues/194),
9
+ #200) together in one lens, for up to two people at once. Each piece has its own page:
10
+
11
+ | Piece | What it does here |
12
+ | ------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
13
+ | [`FaceWarp3D`](/api/face-warp-3d) | "You": your real face made cute (a bigger-eyes shape key), photoreal |
14
+ | [`FaceMorph`](/api/face-morph) | "Transform": your face swells into the character, your eyes flowing into its eyes |
15
+ | [`ExternalFaceMesh`](/api/external-face-mesh) | "Character": the character head, following your head |
16
+ | [`FaceExpressionController`](/api/face-expression-controller) | Plays the character's shape keys from your expression, plus blush, sparkles and a wink counter |
17
+ | [`FaceReprojection`](/api/face-reprojection) | Your eyes and mouth on the character (`align` for its cartoon proportions) |
18
+ | [`PinToFaceMesh`](/api/pin-to-face-mesh) | A bow and a star that ride the warp, the morph and the character's skin |
19
+ | [`HeadAttachment`](/api/head-occluder) + occluder | A party hat whose back goes behind your head |
20
+ | `HandCutout` | Your hands stay in front of all of it |
21
+
22
+ ## The structure
23
+
24
+ ```tsx
25
+ import {
26
+ ExternalFaceMesh,
27
+ FaceExpressionController,
28
+ FaceMorph,
29
+ FaceReprojection,
30
+ FaceRig,
31
+ FaceWarp3D,
32
+ HeadAttachment,
33
+ HeadBinding,
34
+ PinToFaceMesh,
35
+ } from "@vincentt-xr/sdk/face-effects";
36
+ import { HandCutout, HandTracker } from "@vincentt-xr/sdk/tracking";
37
+
38
+ <HandTracker>
39
+ <HandCutout />
40
+ </HandTracker>;
41
+
42
+ {
43
+ [0, 1].map((faceIndex) => (
44
+ <HeadBinding key={faceIndex} faceIndex={faceIndex} numFaces={2} occluder={{ url: occluderUrl }}>
45
+ <FaceRig>
46
+ {phase === "you" && (
47
+ <FaceWarp3D deformation={cuteShapes} weights={{ cute: 0.7 }}>
48
+ <Pins /> {/* children ride the warp */}
49
+ </FaceWarp3D>
50
+ )}
51
+ {phase === "transform" && (
52
+ <FaceMorph shape={character} align={GHOST_ALIGN} weight={sweepRef} falloff={[4, 9]}>
53
+ <Pins /> {/* children ride the morph */}
54
+ </FaceMorph>
55
+ )}
56
+ {phase === "character" && (
57
+ <FaceExpressionController rules={ghostRules}>
58
+ <group ref={characterRef}>
59
+ <ExternalFaceMesh model={character} drive="none">
60
+ <FaceReprojection region="eyesAndMouth" align={GHOST_ALIGN} meshes={GHOST_WEARS} />
61
+ </ExternalFaceMesh>
62
+ </group>
63
+ <Pins onto={characterRef} /> {/* on the character's skin */}
64
+ </FaceExpressionController>
65
+ )}
66
+ </FaceRig>
67
+ <HeadAttachment point="crown" offset={{ position: [0, 0.6, 0.4] }}>
68
+ <PartyHat />
69
+ </HeadAttachment>
70
+ </HeadBinding>
71
+ ));
72
+ }
73
+ ```
74
+
75
+ ### Stylised characters
76
+
77
+ The SDK ghost head (`face-v1.glb`) has cartoon proportions: big eyes 3 cm lower than a real face's.
78
+ Pass its own eye and mouth centres as `align` (`{ leftEye, rightEye, mouth }`). `FaceReprojection` and
79
+ `FaceMorph` then bind it as if those sat on your face, so your eyes land on its eyes.
80
+
81
+ Being rounder than a real face, it also needs a wider `FaceMorph` `falloff` (`[4, 9]`). Name the parts
82
+ that wear your face with `meshes`. Eye parts are found by mesh or material name (`eye…`, `iris…`).
83
+
84
+ ### Expressions on a character's own shape keys
85
+
86
+ The ghost's shape keys (`smile`, `wink`, `surprised`, `kiss`, `puffCheeks`, `frown`, `scrunch`) are
87
+ played by `FaceExpressionController` rules from ARKit channels. That's why the `ExternalFaceMesh` uses
88
+ `drive="none"`.
89
+
90
+ The same controller also handles the extras:
91
+
92
+ - the blush's opacity follows your smile;
93
+ - sparkles show while your mouth is open;
94
+ - each wink triggers a counter.
95
+
96
+ ### Draw order and the head occluder
97
+
98
+ The occluder is your real head, skull included. It must hide what is behind your head, like the
99
+ hat's back. It must never hide the face effects, including a character head smaller than your skull.
100
+
101
+ Everything that is the face draws first, at `FACE_SURFACE_RENDER_ORDER` (-2), before the occluder
102
+ (-1, on its meshes). Accessories come after (0). Set render orders on meshes, never on a `Group`:
103
+ three sorts by the nearest group first.
104
+
105
+ ### Hands in front
106
+
107
+ `HandCutout` draws your hands' silhouettes as near-plane depth before everything else. A hand over your
108
+ face shows the real hand in front of the warp, the character, the pins and the hat.
109
+
110
+ ## Example
111
+
112
+ `/face-character` has:
113
+
114
+ - **A Transform button.**
115
+ - **Controls:**
116
+ - the character (the ghost head, or facecap when the local file is present);
117
+ - "cute you";
118
+ - your eyes and mouth on the character;
119
+ - a toon material;
120
+ - the head occluder;
121
+ - hands in front;
122
+ - one or two people.
123
+ - **Badges** for each face's tracking and a wink count.
124
+
125
+ URL options:
126
+
127
+ - `?phase=character` starts as the character;
128
+ - `?hold=0.5` freezes the transform at that weight, for inspection;
129
+ - `?faces=1`, `?occluder=0`, `?hands=0`, `?wear=0` and `?toon=1` set the controls.
130
+
131
+ ## Manual visual test plan
132
+
133
+ Open `/face-character` on the webcam.
134
+
135
+ 1. **You**: your eyes are bigger and the face looks real. The bow sits on the side of your forehead
136
+ and the star on your cheek; both move with your face. The hat sits on your crown, and turning your
137
+ head hides its back behind your head.
138
+ 2. **Transform**: your face swells into the ghost over about 1.5 s. Your eyes flow into its eyes, and
139
+ the bow and star ride along. "Back to you" reverses it.
140
+ 3. **Character**:
141
+ - the whole round ghost is visible, with nothing cut away by the occluder;
142
+ - your eyes and mouth are on it;
143
+ - smile: it smiles and blushes;
144
+ - wink: the counter goes up;
145
+ - open your mouth: sparkles;
146
+ - puff your cheeks, kiss, frown and scrunch: it does too.
147
+ 4. **Occluder**: toggle the head occluder. The face effects never change; only the hat's back hides
148
+ or shows.
149
+ 5. **Hands**: put a hand over your face in every phase. The real hand stays in front of the warp, the
150
+ character, the pins and the hat. Turn the toggle off and they draw over your hand.
151
+ 6. **Two people**: with two faces in view, each gets its own lens. The badges follow each face.
152
+ 7. **Tracking loss**: cover your face. The lens holds briefly, then hides (the badge says "lost") and
153
+ comes back on reacquire.
154
+ 8. **Mirror**: switch between the webcam and the sample media. Everything stays on the right side of
155
+ the face.
156
+ 9. **facecap** (local): pick facecap. The transform and the character work on a realistic head, with
157
+ no `align` needed.
@@ -9,10 +9,19 @@ This section is split into focused pages:
9
9
 
10
10
  - [Face Mesh](/api/face-mesh) for the base 3D face mesh, canonical renderer,
11
11
  and face mesh material settings.
12
+ - [Head Occluder](/api/head-occluder) for `HeadBinding`, the canonical-fit
13
+ depth-only head mesh and `CanonicalHeadFrame`, so 3D accessories pass behind
14
+ the tracked head.
12
15
  - [Face Painting](/api/face-painting) for the composite shader variant used to
13
16
  paint onto the live face mesh.
14
17
  - [Face Retouching](/api/face-retouching) for the legacy skin-retouch shader
15
18
  and its controls.
19
+ - [Segmentation Overlay](/api/segmentation-overlay) for 2D semantic region
20
+ layers (lips, eyes, brows, face skin, person, background) without 3D
21
+ geometry, and when to prefer them over the canonical mesh.
22
+ - [Lip Effect Textures](/guides/lip-effect-textures) for `LipEffect`: the
23
+ design-texture canvas contract, the generated lip UV template, mask modes,
24
+ and the custom material context.
16
25
 
17
26
  Use `@vincentt-xr/sdk/tracking` for trackers, `FaceInfo`, Face Actions, and the
18
27
  bare deforming `FaceMesh`. Use `@vincentt-xr/sdk/face-effects` for the modular
@@ -0,0 +1,153 @@
1
+ ---
2
+ title: "Face Expression Controller"
3
+ description: "Turn the tracked expression into behaviour with typed rules: morph targets, material values, visibility, transforms, triggers and your own setters."
4
+ sidebarTitle: "Face Expression Controller"
5
+ icon: "sliders"
6
+ ---
7
+
8
+ `FaceExpressionController` turns the tracked face's expression into behaviour. Each rule has three
9
+ parts:
10
+
11
+ - an **input**, such as a blendshape, a combination of them, a Face Action or your own function;
12
+ - its **shaping**: range, curve, multiplier, clamp and smoothing;
13
+ - its **outputs**: morph targets, material values, visibility, transforms, triggers or a setter.
14
+
15
+ It is part of the face-character pipeline ([#194](https://github.com/vincentt-xr/sdk/issues/194)):
16
+ #196 is the controller, and #197 is custom morph mapping. It runs on a
17
+ [`FaceRig`](/api/external-face-mesh#facerig).
18
+
19
+ Import from `@vincentt-xr/sdk/face-effects`.
20
+
21
+ ## Quick start
22
+
23
+ ```tsx
24
+ import { ExternalFaceMesh, FaceExpressionController, FaceRig } from "@vincentt-xr/sdk/face-effects";
25
+ import { FaceTracker } from "@vincentt-xr/sdk/tracking";
26
+
27
+ <FaceTracker>
28
+ <FaceRig>
29
+ <FaceExpressionController
30
+ rules={[
31
+ { input: "jawOpen", morph: "jawOpen", multiplier: 1.4 },
32
+ { input: { action: "mouthOpen" }, target: "bubble", visible: { above: 0.45 } },
33
+ { input: { action: "eyeBlink" }, onStart: () => playBlinkSound() },
34
+ ]}
35
+ >
36
+ <ExternalFaceMesh model={head.scene} drive="none" />
37
+ <group name="bubble">…</group>
38
+ </FaceExpressionController>
39
+ </FaceRig>
40
+ </FaceTracker>;
41
+ ```
42
+
43
+ The outputs act on the controller's children, which sit in the canonical head frame (centimetres).
44
+ Inside a `FaceRig` the controller shares that rig; otherwise it runs its own, so mount it in a
45
+ `FaceTracker`.
46
+
47
+ ## Inputs
48
+
49
+ | `input` | Reads |
50
+ | ------------------------------------- | -------------------------------------------------------------------------------------------- |
51
+ | `"jawOpen"` | A blendshape channel (ARKit names, `FACE_MORPH_NAMES`), with the person's neutral removed. |
52
+ | `{ channels: [...], combine: "avg" }` | Several channels: `"max"` (default), `"min"`, `"avg"` or `"sum"`. |
53
+ | `{ action: "mouthOpen" }` | A Face Action's value, as `useFaceAction` reads it (raw blendshapes, head turns in radians). |
54
+ | `(frame) => number` | Your own function of `{ morphs, face, live }`. |
55
+
56
+ An unknown channel or action reads 0 and warns once, listing the valid names.
57
+
58
+ ## Shaping
59
+
60
+ Every frame, a rule's value goes through these steps in order:
61
+
62
+ ```text
63
+ input → range (→ 0..1) → curve → × multiplier → clamp → smoothing
64
+ ```
65
+
66
+ | Field | Default | What it does |
67
+ | ------------ | ---------------- | ----------------------------------------------------------------------------------------- |
68
+ | `range` | `[0, 1]` | The input span mapped onto 0..1: below the first value reads 0, above the second reads 1. |
69
+ | `curve` | `1` | An exponent: above 1 eases in (subtle until strong), below 1 eases out. |
70
+ | `multiplier` | `1` | A scale after the curve: above 1 exaggerates. |
71
+ | `clamp` | `[0, max(1, ×)]` | Limits after the multiplier. |
72
+ | `smoothing` | `0.6` | A per-frame EMA factor, or `{ attack, release }` to rise and fall at different speeds. |
73
+ | `rest` | `0` | The value at rest: after a reset, and on face loss. |
74
+ | `onLost` | `"rest"` | On face loss, ease back to `rest`, or `"hold"` the last value. |
75
+
76
+ ## Outputs
77
+
78
+ Outputs act on the object named `target` in the subtree; without a `target`, on the whole subtree.
79
+
80
+ | Output | Writes |
81
+ | ------------------- | ------------------------------------------------------------------------------------------------------------- |
82
+ | `morph` | Morph target name(s) on every mesh under it. An ARKit name also matches the Face Cap spelling (`eyeBlink_L`). |
83
+ | `property` | A material uniform (`uniforms[name].value`) or a numeric property (`opacity`, `emissiveIntensity`). |
84
+ | `visible` | Shown while the value is ≥ `above` and/or ≤ `below` (default: ≥ 0.5). |
85
+ | `transform` | An offset from the target's rest at value 1: `position`, `rotation` (degrees), `scale` (factor). |
86
+ | `set` | Your own setter, called every frame with the value. |
87
+ | `onStart` / `onEnd` | Edge callbacks, with `trigger: [on, off]` hysteresis (default `[0.5, 0.35]`). |
88
+
89
+ Several `transform` rules on one target add up, and the target returns to its rest pose every frame
90
+ before they apply. Bindings re-resolve once a second, so children that load later (a GLTF behind
91
+ `Suspense`) are picked up. A target, morph or property that is still missing after that warns once.
92
+
93
+ **Morphs and `ExternalFaceMesh`.** When the controller drives a face model's morphs, set that
94
+ model's `drive` to `"none"` or `"landmarks"`. Otherwise both write the morphs. For a simple gain on
95
+ the automatic mapping, `ExternalFaceMesh`'s `morphGain` is enough.
96
+
97
+ ## Reset and face loss
98
+
99
+ - **Reset:** a new `resetKey` puts every rule back at `rest` and ends active triggers, firing
100
+ `onEnd`.
101
+ - **Face loss:** values ease back to `rest`, unless a rule sets `onLost: "hold"`.
102
+ - **Neutral:** recalibrating the person's neutral is the rig's job (`FaceRig`'s `neutralKey`).
103
+
104
+ ## Headless use
105
+
106
+ `useExpressionValues(rules)` runs the same rules without outputs. Read the values in `useFrame`:
107
+
108
+ ```tsx
109
+ const expr = useExpressionValues([
110
+ { id: "smile", input: { channels: ["mouthSmileLeft", "mouthSmileRight"], combine: "avg" } },
111
+ ]);
112
+ useFrame(() => {
113
+ shader.uniforms.uSmile.value = expr.get("smile");
114
+ });
115
+ ```
116
+
117
+ The engine is pure and exported:
118
+
119
+ - `compileExpressionInput`, `createExpressionState` and
120
+ `stepExpressions(state, rules, readers, frame)`;
121
+ - `shapeExpressionValue` and `resetExpressions`;
122
+ - `expressionFrame(rig)`;
123
+ - `createExpressionOutputs(root)`, which has `resolve(rules, warn)` and `apply(rules, state)`.
124
+
125
+ ## Example
126
+
127
+ `/external-face-mesh?rules=1` runs on the facecap head when it is present locally (see
128
+ [External Face Mesh](/api/external-face-mesh#example)). It shows:
129
+
130
+ - **Custom morph mapping:** a cartoon mapping with an "exaggerate" slider. A toggle compares it with
131
+ `ExternalFaceMesh`'s automatic mapping.
132
+ - **Props:** a hat that lifts and tilts with the brows, a bubble that appears when the mouth opens,
133
+ and a cheek blush that follows the smile.
134
+ - **Triggers:** blink and mouth-open counters.
135
+ - **Readout:** the live rule values.
136
+
137
+ ## Manual visual test plan
138
+
139
+ Open `/external-face-mesh?rules=1` on the webcam and look at the camera, relaxed, when the head
140
+ appears. That captures the neutral.
141
+
142
+ 1. **At rest**: every bar reads 0. The hat sits on the crown, there is no bubble and no blush.
143
+ 2. **Mouth**: open your mouth wide. With the custom mapping on, the model's jaw opens wider than
144
+ yours (exaggerate 1.4), and the bubble pops up. The mouth counter goes up once per opening, not
145
+ once per frame.
146
+ 3. **Blink**: each blink snaps the lids shut and reopens them softly, and the blink counter goes up
147
+ once.
148
+ 4. **Brows and smile**: raising your brows lifts and tilts the hat. Smiling brings up the blush,
149
+ up to 0.75 opacity.
150
+ 5. **Exaggerate**: at 0.5 everything is subdued; at 2 it is cartoonish but clamped.
151
+ 6. **Auto vs custom**: untick "custom morph mapping". `ExternalFaceMesh` drives the morphs one to
152
+ one, with no exaggeration and no soft reopen.
153
+ 7. **Face loss**: cover the camera. Everything eases back to rest, and the hat comes down.