├── README.md ├── index.bs ├── index.html └── media ├── brow_lowerer_left.png ├── brow_lowerer_right.png ├── cheek_puff_left.png ├── cheek_puff_right.png ├── cheek_raiser_left.png ├── cheek_raiser_right.png ├── cheek_suck_left.png ├── cheek_suck_right.png ├── chin_raiser_bottom.png ├── chin_raiser_top.png ├── dimpler_left.png ├── dimpler_right.png ├── eyes_closed_left.png ├── eyes_closed_right.png ├── eyes_look_down_left.png ├── eyes_look_down_right.png ├── eyes_look_left_left.png ├── eyes_look_left_right.png ├── eyes_look_right_left.png ├── eyes_look_right_right.png ├── eyes_look_up_left.png ├── eyes_look_up_right.png ├── inner_brow_raiser_left.png ├── inner_brow_raiser_right.png ├── jaw_drop.png ├── jaw_sideways_left.png ├── jaw_sideways_right.png ├── jaw_thrust.png ├── lid_tightener_left.png ├── lid_tightener_right.png ├── lip_corner_depressor_left.png ├── lip_corner_depressor_right.png ├── lip_corner_puller_left.png ├── lip_corner_puller_right.png ├── lip_funneler_left_bottom.png ├── lip_funneler_left_top.png ├── lip_funneler_right_bottom.png ├── lip_funneler_right_top.png ├── lip_pressor_left.png ├── lip_pressor_right.png ├── lip_pucker_left.png ├── lip_pucker_right.png ├── lip_stretcher_left.png ├── lip_stretcher_right.png ├── lip_suck_left_bottom.png ├── lip_suck_left_top.png ├── lip_suck_right_bottom.png ├── lip_suck_right_top.png ├── lip_tightener_left.png ├── lip_tightener_right.png ├── lips_toward.png ├── lips_toward_right_top.png ├── lower_lip_depressor_left.png ├── lower_lip_depressor_right.png ├── mouth_left.png ├── mouth_right.png ├── neutral.png ├── nose_wrinkler_left.png ├── nose_wrinkler_right.png ├── outer_brow_raiser_left.png ├── outer_brow_raiser_right.png ├── upper_lid_raiser_left.png ├── upper_lid_raiser_right.png ├── upper_lip_raiser_left.png ├── upper_lip_raiser_leftt.png └── upper_lip_raiser_right.png /README.md: -------------------------------------------------------------------------------- 1 | # WebXR Expression Tracking 2 | 3 | ## Introduction 4 | Expression tracking is a technology that reports a set of expressions of the current user. The expressions report how much a portion of the face or an eye move. They don't report actual positions or other real world data. 5 | 6 | ## Use cases 7 | The main use case is to render the user's face and eyes using an avatar for increased social presence. 8 | This technology will NOT: 9 | * allow rendering of the user's actual face 10 | * give precise information where the user is looking 11 | * allow virtual interaction with the user's face (ie Makeup, hats, etc) 12 | 13 | ## Proposed API shape 14 | This API will define an extensive set of expression and will on a per frame basis, report which ones were detected and how strong they are. 15 | For instance, if the device's eye tracking is functional and the user looks left, it will return that both eyes are looking left. 16 | 17 | ```webidl 18 | enum XRExpression { 19 | "brow_lowerer_left", 20 | "brow_lowerer_right", 21 | "cheek_puff_left", 22 | "cheek_puff_right", 23 | "cheek_raiser_left", 24 | "cheek_raiser_right", 25 | "cheek_suck_left", 26 | "cheek_suck_right", 27 | "chin_raiser_bottom", 28 | "chin_raiser_top", 29 | "dimpler_left", 30 | "dimpler_right", 31 | "eyes_closed_left", 32 | "eyes_closed_right", 33 | "eyes_look_down_left", 34 | "eyes_look_down_right", 35 | "eyes_look_left_left", 36 | "eyes_look_left_right", 37 | "eyes_look_right_left", 38 | "eyes_look_right_right", 39 | "eyes_look_up_left", 40 | "eyes_look_up_right", 41 | "inner_brow_raiser_left", 42 | "inner_brow_raiser_right", 43 | "jaw_drop", 44 | "jaw_sideways_left", 45 | "jaw_sideways_right", 46 | "jaw_thrust", 47 | "lid_tightener_left", 48 | "lid_tightener_right", 49 | "lip_corner_depressor_left", 50 | "lip_corner_depressor_right", 51 | "lip_corner_puller_left", 52 | "lip_corner_puller_right", 53 | "lip_funneler_left_bottom", 54 | "lip_funneler_left_top", 55 | "lip_funneler_right_bottom", 56 | "lip_funneler_right_top", 57 | "lip_pressor_left", 58 | "lip_pressor_right", 59 | "lip_pucker_left", 60 | "lip_pucker_right", 61 | "lip_stretcher_left", 62 | "lip_stretcher_right", 63 | "lip_suck_left_bottom", 64 | "lip_suck_left_top", 65 | "lip_suck_right_bottom", 66 | "lip_suck_right_top", 67 | "lip_tightener_left", 68 | "lip_tightener_right", 69 | "lips_toward", 70 | "lower_lip_depressor_left", 71 | "lower_lip_depressor_right", 72 | "mouth_left", 73 | "mouth_right", 74 | "nose_wrinkler_left", 75 | "nose_wrinkler_right", 76 | "outer_brow_raiser_left", 77 | "outer_brow_raiser_right", 78 | "upper_lid_raiser_left", 79 | "upper_lid_raiser_right", 80 | "upper_lip_raiser_left", 81 | "upper_lip_raiser_right" 82 | }; 83 | 84 | interface XRExpressions { 85 | iterable; 86 | 87 | readonly attribute unsigned long size; 88 | float get(XRExpression key); 89 | }; 90 | 91 | partial interface XRFrame { 92 | readonly attribute XRExpressions? expressions; 93 | } 94 | 95 | ``` 96 | 97 | ## Background/Rationale 98 | This API is inspired by the OpenXR face extensions. 99 | 100 | ## Security/privacy implications 101 | Face tracking exposes sensitive sensor data. 102 | Because of this, the user agent must ask the user for their permission when a session is asking for this feature (much like WebXR and WebXR hand tracking). 103 | In addition, sensitive values such as eye position must be rounded. 104 | -------------------------------------------------------------------------------- /index.bs: -------------------------------------------------------------------------------- 1 |
  2 | Shortname: webxr-expression-tracking
  3 | Title: WebXR Expression Tracking - Level 1
  4 | Group: immersivewebwg
  5 | Status: UD
  6 | 
  7 | ED: https://cabanier.github.io/webxr-expression-tracking-1/
  8 | Repository: cabanier/webxr-expression-tracking-1
  9 | Level: 1
 10 | Mailing List Archives: https://lists.w3.org/Archives/Public/public-immersive-web-wg/
 11 | 
 12 | Editor: Rik Cabanier, Meta, cabanier@meta.com
 13 | 
 14 | Abstract: The WebXR Expression Tracking module expands the WebXR Device API with the functionality to track expressions.
 15 | 
 16 | Status Text: This WebXR Module is designed as a module to be implemented in addition to WebXR Device API, and is originally included in WebXR Device API which was divided into core and modules.
 17 | 
18 | 19 | 20 | 21 | 22 | 23 | 82 | 83 | 84 | 104 | 105 |
106 | spec:html; urlPrefix: https://html.spec.whatwg.org/multipage/
107 |     type: dfn; text: browsing context; url: browsers.html#browsing-context
108 | 
109 | 110 | Introduction {#intro} 111 | ============ 112 | 113 |
114 | This API exposes the expressions of the user's face and the position of their eyes. This can be used to render a more immersive avatar. 115 |
116 | 117 | 118 | Initialization {#initialization} 119 | ============== 120 | 121 | If an application wants to get expressions during an immersive session, the session MUST be requested with an appropriate [=feature descriptor=]. The string "expression-tracking" is introduced 122 | by this module as a new valid [=feature descriptor=] for face expressions. 123 | 124 | The "[=expression-tracking=]" [=feature descriptor=] should only be granted for an {{XRSession}} when its [=XRSession/XR device=] has sensor data to support reporting of expressions. 125 | 126 | Access to expressions {#expression-access} 127 | ===================== 128 | 129 | 130 | Expressions {#expressions} 131 | ----------- 132 | 133 | An expression MUST be one of the {{XRExpression}} types. 134 | A user agent MAY support a subset of {{XRExpression}} types and this subset is allowed to change during an {{XRSession}} 135 | 136 | Following is the list of expressions and their order: 137 |
138 | enum XRExpression {
139 |   "brow_lowerer_left",
140 |   "brow_lowerer_right",
141 |   "cheek_puff_left",
142 |   "cheek_puff_right",
143 |   "cheek_raiser_left",
144 |   "cheek_raiser_right",
145 |   "cheek_suck_left",
146 |   "cheek_suck_right",
147 |   "chin_raiser_bottom",
148 |   "chin_raiser_top",
149 |   "dimpler_left",
150 |   "dimpler_right",
151 |   "eyes_closed_left",
152 |   "eyes_closed_right",
153 |   "eyes_look_down_left",
154 |   "eyes_look_down_right",
155 |   "eyes_look_left_left",
156 |   "eyes_look_left_right",
157 |   "eyes_look_right_left",
158 |   "eyes_look_right_right",
159 |   "eyes_look_up_left",
160 |   "eyes_look_up_right",
161 |   "inner_brow_raiser_left",
162 |   "inner_brow_raiser_right",
163 |   "jaw_drop",
164 |   "jaw_sideways_left",
165 |   "jaw_sideways_right",
166 |   "jaw_thrust",
167 |   "lid_tightener_left",
168 |   "lid_tightener_right",
169 |   "lip_corner_depressor_left",
170 |   "lip_corner_depressor_right",
171 |   "lip_corner_puller_left",
172 |   "lip_corner_puller_right",
173 |   "lip_funneler_left_bottom",
174 |   "lip_funneler_left_top",
175 |   "lip_funneler_right_bottom",
176 |   "lip_funneler_right_top",
177 |   "lip_pressor_left",
178 |   "lip_pressor_right",
179 |   "lip_pucker_left",
180 |   "lip_pucker_right",
181 |   "lip_stretcher_left",
182 |   "lip_stretcher_right",
183 |   "lip_suck_left_bottom",
184 |   "lip_suck_left_top",
185 |   "lip_suck_right_bottom",
186 |   "lip_suck_right_top",
187 |   "lip_tightener_left",
188 |   "lip_tightener_right",
189 |   "lips_toward",
190 |   "lower_lip_depressor_left",
191 |   "lower_lip_depressor_right",
192 |   "mouth_left",
193 |   "mouth_right",
194 |   "nose_wrinkler_left",
195 |   "nose_wrinkler_right",
196 |   "outer_brow_raiser_left",
197 |   "outer_brow_raiser_right",
198 |   "upper_lid_raiser_left",
199 |   "upper_lid_raiser_right",
200 |   "upper_lip_raiser_left",
201 |   "upper_lip_raiser_right"
202 | };
203 | 
204 | 205 | Visual examples of expressions {#expression-visuals} 206 | ------------------------------ 207 | 208 |
209 | 210 |
211 | 212 |
neutral 213 |
214 |
215 | 216 |
217 | 218 |
{{brow_lowerer_left}} 219 |
220 |
221 | 222 |
223 | 224 |
{{brow_lowerer_right}} 225 |
226 |
227 | 228 |
229 | 230 |
{{cheek_puff_left}} 231 |
232 |
233 | 234 |
235 | 236 |
{{cheek_puff_right}} 237 |
238 |
239 | 240 |
241 | 242 |
{{cheek_raiser_left}} 243 |
244 |
245 | 246 |
247 | 248 |
{{cheek_raiser_right}} 249 |
250 |
251 | 252 |
253 | 254 |
{{cheek_suck_left}} 255 |
256 |
257 | 258 |
259 | 260 |
{{cheek_suck_right}} 261 |
262 |
263 | 264 |
265 | 266 |
{{chin_raiser_bottom}} 267 |
268 |
269 | 270 |
271 | 272 |
{{chin_raiser_top}} 273 |
274 |
275 | 276 |
277 | 278 |
{{dimpler_left}} 279 |
280 |
281 | 282 |
283 | 284 |
{{dimpler_right}} 285 |
286 |
287 | 288 |
289 | 290 |
{{eyes_closed_left}} 291 |
292 |
293 | 294 |
295 | 296 |
{{eyes_closed_right}} 297 |
298 |
299 | 300 |
301 | 302 |
{{eyes_look_down_left}} 303 |
304 |
305 | 306 |
307 | 308 |
{{eyes_look_down_right}} 309 |
310 |
311 | 312 |
313 | 314 |
{{eyes_look_left_left}} 315 |
316 |
317 | 318 |
319 | 320 |
{{eyes_look_left_right}} 321 |
322 |
323 | 324 |
325 | 326 |
{{eyes_look_right_left}} 327 |
328 |
329 | 330 |
331 | 332 |
{{eyes_look_right_right}} 333 |
334 |
335 | 336 |
337 | 338 |
{{eyes_look_up_left}} 339 |
340 |
341 | 342 |
343 | 344 |
{{eyes_look_up_right}} 345 |
346 |
347 | 348 |
349 | 350 |
{{inner_brow_raiser_left}} 351 |
352 |
353 | 354 |
355 | 356 |
{{inner_brow_raiser_right}} 357 |
358 |
359 | 360 |
361 | 362 |
{{jaw_drop}} 363 |
364 |
365 | 366 |
367 | 368 |
{{jaw_sideways_left}} 369 |
370 |
371 | 372 |
373 | 374 |
{{jaw_sideways_right}} 375 |
376 |
377 | 378 |
379 | 380 |
{{jaw_thrust}} 381 |
382 |
383 | 384 |
385 | 386 |
{{lid_tightener_left}} 387 |
388 |
389 | 390 |
391 | 392 |
{{lid_tightener_right}} 393 |
394 |
395 | 396 |
397 | 398 |
{{lip_corner_depressor_left}} 399 |
400 |
401 | 402 |
403 | 404 |
{{lip_corner_depressor_right}} 405 |
406 |
407 | 408 |
409 | 410 |
{{lip_corner_puller_left}} 411 |
412 |
413 | 414 |
415 | 416 |
{{lip_corner_puller_right}} 417 |
418 |
419 | 420 |
421 | 422 |
{{lip_funneler_left_bottom}} 423 |
424 |
425 | 426 |
427 | 428 |
{{lip_funneler_left_top}} 429 |
430 |
431 | 432 |
433 | 434 |
{{lip_funneler_right_bottom}} 435 |
436 |
437 | 438 |
439 | 440 |
{{lip_funneler_right_top}} 441 |
442 |
443 | 444 |
445 | 446 |
{{lip_pressor_left}} 447 |
448 |
449 | 450 |
451 | 452 |
{{lip_pressor_right}} 453 |
454 |
455 | 456 |
457 | 458 |
{{lip_pucker_left}} 459 |
460 |
461 | 462 |
463 | 464 |
{{lip_pucker_right}} 465 |
466 |
467 | 468 |
469 | 470 |
{{lip_stretcher_left}} 471 |
472 |
473 | 474 |
475 | 476 |
{{lip_stretcher_right}} 477 |
478 |
479 | 480 |
481 | 482 |
{{lip_suck_left_bottom}} 483 |
484 |
485 | 486 |
487 | 488 |
{{lip_suck_left_top}} 489 |
490 |
491 | 492 |
493 | 494 |
{{lip_suck_right_bottom}} 495 |
496 |
497 | 498 |
499 | 500 |
{{lip_suck_right_top}} 501 |
502 |
503 | 504 |
505 | 506 |
{{lip_tightener_left}} 507 |
508 |
509 | 510 |
511 | 512 |
{{lip_tightener_right}} 513 |
514 |
515 | 516 |
517 | 518 |
{{lips_toward}} 519 |
520 |
521 | 522 |
523 | 524 |
{{lower_lip_depressor_left}} 525 |
526 |
527 | 528 |
529 | 530 |
{{lower_lip_depressor_right}} 531 |
532 |
533 | 534 |
535 | 536 |
{{mouth_left}} 537 |
538 |
539 | 540 |
541 | 542 |
{{mouth_right}} 543 |
544 |
545 | 546 |
547 | 548 |
{{nose_wrinkler_left}} 549 |
550 |
551 | 552 |
553 | 554 |
{{nose_wrinkler_right}} 555 |
556 |
557 | 558 |
559 | 560 |
{{outer_brow_raiser_left}} 561 |
562 |
563 | 564 |
565 | 566 |
{{outer_brow_raiser_right}} 567 |
568 |
569 | 570 |
571 | 572 |
{{upper_lid_raiser_left}} 573 |
574 |
575 | 576 |
577 | 578 |
{{upper_lid_raiser_right}} 579 |
580 |
581 | 582 |
583 | 584 |
{{upper_lip_raiser_left}} 585 |
586 |
587 | 588 |
589 | 590 |
{{upper_lip_raiser_right}} 591 |
592 |
593 | 594 |
595 | 596 | XRExpressions {#xrexpressions-type} 597 | ------------- 598 | 599 |
600 | interface XRExpressions {
601 |     iterable<XRExpression, float>;
602 | 
603 |     readonly attribute unsigned long size;
604 |     float get(XRExpression key);
605 | };
606 | 
607 | 608 | The {{XRExpression}} enum defines the various expressions that could be reported by the user agent. 609 | 610 |
611 | Each {{XRExpressions}} object has a \[[expressions]] internal slot, 612 | which is an [=ordered map=] of pairs with the key of type {{XRExpression}} and the value of type float. Each {{XRExpression}} MUST have a value between 0 and 1 with 0 being undected (or rest pose) and 1 the maximum expression. 613 | 614 | The ordering of the {{[[expressions]]}} internal slot is given by the [=list of expressions=]. 615 | 616 | {{[[expressions]]}} MAY change over the course of a session but MUST stay the same during the {{XRFrame}}. 617 |
618 | 619 |
620 | The [=value pairs to iterate over=] for an {{XRExpressions}} object are the list of [=value pairs=] with the key being 621 | the {{XRExpression}} and the value being the float corresponding to that {{XRExpression}}, ordered by [=list of expressions=]. 622 |
623 | 624 | If the user agent does not support or can report an expression defined, it MUST NOT be reported. 625 | 626 | Frame Loop {#frame-loop} 627 | ========== 628 | 629 | XRFrame {#xrframe-interface} 630 | ------- 631 | 632 |
633 | partial interface XRFrame {
634 |     readonly attribute XRExpressions? expressions;
635 | };
636 | 
637 | 638 | Privacy & Security Considerations {#privacy-security} 639 | ================================= 640 | The WebXR Expression Tracking API is a powerful feature that carries significant privacy risks. 641 | 642 | Since this feature returns new sensor data, the User Agent MUST ask for [=explicit consent=] from the user at session creation time. 643 | 644 | Data returned from this API, MUST NOT be so specific that one can detect individual users. 645 | If the underlying hardware returns data that is too precise, the User Agent MUST anonymize this data 646 | before revealing it through the WebXR Expression Tracking API. 647 | 648 | This API MUST only be supported in XRSessions created with XRSessionMode of {{XRSessionMode/"immersive-vr"}} 649 | or {{XRSessionMode/"immersive-ar"}}. {{XRSessionMode/"inline"}} sessions MUST not support this API. 650 | 651 |
652 | When anonymizing the expression data, the UA can follow these guidelines: 653 | * Noising is discouraged in favour of rounding. 654 | * If the UA uses rounding, each expression must not be rounded independently. 655 | * If noising, the noised data must not reveal any information over time: 656 | - Each new WebXR session in the same [=browsing context=] must use the same noise to make sure that the data cannot be de-noised by creating multiple sessions. 657 | - Each new [=browsing context=] must use a different noise vector. 658 | - Any seed used to initialize the noise must not be predictable. 659 | * Anonymization must be done in a trusted environment. 660 | 661 |
662 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | WebXR Expression Tracking - Level 1 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 72 | 134 | 243 | 272 | 313 | 323 | 333 | 393 | 456 | 646 | 647 |
648 |

649 |

WebXR Expression Tracking - Level 1

650 |

Unofficial Proposal Draft,

651 |
652 | More details about this document 653 |
654 |
655 |
This version: 656 |
https://cabanier.github.io/webxr-expression-tracking-1/ 657 |
Issue Tracking: 658 |
GitHub 659 |
Editor: 660 |
(Meta) 661 |
662 |
663 |
664 |
665 | 666 |
667 |
668 |
669 |

Abstract

670 |

The WebXR Expression Tracking module expands the WebXR Device API with the functionality to track expressions.

671 |
672 |

Status of this document

673 |
674 |

675 |

This WebXR Module is designed as a module to be implemented in addition to WebXR Device API, and is originally included in WebXR Device API which was divided into core and modules.

676 |
677 |
678 | 717 |
718 |

1. Introduction

719 |
This API exposes the expressions of the user’s face and the position of their eyes. This can be used to render a more immersive avatar.
720 |

2. Initialization

721 |

If an application wants to get expressions during an immersive session, the session MUST be requested with an appropriate feature descriptor. The string "expression-tracking" is introduced 722 | by this module as a new valid feature descriptor for face expressions.

723 |

The "expression-tracking" feature descriptor should only be granted for an XRSession when its XR device has sensor data to support reporting of expressions.

724 |

3. Access to expressions

725 |

3.1. Expressions

726 |

An expression MUST be one of the XRExpression types. 727 | A user agent MAY support a subset of XRExpression types and this subset is allowed to change during an XRSession

728 |

Following is the list of expressions and their order:

729 |
enum XRExpression {
 730 |   "brow_lowerer_left",
 731 |   "brow_lowerer_right",
 732 |   "cheek_puff_left",
 733 |   "cheek_puff_right",
 734 |   "cheek_raiser_left",
 735 |   "cheek_raiser_right",
 736 |   "cheek_suck_left",
 737 |   "cheek_suck_right",
 738 |   "chin_raiser_bottom",
 739 |   "chin_raiser_top",
 740 |   "dimpler_left",
 741 |   "dimpler_right",
 742 |   "eyes_closed_left",
 743 |   "eyes_closed_right",
 744 |   "eyes_look_down_left",
 745 |   "eyes_look_down_right",
 746 |   "eyes_look_left_left",
 747 |   "eyes_look_left_right",
 748 |   "eyes_look_right_left",
 749 |   "eyes_look_right_right",
 750 |   "eyes_look_up_left",
 751 |   "eyes_look_up_right",
 752 |   "inner_brow_raiser_left",
 753 |   "inner_brow_raiser_right",
 754 |   "jaw_drop",
 755 |   "jaw_sideways_left",
 756 |   "jaw_sideways_right",
 757 |   "jaw_thrust",
 758 |   "lid_tightener_left",
 759 |   "lid_tightener_right",
 760 |   "lip_corner_depressor_left",
 761 |   "lip_corner_depressor_right",
 762 |   "lip_corner_puller_left",
 763 |   "lip_corner_puller_right",
 764 |   "lip_funneler_left_bottom",
 765 |   "lip_funneler_left_top",
 766 |   "lip_funneler_right_bottom",
 767 |   "lip_funneler_right_top",
 768 |   "lip_pressor_left",
 769 |   "lip_pressor_right",
 770 |   "lip_pucker_left",
 771 |   "lip_pucker_right",
 772 |   "lip_stretcher_left",
 773 |   "lip_stretcher_right",
 774 |   "lip_suck_left_bottom",
 775 |   "lip_suck_left_top",
 776 |   "lip_suck_right_bottom",
 777 |   "lip_suck_right_top",
 778 |   "lip_tightener_left",
 779 |   "lip_tightener_right",
 780 |   "lips_toward",
 781 |   "lower_lip_depressor_left",
 782 |   "lower_lip_depressor_right",
 783 |   "mouth_left",
 784 |   "mouth_right",
 785 |   "nose_wrinkler_left",
 786 |   "nose_wrinkler_right",
 787 |   "outer_brow_raiser_left",
 788 |   "outer_brow_raiser_right",
 789 |   "upper_lid_raiser_left",
 790 |   "upper_lid_raiser_right",
 791 |   "upper_lip_raiser_left",
 792 |   "upper_lip_raiser_right"
 793 | };
 794 | 
795 |

3.2. Visual examples of expressions

796 |
797 |
798 | 799 |
neutral
800 |
801 |
802 | 803 |
brow_lowerer_left
804 |
805 |
806 | 807 |
brow_lowerer_right
808 |
809 |
810 | 811 |
cheek_puff_left
812 |
813 |
814 | 815 |
cheek_puff_right
816 |
817 |
818 | 819 |
cheek_raiser_left
820 |
821 |
822 | 823 |
cheek_raiser_right
824 |
825 |
826 | 827 |
cheek_suck_left
828 |
829 |
830 | 831 |
cheek_suck_right
832 |
833 |
834 | 835 |
chin_raiser_bottom
836 |
837 |
838 | 839 |
chin_raiser_top
840 |
841 |
842 | 843 |
dimpler_left
844 |
845 |
846 | 847 |
dimpler_right
848 |
849 |
850 | 851 |
eyes_closed_left
852 |
853 |
854 | 855 |
eyes_closed_right
856 |
857 |
858 | 859 |
eyes_look_down_left
860 |
861 |
862 | 863 |
eyes_look_down_right
864 |
865 |
866 | 867 |
eyes_look_left_left
868 |
869 |
870 | 871 |
eyes_look_left_right
872 |
873 |
874 | 875 |
eyes_look_right_left
876 |
877 |
878 | 879 |
eyes_look_right_right
880 |
881 |
882 | 883 |
eyes_look_up_left
884 |
885 |
886 | 887 |
eyes_look_up_right
888 |
889 |
890 | 891 |
inner_brow_raiser_left
892 |
893 |
894 | 895 |
inner_brow_raiser_right
896 |
897 |
898 | 899 |
jaw_drop
900 |
901 |
902 | 903 |
jaw_sideways_left
904 |
905 |
906 | 907 |
jaw_sideways_right
908 |
909 |
910 | 911 |
jaw_thrust
912 |
913 |
914 | 915 |
lid_tightener_left
916 |
917 |
918 | 919 |
lid_tightener_right
920 |
921 |
922 | 923 |
lip_corner_depressor_left
924 |
925 |
926 | 927 |
lip_corner_depressor_right
928 |
929 |
930 | 931 |
lip_corner_puller_left
932 |
933 |
934 | 935 |
lip_corner_puller_right
936 |
937 |
938 | 939 |
lip_funneler_left_bottom
940 |
941 |
942 | 943 |
lip_funneler_left_top
944 |
945 |
946 | 947 |
lip_funneler_right_bottom
948 |
949 |
950 | 951 |
lip_funneler_right_top
952 |
953 |
954 | 955 |
lip_pressor_left
956 |
957 |
958 | 959 |
lip_pressor_right
960 |
961 |
962 | 963 |
lip_pucker_left
964 |
965 |
966 | 967 |
lip_pucker_right
968 |
969 |
970 | 971 |
lip_stretcher_left
972 |
973 |
974 | 975 |
lip_stretcher_right
976 |
977 |
978 | 979 |
lip_suck_left_bottom
980 |
981 |
982 | 983 |
lip_suck_left_top
984 |
985 |
986 | 987 |
lip_suck_right_bottom
988 |
989 |
990 | 991 |
lip_suck_right_top
992 |
993 |
994 | 995 |
lip_tightener_left
996 |
997 |
998 | 999 |
lip_tightener_right
1000 |
1001 |
1002 | 1003 |
lips_toward
1004 |
1005 |
1006 | 1007 |
lower_lip_depressor_left
1008 |
1009 |
1010 | 1011 |
lower_lip_depressor_right
1012 |
1013 |
1014 | 1015 |
mouth_left
1016 |
1017 |
1018 | 1019 |
mouth_right
1020 |
1021 |
1022 | 1023 |
nose_wrinkler_left
1024 |
1025 |
1026 | 1027 |
nose_wrinkler_right
1028 |
1029 |
1030 | 1031 |
outer_brow_raiser_left
1032 |
1033 |
1034 | 1035 |
outer_brow_raiser_right
1036 |
1037 |
1038 | 1039 |
upper_lid_raiser_left
1040 |
1041 |
1042 | 1043 |
upper_lid_raiser_right
1044 |
1045 |
1046 | 1047 |
upper_lip_raiser_left
1048 |
1049 |
1050 | 1051 |
upper_lip_raiser_right
1052 |
1053 |
1054 |

3.3. XRExpressions

1055 |
interface XRExpressions {
1056 |     iterable<XRExpression, float>;
1057 | 
1058 |     readonly attribute unsigned long size;
1059 |     float get(XRExpression key);
1060 | };
1061 | 
1062 |

The XRExpression enum defines the various expressions that could be reported by the user agent.

1063 |
1064 | Each XRExpressions object has a [[expressions]] internal slot, 1065 | which is an ordered map of pairs with the key of type XRExpression and the value of type float. Each XRExpression MUST have a value between 0 and 1 with 0 being undected (or rest pose) and 1 the maximum expression. 1066 |

The ordering of the [[expressions]] internal slot is given by the list of expressions.

1067 |

[[expressions]] MAY change over the course of a session but MUST stay the same during the XRFrame.

1068 |
1069 |
The value pairs to iterate over for an XRExpressions object are the list of value pairs with the key being 1070 | the XRExpression and the value being the float corresponding to that XRExpression, ordered by list of expressions.
1071 |

If the user agent does not support or can report an expression defined, it MUST NOT be reported.

1072 |

4. Frame Loop

1073 |

4.1. XRFrame

1074 |
partial interface XRFrame {
1075 |     readonly attribute XRExpressions? expressions;
1076 | };
1077 | 
1078 |

5. Privacy & Security Considerations

1079 | The WebXR Expression Tracking API is a powerful feature that carries significant privacy risks. 1080 |

Since this feature returns new sensor data, the User Agent MUST ask for explicit consent from the user at session creation time.

1081 |

Data returned from this API, MUST NOT be so specific that one can detect individual users. 1082 | If the underlying hardware returns data that is too precise, the User Agent MUST anonymize this data 1083 | before revealing it through the WebXR Expression Tracking API.

1084 |

This API MUST only be supported in XRSessions created with XRSessionMode of "immersive-vr" or "immersive-ar". "inline" sessions MUST not support this API.

1085 |
1086 | When anonymizing the expression data, the UA can follow these guidelines: 1087 |
    1088 |
  • 1089 |

    Noising is discouraged in favour of rounding.

    1090 |
  • 1091 |

    If the UA uses rounding, each expression must not be rounded independently.

    1092 |
  • 1093 |

    If noising, the noised data must not reveal any information over time:

    1094 |
      1095 |
    • 1096 |

      Each new WebXR session in the same browsing context must use the same noise to make sure that the data cannot be de-noised by creating multiple sessions.

      1097 |
    • 1098 |

      Each new browsing context must use a different noise vector.

      1099 |
    • 1100 |

      Any seed used to initialize the noise must not be predictable.

      1101 |
    1102 |
  • 1103 |

    Anonymization must be done in a trusted environment.

    1104 |
1105 |
1106 |
1107 |
1108 |

Conformance

1109 |

Document conventions

1110 |

Conformance requirements are expressed 1111 | with a combination of descriptive assertions 1112 | and RFC 2119 terminology. 1113 | The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” 1114 | in the normative parts of this document 1115 | are to be interpreted as described in RFC 2119. 1116 | However, for readability, 1117 | these words do not appear in all uppercase letters in this specification.

1118 |

All of the text of this specification is normative 1119 | except sections explicitly marked as non-normative, examples, and notes. [RFC2119]

1120 |

Examples in this specification are introduced with the words “for example” 1121 | or are set apart from the normative text 1122 | with class="example", 1123 | like this:

1124 |
1125 | 1126 |

This is an example of an informative example.

1127 |
1128 |

Informative notes begin with the word “Note” 1129 | and are set apart from the normative text 1130 | with class="note", 1131 | like this:

1132 |

Note, this is an informative note.

1133 |

Conformant Algorithms

1134 |

Requirements phrased in the imperative as part of algorithms 1135 | (such as "strip any leading space characters" 1136 | or "return false and abort these steps") 1137 | are to be interpreted with the meaning of the key word 1138 | ("must", "should", "may", etc) 1139 | used in introducing the algorithm.

1140 |

Conformance requirements phrased as algorithms or specific steps 1141 | can be implemented in any manner, 1142 | so long as the end result is equivalent. 1143 | In particular, the algorithms defined in this specification 1144 | are intended to be easy to understand 1145 | and are not intended to be performant. 1146 | Implementers are encouraged to optimize.

1147 |
1148 | 1149 |

Index

1150 |

Terms defined by this specification

1151 | 1224 | 1230 | 1236 | 1242 | 1248 | 1254 | 1260 | 1266 | 1272 | 1279 | 1286 | 1292 | 1298 | 1304 | 1310 |

Terms defined by reference

1311 | 1347 |

References

1348 |

Normative References

1349 |
1350 |
[INFRA] 1351 |
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/ 1352 |
[RFC2119] 1353 |
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. March 1997. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119 1354 |
[WEBIDL] 1355 |
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/ 1356 |
[WEBXR] 1357 |
Brandon Jones; Manish Goregaokar; Rik Cabanier. WebXR Device API. URL: https://immersive-web.github.io/webxr/ 1358 |
[WEBXR-AR-MODULE-1] 1359 |
Brandon Jones; Manish Goregaokar; Rik Cabanier. WebXR Augmented Reality Module - Level 1. URL: https://immersive-web.github.io/webxr-ar-module/ 1360 |
1361 |

Informative References

1362 |
1363 |
[HTML] 1364 |
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/ 1365 |
1366 |

IDL Index

1367 |
enum XRExpression {
1368 |   "brow_lowerer_left",
1369 |   "brow_lowerer_right",
1370 |   "cheek_puff_left",
1371 |   "cheek_puff_right",
1372 |   "cheek_raiser_left",
1373 |   "cheek_raiser_right",
1374 |   "cheek_suck_left",
1375 |   "cheek_suck_right",
1376 |   "chin_raiser_bottom",
1377 |   "chin_raiser_top",
1378 |   "dimpler_left",
1379 |   "dimpler_right",
1380 |   "eyes_closed_left",
1381 |   "eyes_closed_right",
1382 |   "eyes_look_down_left",
1383 |   "eyes_look_down_right",
1384 |   "eyes_look_left_left",
1385 |   "eyes_look_left_right",
1386 |   "eyes_look_right_left",
1387 |   "eyes_look_right_right",
1388 |   "eyes_look_up_left",
1389 |   "eyes_look_up_right",
1390 |   "inner_brow_raiser_left",
1391 |   "inner_brow_raiser_right",
1392 |   "jaw_drop",
1393 |   "jaw_sideways_left",
1394 |   "jaw_sideways_right",
1395 |   "jaw_thrust",
1396 |   "lid_tightener_left",
1397 |   "lid_tightener_right",
1398 |   "lip_corner_depressor_left",
1399 |   "lip_corner_depressor_right",
1400 |   "lip_corner_puller_left",
1401 |   "lip_corner_puller_right",
1402 |   "lip_funneler_left_bottom",
1403 |   "lip_funneler_left_top",
1404 |   "lip_funneler_right_bottom",
1405 |   "lip_funneler_right_top",
1406 |   "lip_pressor_left",
1407 |   "lip_pressor_right",
1408 |   "lip_pucker_left",
1409 |   "lip_pucker_right",
1410 |   "lip_stretcher_left",
1411 |   "lip_stretcher_right",
1412 |   "lip_suck_left_bottom",
1413 |   "lip_suck_left_top",
1414 |   "lip_suck_right_bottom",
1415 |   "lip_suck_right_top",
1416 |   "lip_tightener_left",
1417 |   "lip_tightener_right",
1418 |   "lips_toward",
1419 |   "lower_lip_depressor_left",
1420 |   "lower_lip_depressor_right",
1421 |   "mouth_left",
1422 |   "mouth_right",
1423 |   "nose_wrinkler_left",
1424 |   "nose_wrinkler_right",
1425 |   "outer_brow_raiser_left",
1426 |   "outer_brow_raiser_right",
1427 |   "upper_lid_raiser_left",
1428 |   "upper_lid_raiser_right",
1429 |   "upper_lip_raiser_left",
1430 |   "upper_lip_raiser_right"
1431 | };
1432 | 
1433 | interface XRExpressions {
1434 |     iterable<XRExpression, float>;
1435 | 
1436 |     readonly attribute unsigned long size;
1437 |     float get(XRExpression key);
1438 | };
1439 | 
1440 | partial interface XRFrame {
1441 |     readonly attribute XRExpressions? expressions;
1442 | };
1443 | 
1444 | 
1445 | 1451 | 1457 | 1464 | 1470 | 1476 | 1482 | 1488 | 1494 | 1500 | 1506 | 1512 | 1518 | 1524 | 1530 | 1536 | 1542 | 1548 | 1554 | 1560 | 1566 | 1572 | 1578 | 1584 | 1590 | 1596 | 1602 | 1608 | 1614 | 1620 | 1626 | 1632 | 1638 | 1644 | 1650 | 1656 | 1662 | 1668 | 1674 | 1680 | 1686 | 1692 | 1698 | 1704 | 1710 | 1716 | 1722 | 1728 | 1734 | 1740 | 1746 | 1752 | 1758 | 1764 | 1770 | 1776 | 1782 | 1788 | 1794 | 1800 | 1806 | 1812 | 1818 | 1824 | 1830 | 1836 | 1842 | 1849 | 1855 | -------------------------------------------------------------------------------- /media/brow_lowerer_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/brow_lowerer_left.png -------------------------------------------------------------------------------- /media/brow_lowerer_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/brow_lowerer_right.png -------------------------------------------------------------------------------- /media/cheek_puff_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/cheek_puff_left.png -------------------------------------------------------------------------------- /media/cheek_puff_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/cheek_puff_right.png -------------------------------------------------------------------------------- /media/cheek_raiser_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/cheek_raiser_left.png -------------------------------------------------------------------------------- /media/cheek_raiser_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/cheek_raiser_right.png -------------------------------------------------------------------------------- /media/cheek_suck_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/cheek_suck_left.png -------------------------------------------------------------------------------- /media/cheek_suck_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/cheek_suck_right.png -------------------------------------------------------------------------------- /media/chin_raiser_bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/chin_raiser_bottom.png -------------------------------------------------------------------------------- /media/chin_raiser_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/chin_raiser_top.png -------------------------------------------------------------------------------- /media/dimpler_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/dimpler_left.png -------------------------------------------------------------------------------- /media/dimpler_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/dimpler_right.png -------------------------------------------------------------------------------- /media/eyes_closed_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/eyes_closed_left.png -------------------------------------------------------------------------------- /media/eyes_closed_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/eyes_closed_right.png -------------------------------------------------------------------------------- /media/eyes_look_down_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/eyes_look_down_left.png -------------------------------------------------------------------------------- /media/eyes_look_down_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/eyes_look_down_right.png -------------------------------------------------------------------------------- /media/eyes_look_left_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/eyes_look_left_left.png -------------------------------------------------------------------------------- /media/eyes_look_left_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/eyes_look_left_right.png -------------------------------------------------------------------------------- /media/eyes_look_right_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/eyes_look_right_left.png -------------------------------------------------------------------------------- /media/eyes_look_right_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/eyes_look_right_right.png -------------------------------------------------------------------------------- /media/eyes_look_up_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/eyes_look_up_left.png -------------------------------------------------------------------------------- /media/eyes_look_up_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/eyes_look_up_right.png -------------------------------------------------------------------------------- /media/inner_brow_raiser_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/inner_brow_raiser_left.png -------------------------------------------------------------------------------- /media/inner_brow_raiser_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/inner_brow_raiser_right.png -------------------------------------------------------------------------------- /media/jaw_drop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/jaw_drop.png -------------------------------------------------------------------------------- /media/jaw_sideways_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/jaw_sideways_left.png -------------------------------------------------------------------------------- /media/jaw_sideways_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/jaw_sideways_right.png -------------------------------------------------------------------------------- /media/jaw_thrust.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/jaw_thrust.png -------------------------------------------------------------------------------- /media/lid_tightener_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/lid_tightener_left.png -------------------------------------------------------------------------------- /media/lid_tightener_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/lid_tightener_right.png -------------------------------------------------------------------------------- /media/lip_corner_depressor_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/lip_corner_depressor_left.png -------------------------------------------------------------------------------- /media/lip_corner_depressor_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/lip_corner_depressor_right.png -------------------------------------------------------------------------------- /media/lip_corner_puller_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/lip_corner_puller_left.png -------------------------------------------------------------------------------- /media/lip_corner_puller_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/lip_corner_puller_right.png -------------------------------------------------------------------------------- /media/lip_funneler_left_bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/lip_funneler_left_bottom.png -------------------------------------------------------------------------------- /media/lip_funneler_left_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/lip_funneler_left_top.png -------------------------------------------------------------------------------- /media/lip_funneler_right_bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/lip_funneler_right_bottom.png -------------------------------------------------------------------------------- /media/lip_funneler_right_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/lip_funneler_right_top.png -------------------------------------------------------------------------------- /media/lip_pressor_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/lip_pressor_left.png -------------------------------------------------------------------------------- /media/lip_pressor_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/lip_pressor_right.png -------------------------------------------------------------------------------- /media/lip_pucker_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/lip_pucker_left.png -------------------------------------------------------------------------------- /media/lip_pucker_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/lip_pucker_right.png -------------------------------------------------------------------------------- /media/lip_stretcher_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/lip_stretcher_left.png -------------------------------------------------------------------------------- /media/lip_stretcher_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/lip_stretcher_right.png -------------------------------------------------------------------------------- /media/lip_suck_left_bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/lip_suck_left_bottom.png -------------------------------------------------------------------------------- /media/lip_suck_left_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/lip_suck_left_top.png -------------------------------------------------------------------------------- /media/lip_suck_right_bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/lip_suck_right_bottom.png -------------------------------------------------------------------------------- /media/lip_suck_right_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/lip_suck_right_top.png -------------------------------------------------------------------------------- /media/lip_tightener_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/lip_tightener_left.png -------------------------------------------------------------------------------- /media/lip_tightener_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/lip_tightener_right.png -------------------------------------------------------------------------------- /media/lips_toward.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/lips_toward.png -------------------------------------------------------------------------------- /media/lips_toward_right_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/lips_toward_right_top.png -------------------------------------------------------------------------------- /media/lower_lip_depressor_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/lower_lip_depressor_left.png -------------------------------------------------------------------------------- /media/lower_lip_depressor_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/lower_lip_depressor_right.png -------------------------------------------------------------------------------- /media/mouth_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/mouth_left.png -------------------------------------------------------------------------------- /media/mouth_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/mouth_right.png -------------------------------------------------------------------------------- /media/neutral.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/neutral.png -------------------------------------------------------------------------------- /media/nose_wrinkler_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/nose_wrinkler_left.png -------------------------------------------------------------------------------- /media/nose_wrinkler_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/nose_wrinkler_right.png -------------------------------------------------------------------------------- /media/outer_brow_raiser_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/outer_brow_raiser_left.png -------------------------------------------------------------------------------- /media/outer_brow_raiser_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/outer_brow_raiser_right.png -------------------------------------------------------------------------------- /media/upper_lid_raiser_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/upper_lid_raiser_left.png -------------------------------------------------------------------------------- /media/upper_lid_raiser_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/upper_lid_raiser_right.png -------------------------------------------------------------------------------- /media/upper_lip_raiser_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/upper_lip_raiser_left.png -------------------------------------------------------------------------------- /media/upper_lip_raiser_leftt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/upper_lip_raiser_leftt.png -------------------------------------------------------------------------------- /media/upper_lip_raiser_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cabanier/webxr-face-tracking-1/5d4412e454d68f8f9dbb31b509e5ffe769ffa739/media/upper_lip_raiser_right.png --------------------------------------------------------------------------------