@react-three/drei
Version:
useful add-ons for react-three-fiber
1,353 lines (1,325 loc) • 132 kB
JavaScript
import * as React from 'react';
import * as THREE from 'three';
import { useThree } from '@react-three/fiber';
import { Line } from '../core/Line.js';
/* eslint react-hooks/exhaustive-deps: 1 */
const defaultLookAt = /* @__PURE__ */new THREE.Vector3(0, 0, -1);
const normal = /* @__PURE__ */function () {
const a = new THREE.Vector3();
const b = new THREE.Vector3();
const c = new THREE.Vector3();
const ab = new THREE.Vector3();
const ac = new THREE.Vector3();
return function (v1, v2, v3, v) {
a.copy(v1);
b.copy(v2);
c.copy(v3);
ab.copy(b).sub(a);
ac.copy(c).sub(a);
return v.crossVectors(ac, ab).normalize();
};
}();
function mean(v1, v2) {
return v1.clone().add(v2).multiplyScalar(0.5);
}
const Facemesh = /* @__PURE__ */React.forwardRef(({
points = FacemeshDatas.SAMPLE_FACELANDMARKER_RESULT.faceLandmarks[0],
face,
facialTransformationMatrix,
faceBlendshapes,
offset,
offsetScalar = 80,
width,
height,
depth = 1,
verticalTri = [159, 386, 152],
origin,
eyes = true,
eyesAsOrigin = false,
debug = false,
children,
...props
}, fref) => {
var _meshRef$current3;
if (face) {
points = face.keypoints;
console.warn('Facemesh `face` prop is deprecated: use `points` instead');
}
const offsetRef = React.useRef(null);
const scaleRef = React.useRef(null);
const originRef = React.useRef(null);
const outerRef = React.useRef(null);
const meshRef = React.useRef(null);
const eyeRightRef = React.useRef(null);
const eyeLeftRef = React.useRef(null);
const [sightDir] = React.useState(() => new THREE.Vector3());
const [transform] = React.useState(() => new THREE.Object3D());
const [sightDirQuaternion] = React.useState(() => new THREE.Quaternion());
const [_origin] = React.useState(() => new THREE.Vector3());
const {
invalidate
} = useThree();
React.useEffect(() => {
var _meshRef$current;
(_meshRef$current = meshRef.current) == null || _meshRef$current.geometry.setIndex(FacemeshDatas.TRIANGULATION);
}, []);
const [bboxSize] = React.useState(() => new THREE.Vector3());
React.useEffect(() => {
var _meshRef$current2, _outerRef$current;
const faceGeometry = (_meshRef$current2 = meshRef.current) == null ? void 0 : _meshRef$current2.geometry;
if (!faceGeometry) return;
faceGeometry.setFromPoints(points);
faceGeometry.setDrawRange(0, FacemeshDatas.TRIANGULATION.length);
//
// A. compute sightDir vector
//
// - either from `facialTransformationMatrix` if available
// - or from `verticalTri`
//
if (facialTransformationMatrix) {
// from facialTransformationMatrix
transform.matrix.fromArray(facialTransformationMatrix.data);
transform.matrix.decompose(transform.position, transform.quaternion, transform.scale);
// Rotation: y and z axes are inverted
transform.rotation.y *= -1;
transform.rotation.z *= -1;
sightDirQuaternion.setFromEuler(transform.rotation);
// Offset: y and z axes are inverted
if (offset) {
var _offsetRef$current;
transform.position.y *= -1;
transform.position.z *= -1;
(_offsetRef$current = offsetRef.current) == null || _offsetRef$current.position.copy(transform.position.divideScalar(offsetScalar));
} else {
var _offsetRef$current2;
(_offsetRef$current2 = offsetRef.current) == null || _offsetRef$current2.position.set(0, 0, 0); // reset
}
} else {
// normal to verticalTri
normal(points[verticalTri[0]], points[verticalTri[1]], points[verticalTri[2]], sightDir);
sightDirQuaternion.setFromUnitVectors(defaultLookAt, sightDir);
}
const sightDirQuaternionInverse = sightDirQuaternion.clone().invert();
//
// B. geometry (straightened)
//
// 1. center (before rotate back)
faceGeometry.computeBoundingBox();
if (debug) invalidate(); // invalidate to force re-render for box3Helper (after .computeBoundingBox())
faceGeometry.center();
// 2. rotate back + rotate outerRef (once 1.)
faceGeometry.applyQuaternion(sightDirQuaternionInverse);
(_outerRef$current = outerRef.current) == null || _outerRef$current.setRotationFromQuaternion(sightDirQuaternion);
// 3. 👀 eyes
if (eyes) {
if (!faceBlendshapes) {
console.warn('Facemesh `eyes` option only works if `faceBlendshapes` is provided: skipping.');
} else {
if (eyeRightRef.current && eyeLeftRef.current && originRef.current) {
if (eyesAsOrigin) {
// compute the middle of the 2 eyes as the `origin`
const eyeRightSphere = eyeRightRef.current._computeSphere(faceGeometry);
const eyeLeftSphere = eyeLeftRef.current._computeSphere(faceGeometry);
const eyesCenter = mean(eyeRightSphere.center, eyeLeftSphere.center);
origin = eyesCenter.negate(); // eslint-disable-line react-hooks/exhaustive-deps
eyeRightRef.current._update(faceGeometry, faceBlendshapes, eyeRightSphere);
eyeLeftRef.current._update(faceGeometry, faceBlendshapes, eyeLeftSphere);
} else {
eyeRightRef.current._update(faceGeometry, faceBlendshapes);
eyeLeftRef.current._update(faceGeometry, faceBlendshapes);
}
}
}
}
// 3. origin
if (originRef.current) {
if (origin !== undefined) {
if (typeof origin === 'number') {
const position = faceGeometry.getAttribute('position');
_origin.set(-position.getX(origin), -position.getY(origin), -position.getZ(origin));
} else if (origin.isVector3) {
_origin.copy(origin);
}
} else {
_origin.setScalar(0);
}
originRef.current.position.copy(_origin);
}
// 4. re-scale
if (scaleRef.current) {
let scale = 1;
if (width || height || depth) {
faceGeometry.boundingBox.getSize(bboxSize);
if (width) scale = width / bboxSize.x; // fit in width
if (height) scale = height / bboxSize.y; // fit in height
if (depth) scale = depth / bboxSize.z; // fit in depth
}
scaleRef.current.scale.setScalar(scale !== 1 ? scale : 1);
}
faceGeometry.computeVertexNormals();
faceGeometry.attributes.position.needsUpdate = true;
}, [points, facialTransformationMatrix, faceBlendshapes, transform, offset, offsetScalar, width, height, depth, verticalTri, origin, eyes, debug, invalidate, sightDir, sightDirQuaternion, bboxSize, _origin]);
//
// API
//
const api = React.useMemo(() => ({
outerRef,
meshRef,
eyeRightRef,
eyeLeftRef
}), []);
React.useImperativeHandle(fref, () => api, [api]);
const [meshBboxSize] = React.useState(() => new THREE.Vector3());
const bbox = (_meshRef$current3 = meshRef.current) == null ? void 0 : _meshRef$current3.geometry.boundingBox;
const one = (bbox == null ? void 0 : bbox.getSize(meshBboxSize).z) || 1;
return /*#__PURE__*/React.createElement("group", props, /*#__PURE__*/React.createElement("group", {
ref: offsetRef
}, /*#__PURE__*/React.createElement("group", {
ref: outerRef
}, /*#__PURE__*/React.createElement("group", {
ref: scaleRef
}, debug ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("axesHelper", {
args: [one]
}), /*#__PURE__*/React.createElement(Line, {
points: [[0, 0, 0], [0, 0, -one]],
color: 0x00ffff
})) : null, /*#__PURE__*/React.createElement("group", {
ref: originRef
}, eyes && faceBlendshapes && /*#__PURE__*/React.createElement("group", {
name: "eyes"
}, /*#__PURE__*/React.createElement(FacemeshEye, {
side: "left",
ref: eyeRightRef,
debug: debug
}), /*#__PURE__*/React.createElement(FacemeshEye, {
side: "right",
ref: eyeLeftRef,
debug: debug
})), /*#__PURE__*/React.createElement("mesh", {
ref: meshRef,
name: "face"
}, children, debug ? /*#__PURE__*/React.createElement(React.Fragment, null, bbox && /*#__PURE__*/React.createElement("box3Helper", {
args: [bbox]
})) : null))))));
});
//
// 👁️ FacemeshEye
//
const FacemeshEyeDefaults = {
contourLandmarks: {
right: [33, 133, 159, 145, 153],
left: [263, 362, 386, 374, 380]
},
blendshapes: {
right: [14, 16, 18, 12],
// lookIn,lookOut, lookUp,lookDown
left: [13, 15, 17, 11] // lookIn,lookOut, lookUp,lookDown
},
color: {
right: 'red',
left: '#00ff00'
},
fov: {
horizontal: 100,
vertical: 90
}
};
const FacemeshEye = /* @__PURE__ */React.forwardRef(({
side,
debug = true
}, fref) => {
const eyeMeshRef = React.useRef(null);
const irisDirRef = React.useRef(null);
//
// _computeSphere()
//
// Compute eye's sphere .position and .radius
//
const [sphere] = React.useState(() => new THREE.Sphere());
const _computeSphere = React.useCallback(faceGeometry => {
const position = faceGeometry.getAttribute('position');
// get some eye contour landmarks points (from geometry)
const eyeContourLandmarks = FacemeshEyeDefaults.contourLandmarks[side];
const eyeContourPoints = eyeContourLandmarks.map(i => new THREE.Vector3(position.getX(i), position.getY(i), position.getZ(i))); // prettier-ignore
// compute center (centroid from eyeContourPoints)
sphere.center.set(0, 0, 0);
eyeContourPoints.forEach(v => sphere.center.add(v));
sphere.center.divideScalar(eyeContourPoints.length);
// radius (eye half-width)
sphere.radius = eyeContourPoints[0].sub(eyeContourPoints[1]).length() / 2;
return sphere;
}, [sphere, side]);
//
// _update()
//
// Update:
// - A. eye's mesh (according to sphere)
// - B. iris direction (according to "look*" blendshapes)
//
const [rotation] = React.useState(() => new THREE.Euler());
const _update = React.useCallback((faceGeometry, faceBlendshapes, sphere) => {
// A.
if (eyeMeshRef.current) {
var _sphere;
(_sphere = sphere) !== null && _sphere !== void 0 ? _sphere : sphere = _computeSphere(faceGeometry); // compute sphere dims (if not passed)
eyeMeshRef.current.position.copy(sphere.center);
eyeMeshRef.current.scale.setScalar(sphere.radius);
}
// B.
if (faceBlendshapes && irisDirRef.current) {
const blendshapes = FacemeshEyeDefaults.blendshapes[side];
const lookIn = faceBlendshapes.categories[blendshapes[0]].score;
const lookOut = faceBlendshapes.categories[blendshapes[1]].score;
const lookUp = faceBlendshapes.categories[blendshapes[2]].score;
const lookDown = faceBlendshapes.categories[blendshapes[3]].score;
const hfov = FacemeshEyeDefaults.fov.horizontal * THREE.MathUtils.DEG2RAD;
const vfov = FacemeshEyeDefaults.fov.vertical * THREE.MathUtils.DEG2RAD;
const rx = hfov * 0.5 * (lookDown - lookUp);
const ry = vfov * 0.5 * (lookIn - lookOut) * (side === 'left' ? 1 : -1);
rotation.set(rx, ry, 0);
irisDirRef.current.setRotationFromEuler(rotation);
}
}, [_computeSphere, side, rotation]);
//
// API
//
const api = React.useMemo(() => ({
eyeMeshRef: eyeMeshRef,
irisDirRef: irisDirRef,
_computeSphere,
_update
}), [_computeSphere, _update]);
React.useImperativeHandle(fref, () => api, [api]);
const color = FacemeshEyeDefaults.color[side];
return /*#__PURE__*/React.createElement("group", null, /*#__PURE__*/React.createElement("group", {
ref: eyeMeshRef
}, debug && /*#__PURE__*/React.createElement("axesHelper", null), /*#__PURE__*/React.createElement("group", {
ref: irisDirRef
}, /*#__PURE__*/React.createElement(React.Fragment, null, debug && /*#__PURE__*/React.createElement(Line, {
points: [[0, 0, 0], [0, 0, -2]],
lineWidth: 1,
color: color
})))));
});
//
// Sample datas
//
const FacemeshDatas = {
// Extracted from: https://github.com/tensorflow/tfjs-models/blob/a8f500809f5afe38feea27870c77e7ba03a6ece4/face-landmarks-detection/demos/shared/triangulation.js
// prettier-ignore
TRIANGULATION: [127, 34, 139, 11, 0, 37, 232, 231, 120, 72, 37, 39, 128, 121, 47, 232, 121, 128, 104, 69, 67, 175, 171, 148, 157, 154, 155, 118, 50, 101, 73, 39, 40, 9, 151, 108, 48, 115, 131, 194, 204, 211, 74, 40, 185, 80, 42, 183, 40, 92, 186, 230, 229, 118, 202, 212, 214, 83, 18, 17, 76, 61, 146, 160, 29, 30, 56, 157, 173, 106, 204, 194, 135, 214, 192, 203, 165, 98, 21, 71, 68, 51, 45, 4, 144, 24, 23, 77, 146, 91, 205, 50, 187, 201, 200, 18, 91, 106, 182, 90, 91, 181, 85, 84, 17, 206, 203, 36, 148, 171, 140, 92, 40, 39, 193, 189, 244, 159, 158, 28, 247, 246, 161, 236, 3, 196, 54, 68, 104, 193, 168, 8, 117, 228, 31, 189, 193, 55, 98, 97, 99, 126, 47, 100, 166, 79, 218, 155, 154, 26, 209, 49, 131, 135, 136, 150, 47, 126, 217, 223, 52, 53, 45, 51, 134, 211, 170, 140, 67, 69, 108, 43, 106, 91, 230, 119, 120, 226, 130, 247, 63, 53, 52, 238, 20, 242, 46, 70, 156, 78, 62, 96, 46, 53, 63, 143, 34, 227, 173, 155, 133, 123, 117, 111, 44, 125, 19, 236, 134, 51, 216, 206, 205, 154, 153, 22, 39, 37, 167, 200, 201, 208, 36, 142, 100, 57, 212, 202, 20, 60, 99, 28, 158, 157, 35, 226, 113, 160, 159, 27, 204, 202, 210, 113, 225, 46, 43, 202, 204, 62, 76, 77, 137, 123, 116, 41, 38, 72, 203, 129, 142, 64, 98, 240, 49, 102, 64, 41, 73, 74, 212, 216, 207, 42, 74, 184, 169, 170, 211, 170, 149, 176, 105, 66, 69, 122, 6, 168, 123, 147, 187, 96, 77, 90, 65, 55, 107, 89, 90, 180, 101, 100, 120, 63, 105, 104, 93, 137, 227, 15, 86, 85, 129, 102, 49, 14, 87, 86, 55, 8, 9, 100, 47, 121, 145, 23, 22, 88, 89, 179, 6, 122, 196, 88, 95, 96, 138, 172, 136, 215, 58, 172, 115, 48, 219, 42, 80, 81, 195, 3, 51, 43, 146, 61, 171, 175, 199, 81, 82, 38, 53, 46, 225, 144, 163, 110, 246, 33, 7, 52, 65, 66, 229, 228, 117, 34, 127, 234, 107, 108, 69, 109, 108, 151, 48, 64, 235, 62, 78, 191, 129, 209, 126, 111, 35, 143, 163, 161, 246, 117, 123, 50, 222, 65, 52, 19, 125, 141, 221, 55, 65, 3, 195, 197, 25, 7, 33, 220, 237, 44, 70, 71, 139, 122, 193, 245, 247, 130, 33, 71, 21, 162, 153, 158, 159, 170, 169, 150, 188, 174, 196, 216, 186, 92, 144, 160, 161, 2, 97, 167, 141, 125, 241, 164, 167, 37, 72, 38, 12, 145, 159, 160, 38, 82, 13, 63, 68, 71, 226, 35, 111, 158, 153, 154, 101, 50, 205, 206, 92, 165, 209, 198, 217, 165, 167, 97, 220, 115, 218, 133, 112, 243, 239, 238, 241, 214, 135, 169, 190, 173, 133, 171, 208, 32, 125, 44, 237, 86, 87, 178, 85, 86, 179, 84, 85, 180, 83, 84, 181, 201, 83, 182, 137, 93, 132, 76, 62, 183, 61, 76, 184, 57, 61, 185, 212, 57, 186, 214, 207, 187, 34, 143, 156, 79, 239, 237, 123, 137, 177, 44, 1, 4, 201, 194, 32, 64, 102, 129, 213, 215, 138, 59, 166, 219, 242, 99, 97, 2, 94, 141, 75, 59, 235, 24, 110, 228, 25, 130, 226, 23, 24, 229, 22, 23, 230, 26, 22, 231, 112, 26, 232, 189, 190, 243, 221, 56, 190, 28, 56, 221, 27, 28, 222, 29, 27, 223, 30, 29, 224, 247, 30, 225, 238, 79, 20, 166, 59, 75, 60, 75, 240, 147, 177, 215, 20, 79, 166, 187, 147, 213, 112, 233, 244, 233, 128, 245, 128, 114, 188, 114, 217, 174, 131, 115, 220, 217, 198, 236, 198, 131, 134, 177, 132, 58, 143, 35, 124, 110, 163, 7, 228, 110, 25, 356, 389, 368, 11, 302, 267, 452, 350, 349, 302, 303, 269, 357, 343, 277, 452, 453, 357, 333, 332, 297, 175, 152, 377, 384, 398, 382, 347, 348, 330, 303, 304, 270, 9, 336, 337, 278, 279, 360, 418, 262, 431, 304, 408, 409, 310, 415, 407, 270, 409, 410, 450, 348, 347, 422, 430, 434, 313, 314, 17, 306, 307, 375, 387, 388, 260, 286, 414, 398, 335, 406, 418, 364, 367, 416, 423, 358, 327, 251, 284, 298, 281, 5, 4, 373, 374, 253, 307, 320, 321, 425, 427, 411, 421, 313, 18, 321, 405, 406, 320, 404, 405, 315, 16, 17, 426, 425, 266, 377, 400, 369, 322, 391, 269, 417, 465, 464, 386, 257, 258, 466, 260, 388, 456, 399, 419, 284, 332, 333, 417, 285, 8, 346, 340, 261, 413, 441, 285, 327, 460, 328, 355, 371, 329, 392, 439, 438, 382, 341, 256, 429, 420, 360, 364, 394, 379, 277, 343, 437, 443, 444, 283, 275, 440, 363, 431, 262, 369, 297, 338, 337, 273, 375, 321, 450, 451, 349, 446, 342, 467, 293, 334, 282, 458, 461, 462, 276, 353, 383, 308, 324, 325, 276, 300, 293, 372, 345, 447, 382, 398, 362, 352, 345, 340, 274, 1, 19, 456, 248, 281, 436, 427, 425, 381, 256, 252, 269, 391, 393, 200, 199, 428, 266, 330, 329, 287, 273, 422, 250, 462, 328, 258, 286, 384, 265, 353, 342, 387, 259, 257, 424, 431, 430, 342, 353, 276, 273, 335, 424, 292, 325, 307, 366, 447, 345, 271, 303, 302, 423, 266, 371, 294, 455, 460, 279, 278, 294, 271, 272, 304, 432, 434, 427, 272, 407, 408, 394, 430, 431, 395, 369, 400, 334, 333, 299, 351, 417, 168, 352, 280, 411, 325, 319, 320, 295, 296, 336, 319, 403, 404, 330, 348, 349, 293, 298, 333, 323, 454, 447, 15, 16, 315, 358, 429, 279, 14, 15, 316, 285, 336, 9, 329, 349, 350, 374, 380, 252, 318, 402, 403, 6, 197, 419, 318, 319, 325, 367, 364, 365, 435, 367, 397, 344, 438, 439, 272, 271, 311, 195, 5, 281, 273, 287, 291, 396, 428, 199, 311, 271, 268, 283, 444, 445, 373, 254, 339, 263, 466, 249, 282, 334, 296, 449, 347, 346, 264, 447, 454, 336, 296, 299, 338, 10, 151, 278, 439, 455, 292, 407, 415, 358, 371, 355, 340, 345, 372, 390, 249, 466, 346, 347, 280, 442, 443, 282, 19, 94, 370, 441, 442, 295, 248, 419, 197, 263, 255, 359, 440, 275, 274, 300, 383, 368, 351, 412, 465, 263, 467, 466, 301, 368, 389, 380, 374, 386, 395, 378, 379, 412, 351, 419, 436, 426, 322, 373, 390, 388, 2, 164, 393, 370, 462, 461, 164, 0, 267, 302, 11, 12, 374, 373, 387, 268, 12, 13, 293, 300, 301, 446, 261, 340, 385, 384, 381, 330, 266, 425, 426, 423, 391, 429, 355, 437, 391, 327, 326, 440, 457, 438, 341, 382, 362, 459, 457, 461, 434, 430, 394, 414, 463, 362, 396, 369, 262, 354, 461, 457, 316, 403, 402, 315, 404, 403, 314, 405, 404, 313, 406, 405, 421, 418, 406, 366, 401, 361, 306, 408, 407, 291, 409, 408, 287, 410, 409, 432, 436, 410, 434, 416, 411, 264, 368, 383, 309, 438, 457, 352, 376, 401, 274, 275, 4, 421, 428, 262, 294, 327, 358, 433, 416, 367, 289, 455, 439, 462, 370, 326, 2, 326, 370, 305, 460, 455, 254, 449, 448, 255, 261, 446, 253, 450, 449, 252, 451, 450, 256, 452, 451, 341, 453, 452, 413, 464, 463, 441, 413, 414, 258, 442, 441, 257, 443, 442, 259, 444, 443, 260, 445, 444, 467, 342, 445, 459, 458, 250, 289, 392, 290, 290, 328, 460, 376, 433, 435, 250, 290, 392, 411, 416, 433, 341, 463, 464, 453, 464, 465, 357, 465, 412, 343, 412, 399, 360, 363, 440, 437, 399, 456, 420, 456, 363, 401, 435, 288, 372, 383, 353, 339, 255, 249, 448, 261, 255, 133, 243, 190, 133, 155, 112, 33, 246, 247, 33, 130, 25, 398, 384, 286, 362, 398, 414, 362, 463, 341, 263, 359, 467, 263, 249, 255, 466, 467, 260, 75, 60, 166, 238, 239, 79, 162, 127, 139, 72, 11, 37, 121, 232, 120, 73, 72, 39, 114, 128, 47, 233, 232, 128, 103, 104, 67, 152, 175, 148, 173, 157, 155, 119, 118, 101, 74, 73, 40, 107, 9, 108, 49, 48, 131, 32, 194, 211, 184, 74, 185, 191, 80, 183, 185, 40, 186, 119, 230, 118, 210, 202, 214, 84, 83, 17, 77, 76, 146, 161, 160, 30, 190, 56, 173, 182, 106, 194, 138, 135, 192, 129, 203, 98, 54, 21, 68, 5, 51, 4, 145, 144, 23, 90, 77, 91, 207, 205, 187, 83, 201, 18, 181, 91, 182, 180, 90, 181, 16, 85, 17, 205, 206, 36, 176, 148, 140, 165, 92, 39, 245, 193, 244, 27, 159, 28, 30, 247, 161, 174, 236, 196, 103, 54, 104, 55, 193, 8, 111, 117, 31, 221, 189, 55, 240, 98, 99, 142, 126, 100, 219, 166, 218, 112, 155, 26, 198, 209, 131, 169, 135, 150, 114, 47, 217, 224, 223, 53, 220, 45, 134, 32, 211, 140, 109, 67, 108, 146, 43, 91, 231, 230, 120, 113, 226, 247, 105, 63, 52, 241, 238, 242, 124, 46, 156, 95, 78, 96, 70, 46, 63, 116, 143, 227, 116, 123, 111, 1, 44, 19, 3, 236, 51, 207, 216, 205, 26, 154, 22, 165, 39, 167, 199, 200, 208, 101, 36, 100, 43, 57, 202, 242, 20, 99, 56, 28, 157, 124, 35, 113, 29, 160, 27, 211, 204, 210, 124, 113, 46, 106, 43, 204, 96, 62, 77, 227, 137, 116, 73, 41, 72, 36, 203, 142, 235, 64, 240, 48, 49, 64, 42, 41, 74, 214, 212, 207, 183, 42, 184, 210, 169, 211, 140, 170, 176, 104, 105, 69, 193, 122, 168, 50, 123, 187, 89, 96, 90, 66, 65, 107, 179, 89, 180, 119, 101, 120, 68, 63, 104, 234, 93, 227, 16, 15, 85, 209, 129, 49, 15, 14, 86, 107, 55, 9, 120, 100, 121, 153, 145, 22, 178, 88, 179, 197, 6, 196, 89, 88, 96, 135, 138, 136, 138, 215, 172, 218, 115, 219, 41, 42, 81, 5, 195, 51, 57, 43, 61, 208, 171, 199, 41, 81, 38, 224, 53, 225, 24, 144, 110, 105, 52, 66, 118, 229, 117, 227, 34, 234, 66, 107, 69, 10, 109, 151, 219, 48, 235, 183, 62, 191, 142, 129, 126, 116, 111, 143, 7, 163, 246, 118, 117, 50, 223, 222, 52, 94, 19, 141, 222, 221, 65, 196, 3, 197, 45, 220, 44, 156, 70, 139, 188, 122, 245, 139, 71, 162, 145, 153, 159, 149, 170, 150, 122, 188, 196, 206, 216, 92, 163, 144, 161, 164, 2, 167, 242, 141, 241, 0, 164, 37, 11, 72, 12, 144, 145, 160, 12, 38, 13, 70, 63, 71, 31, 226, 111, 157, 158, 154, 36, 101, 205, 203, 206, 165, 126, 209, 217, 98, 165, 97, 237, 220, 218, 237, 239, 241, 210, 214, 169, 140, 171, 32, 241, 125, 237, 179, 86, 178, 180, 85, 179, 181, 84, 180, 182, 83, 181, 194, 201, 182, 177, 137, 132, 184, 76, 183, 185, 61, 184, 186, 57, 185, 216, 212, 186, 192, 214, 187, 139, 34, 156, 218, 79, 237, 147, 123, 177, 45, 44, 4, 208, 201, 32, 98, 64, 129, 192, 213, 138, 235, 59, 219, 141, 242, 97, 97, 2, 141, 240, 75, 235, 229, 24, 228, 31, 25, 226, 230, 23, 229, 231, 22, 230, 232, 26, 231, 233, 112, 232, 244, 189, 243, 189, 221, 190, 222, 28, 221, 223, 27, 222, 224, 29, 223, 225, 30, 224, 113, 247, 225, 99, 60, 240, 213, 147, 215, 60, 20, 166, 192, 187, 213, 243, 112, 244, 244, 233, 245, 245, 128, 188, 188, 114, 174, 134, 131, 220, 174, 217, 236, 236, 198, 134, 215, 177, 58, 156, 143, 124, 25, 110, 7, 31, 228, 25, 264, 356, 368, 0, 11, 267, 451, 452, 349, 267, 302, 269, 350, 357, 277, 350, 452, 357, 299, 333, 297, 396, 175, 377, 381, 384, 382, 280, 347, 330, 269, 303, 270, 151, 9, 337, 344, 278, 360, 424, 418, 431, 270, 304, 409, 272, 310, 407, 322, 270, 410, 449, 450, 347, 432, 422, 434, 18, 313, 17, 291, 306, 375, 259, 387, 260, 424, 335, 418, 434, 364, 416, 391, 423, 327, 301, 251, 298, 275, 281, 4, 254, 373, 253, 375, 307, 321, 280, 425, 411, 200, 421, 18, 335, 321, 406, 321, 320, 405, 314, 315, 17, 423, 426, 266, 396, 377, 369, 270, 322, 269, 413, 417, 464, 385, 386, 258, 248, 456, 419, 298, 284, 333, 168, 417, 8, 448, 346, 261, 417, 413, 285, 326, 327, 328, 277, 355, 329, 309, 392, 438, 381, 382, 256, 279, 429, 360, 365, 364, 379, 355, 277, 437, 282, 443, 283, 281, 275, 363, 395, 431, 369, 299, 297, 337, 335, 273, 321, 348, 450, 349, 359, 446, 467, 283, 293, 282, 250, 458, 462, 300, 276, 383, 292, 308, 325, 283, 276, 293, 264, 372, 447, 346, 352, 340, 354, 274, 19, 363, 456, 281, 426, 436, 425, 380, 381, 252, 267, 269, 393, 421, 200, 428, 371, 266, 329, 432, 287, 422, 290, 250, 328, 385, 258, 384, 446, 265, 342, 386, 387, 257, 422, 424, 430, 445, 342, 276, 422, 273, 424, 306, 292, 307, 352, 366, 345, 268, 271, 302, 358, 423, 371, 327, 294, 460, 331, 279, 294, 303, 271, 304, 436, 432, 427, 304, 272, 408, 395, 394, 431, 378, 395, 400, 296, 334, 299, 6, 351, 168, 376, 352, 411, 307, 325, 320, 285, 295, 336, 320, 319, 404, 329, 330, 349, 334, 293, 333, 366, 323, 447, 316, 15, 315, 331, 358, 279, 317, 14, 316, 8, 285, 9, 277, 329, 350, 253, 374, 252, 319, 318, 403, 351, 6, 419, 324, 318, 325, 397, 367, 365, 288, 435, 397, 278, 344, 439, 310, 272, 311, 248, 195, 281, 375, 273, 291, 175, 396, 199, 312, 311, 268, 276, 283, 445, 390, 373, 339, 295, 282, 296, 448, 449, 346, 356, 264, 454, 337, 336, 299, 337, 338, 151, 294, 278, 455, 308, 292, 415, 429, 358, 355, 265, 340, 372, 388, 390, 466, 352, 346, 280, 295, 442, 282, 354, 19, 370, 285, 441, 295, 195, 248, 197, 457, 440, 274, 301, 300, 368, 417, 351, 465, 251, 301, 389, 385, 380, 386, 394, 395, 379, 399, 412, 419, 410, 436, 322, 387, 373, 388, 326, 2, 393, 354, 370, 461, 393, 164, 267, 268, 302, 12, 386, 374, 387, 312, 268, 13, 298, 293, 301, 265, 446, 340, 380, 385, 381, 280, 330, 425, 322, 426, 391, 420, 429, 437, 393, 391, 326, 344, 440, 438, 458, 459, 461, 364, 434, 394, 428, 396, 262, 274, 354, 457, 317, 316, 402, 316, 315, 403, 315, 314, 404, 314, 313, 405, 313, 421, 406, 323, 366, 361, 292, 306, 407, 306, 291, 408, 291, 287, 409, 287, 432, 410, 427, 434, 411, 372, 264, 383, 459, 309, 457, 366, 352, 401, 1, 274, 4, 418, 421, 262, 331, 294, 358, 435, 433, 367, 392, 289, 439, 328, 462, 326, 94, 2, 370, 289, 305, 455, 339, 254, 448, 359, 255, 446, 254, 253, 449, 253, 252, 450, 252, 256, 451, 256, 341, 452, 414, 413, 463, 286, 441, 414, 286, 258, 441, 258, 257, 442, 257, 259, 443, 259, 260, 444, 260, 467, 445, 309, 459, 250, 305, 289, 290, 305, 290, 460, 401, 376, 435, 309, 250, 392, 376, 411, 433, 453, 341, 464, 357, 453, 465, 343, 357, 412, 437, 343, 399, 344, 360, 440, 420, 437, 456, 360, 420, 363, 361, 401, 288, 265, 372, 353, 390, 339, 249, 339, 448, 255],
// My face as default (captured with a 640x480 webcam)
// prettier-ignore
SAMPLE_FACE: {
"keypoints": [{
"x": 356.2804412841797,
"y": 295.1960563659668,
"z": -23.786449432373047,
"name": "lips"
}, {
"x": 354.8859405517578,
"y": 264.69520568847656,
"z": -36.718435287475586
}, {
"x": 355.2180862426758,
"y": 275.3360366821289,
"z": -21.183712482452393
}, {
"x": 347.349853515625,
"y": 242.4400234222412,
"z": -25.093655586242676
}, {
"x": 354.40135955810547,
"y": 256.67933464050293,
"z": -38.23572635650635
}, {
"x": 353.7689971923828,
"y": 247.54886627197266,
"z": -34.5475435256958
}, {
"x": 352.1288299560547,
"y": 227.34312057495117,
"z": -13.095386028289795
}, {
"x": 303.5013198852539,
"y": 234.67002868652344,
"z": 12.500141859054565,
"name": "rightEye"
}, {
"x": 351.09378814697266,
"y": 211.87547206878662,
"z": -6.413471698760986
}, {
"x": 350.7115936279297,
"y": 202.1251630783081,
"z": -6.413471698760986
}, {
"x": 348.33667755126953,
"y": 168.7741756439209,
"z": 6.483500003814697,
"name": "faceOval"
}, {
"x": 356.4806365966797,
"y": 299.2995357513428,
"z": -23.144519329071045
}, {
"x": 356.5511703491211,
"y": 302.66146659851074,
"z": -21.020312309265137
}, {
"x": 356.6239547729492,
"y": 304.1536331176758,
"z": -18.137459754943848,
"name": "lips"
}, {
"x": 356.5807342529297,
"y": 305.1840591430664,
"z": -18.767719268798828,
"name": "lips"
}, {
"x": 356.8241500854492,
"y": 308.25711250305176,
"z": -20.16829490661621
}, {
"x": 357.113037109375,
"y": 312.26277351379395,
"z": -22.10575819015503
}, {
"x": 357.34962463378906,
"y": 317.1123218536377,
"z": -21.837315559387207,
"name": "lips"
}, {
"x": 357.6658630371094,
"y": 325.51036834716797,
"z": -16.27002477645874
}, {
"x": 355.0201416015625,
"y": 269.36279296875,
"z": -33.73054027557373
}, {
"x": 348.5237503051758,
"y": 270.33411026000977,
"z": -24.93025302886963
}, {
"x": 279.97331619262695,
"y": 213.24176788330078,
"z": 47.759642601013184,
"name": "faceOval"
}, {
"x": 322.66529083251953,
"y": 238.5027265548706,
"z": 5.535193085670471
}, {
"x": 316.0983657836914,
"y": 239.94489669799805,
"z": 5.777376294136047
}, {
"x": 309.9431610107422,
"y": 240.24518966674805,
"z": 7.510589361190796
}, {
"x": 301.31994247436523,
"y": 237.86138534545898,
"z": 13.118728399276733
}, {
"x": 328.14266204833984,
"y": 235.80496788024902,
"z": 6.646900177001953
}, {
"x": 313.7326431274414,
"y": 222.11161136627197,
"z": 3.9887237548828125
}, {
"x": 320.45196533203125,
"y": 221.87729358673096,
"z": 4.601476192474365
}, {
"x": 307.35679626464844,
"y": 223.63793849945068,
"z": 5.932023525238037
}, {
"x": 303.0031204223633,
"y": 226.3743782043457,
"z": 8.479321002960205
}, {
"x": 296.80023193359375,
"y": 242.94299125671387,
"z": 15.931552648544312
}, {
"x": 332.2352981567383,
"y": 340.77341079711914,
"z": -10.165848731994629
}, {
"x": 301.38587951660156,
"y": 233.46447944641113,
"z": 14.764405488967896,
"name": "rightEye"
}, {
"x": 279.0147018432617,
"y": 244.37155723571777,
"z": 45.77549457550049
}, {
"x": 289.60548400878906,
"y": 239.1807460784912,
"z": 23.191204071044922
}, {
"x": 320.32257080078125,
"y": 267.1292781829834,
"z": -4.954537749290466
}, {
"x": 347.64583587646484,
"y": 294.4955062866211,
"z": -23.062820434570312,
"name": "lips"
}, {
"x": 349.28138732910156,
"y": 303.1095886230469,
"z": -20.238323211669922
}, {
"x": 338.9453125,
"y": 298.19186210632324,
"z": -19.456336498260498,
"name": "lips"
}, {
"x": 333.36788177490234,
"y": 302.6706790924072,
"z": -14.776077270507812,
"name": "lips"
}, {
"x": 342.89188385009766,
"y": 304.3561363220215,
"z": -17.752301692962646
}, {
"x": 337.7375030517578,
"y": 306.0098361968994,
"z": -13.410515785217285
}, {
"x": 325.6159210205078,
"y": 316.22995376586914,
"z": -6.681914925575256
}, {
"x": 349.0104675292969,
"y": 264.9818515777588,
"z": -36.274919509887695
}, {
"x": 347.7138900756836,
"y": 257.5664806365967,
"z": -37.67549514770508
}, {
"x": 291.79357528686523,
"y": 218.88171672821045,
"z": 11.578094959259033,
"name": "rightEyebrow"
}, {
"x": 332.2689437866211,
"y": 247.56946563720703,
"z": -3.3730539679527283
}, {
"x": 332.0074462890625,
"y": 267.1201229095459,
"z": -19.969879388809204
}, {
"x": 331.27952575683594,
"y": 263.6967658996582,
"z": -17.47218608856201
}, {
"x": 301.04373931884766,
"y": 269.56552505493164,
"z": 3.61815482378006
}, {
"x": 347.4863815307617,
"y": 249.0706443786621,
"z": -32.633421421051025
}, {
"x": 307.26118087768555,
"y": 208.2646894454956,
"z": 1.1591226607561111,
"name": "rightEyebrow"
}, {
"x": 297.91919708251953,
"y": 212.22604751586914,
"z": 5.914516448974609,
"name": "rightEyebrow"
}, {
"x": 285.1651382446289,
"y": 197.98450469970703,
"z": 36.391637325286865,
"name": "faceOval"
}, {
"x": 337.04097747802734,
"y": 211.25229835510254,
"z": -4.548954665660858
}, {
"x": 326.5912628173828,
"y": 223.16698551177979,
"z": 6.670243740081787
}, {
"x": 320.05664825439453,
"y": 309.5834255218506,
"z": -4.055835008621216
}, {
"x": 289.6866226196289,
"y": 314.617395401001,
"z": 53.875489234924316,
"name": "faceOval"
}, {
"x": 337.4256896972656,
"y": 270.8755302429199,
"z": -17.67060160636902
}, {
"x": 343.69922637939453,
"y": 273.0000400543213,
"z": -18.756048679351807
}, {
"x": 327.4242401123047,
"y": 309.22399520874023,
"z": -4.703601002693176,
"name": "lips"
}, {
"x": 330.37220001220703,
"y": 308.3323001861572,
"z": -6.442649960517883
}, {
"x": 293.87027740478516,
"y": 207.7961826324463,
"z": 9.821539521217346,
"name": "rightEyebrow"
}, {
"x": 332.11437225341797,
"y": 271.22812271118164,
"z": -16.64351224899292
}, {
"x": 320.1197814941406,
"y": 207.40366458892822,
"z": -2.48164564371109,
"name": "rightEyebrow"
}, {
"x": 318.59575271606445,
"y": 201.07443809509277,
"z": -3.110446035861969,
"name": "rightEyebrow"
}, {
"x": 310.72303771972656,
"y": 175.75075149536133,
"z": 13.328815698623657,
"name": "faceOval"
}, {
"x": 289.67578887939453,
"y": 202.29835510253906,
"z": 21.370456218719482
}, {
"x": 315.30879974365234,
"y": 187.35260009765625,
"z": 5.0304025411605835
}, {
"x": 287.8936767578125,
"y": 216.54793739318848,
"z": 17.81065821647644,
"name": "rightEyebrow"
}, {
"x": 283.9391899108887,
"y": 215.01142501831055,
"z": 32.04984903335571
}, {
"x": 348.35330963134766,
"y": 299.4155788421631,
"z": -22.47924566268921
}, {
"x": 341.1790466308594,
"y": 301.8221855163574,
"z": -18.977805376052856
}, {
"x": 335.69713592529297,
"y": 304.4266891479492,
"z": -14.682706594467163
}, {
"x": 339.4615173339844,
"y": 272.3654365539551,
"z": -16.38674020767212
}, {
"x": 328.99600982666016,
"y": 308.86685371398926,
"z": -5.616893768310547
}, {
"x": 332.00313568115234,
"y": 309.1875743865967,
"z": -10.335084199905396
}, {
"x": 331.0068130493164,
"y": 307.9274368286133,
"z": -6.681914925575256,
"name": "lips"
}, {
"x": 341.13792419433594,
"y": 266.4876937866211,
"z": -26.56425952911377
}, {
"x": 339.02950286865234,
"y": 305.6663703918457,
"z": -12.33674168586731,
"name": "lips"
}, {
"x": 344.22935485839844,
"y": 304.9452781677246,
"z": -15.161235332489014,
"name": "lips"
}, {
"x": 350.1844024658203,
"y": 304.374303817749,
"z": -17.5305438041687,
"name": "lips"
}, {
"x": 348.52630615234375,
"y": 325.9562301635742,
"z": -16.164982318878174
}, {
"x": 348.6581802368164,
"y": 317.1624183654785,
"z": -21.510512828826904,
"name": "lips"
}, {
"x": 348.9766311645508,
"y": 312.1923065185547,
"z": -21.708929538726807
}, {
"x": 349.2427444458008,
"y": 308.0660820007324,
"z": -19.643079042434692
}, {
"x": 349.67491149902344,
"y": 305.42747497558594,
"z": -18.16080331802368,
"name": "lips"
}, {
"x": 337.95589447021484,
"y": 306.6535949707031,
"z": -12.803598642349243,
"name": "lips"
}, {
"x": 337.06878662109375,
"y": 307.63169288635254,
"z": -14.274203777313232
}, {
"x": 335.77449798583984,
"y": 309.8449516296387,
"z": -15.698124170303345
}, {
"x": 334.6099090576172,
"y": 312.7997016906738,
"z": -14.764405488967896,
"name": "lips"
}, {
"x": 327.2330856323242,
"y": 293.80866050720215,
"z": -11.864047050476074
}, {
"x": 280.97679138183594,
"y": 279.79928970336914,
"z": 68.90834331512451,
"name": "faceOval"
}, {
"x": 355.13843536376953,
"y": 271.7875671386719,
"z": -25.350427627563477
}, {
"x": 334.7235870361328,
"y": 307.4656391143799,
"z": -9.302158951759338,
"name": "lips"
}, {
"x": 333.5293960571289,
"y": 307.89782524108887,
"z": -10.200862884521484
}, {
"x": 346.29688262939453,
"y": 276.4256286621094,
"z": -19.748122692108154
}, {
"x": 335.16246795654297,
"y": 276.22097969055176,
"z": -12.313398122787476
}, {
"x": 345.09132385253906,
"y": 274.7082996368408,
"z": -19.304605722427368
}, {
"x": 325.4267883300781,
"y": 252.95130729675293,
"z": -1.6661019623279572
}, {
"x": 315.347843170166,
"y": 259.05200958251953,
"z": -0.25604281574487686
}, {
"x": 330.44933319091797,
"y": 267.7570152282715,
"z": -14.017432928085327
}, {
"x": 294.96768951416016,
"y": 185.26001930236816,
"z": 23.903164863586426,
"name": "faceOval"
}, {
"x": 299.63531494140625,
"y": 192.7913761138916,
"z": 12.640198469161987
}, {
"x": 304.5452117919922,
"y": 202.4142837524414,
"z": 3.244667649269104,
"name": "rightEyebrow"
}, {
"x": 331.6915512084961,
"y": 320.0467872619629,
"z": -10.632705688476562
}, {
"x": 334.5911407470703,
"y": 201.27566814422607,
"z": -6.133356094360352,
"name": "rightEyebrow"
}, {
"x": 331.4815902709961,
"y": 185.44180870056152,
"z": 0.6627205014228821
}, {
"x": 328.05816650390625,
"y": 170.8385467529297,
"z": 7.358860373497009,
"name": "faceOval"
}, {
"x": 304.49764251708984,
"y": 239.76297855377197,
"z": 10.387605428695679
}, {
"x": 290.6382179260254,
"y": 248.85257720947266,
"z": 19.03616428375244
}, {
"x": 331.5682601928711,
"y": 233.20727348327637,
"z": 7.837390303611755
}, {
"x": 295.5115509033203,
"y": 228.9834451675415,
"z": 14.41426157951355
}, {
"x": 336.94332122802734,
"y": 241.8259334564209,
"z": -5.27842104434967
}, {
"x": 336.2792205810547,
"y": 262.7049922943115,
"z": -26.12074375152588
}, {
"x": 284.4102478027344,
"y": 255.3262710571289,
"z": 25.467140674591064
}, {
"x": 295.1420593261719,
"y": 253.02655220031738,
"z": 12.430112361907959
}, {
"x": 303.5196113586426,
"y": 254.20703887939453,
"z": 6.139191389083862
}, {
"x": 315.73450088500977,
"y": 251.64799690246582,
"z": 3.3788898587226868
}, {
"x": 324.69661712646484,
"y": 247.56494522094727,
"z": 2.3328344523906708
}, {
"x": 331.57970428466797,
"y": 243.02241325378418,
"z": 1.1423448473215103
}, {
"x": 345.6210708618164,
"y": 229.9976634979248,
"z": -10.825285911560059
}, {
"x": 286.26644134521484,
"y": 270.37991523742676,
"z": 21.708929538726807
}, {
"x": 290.2525520324707,
"y": 228.4921360015869,
"z": 17.71728754043579
}, {
"x": 351.65367126464844,
"y": 269.3400764465332,
"z": -33.450424671173096
}, {
"x": 333.1378936767578,
"y": 253.88388633728027,
"z": -7.230473756790161
}, {
"x": 277.8318977355957,
"y": 246.95331573486328,
"z": 68.20805549621582,
"name": "faceOval"
}, {
"x": 336.6680908203125,
"y": 238.10003757476807,
"z": 0.7688578963279724
}, {
"x": 329.95800018310547,
"y": 269.18323516845703,
"z": -7.207130789756775
}, {
"x": 299.17491912841797,
"y": 234.13324356079102,
"z": 15.95489501953125
}, {
"x": 335.61729431152344,
"y": 258.71752738952637,
"z": -23.016133308410645
}, {
"x": 284.1079330444336,
"y": 297.0343494415283,
"z": 63.25934886932373,
"name": "faceOval"
}, {
"x": 331.44542694091797,
"y": 230.6892442703247,
"z": 9.92658257484436,
"name": "rightEye"
}, {
"x": 341.41536712646484,
"y": 253.01264762878418,
"z": -29.038610458374023
}, {
"x": 303.5472869873047,
"y": 327.5896739959717,
"z": 16.725212335586548
}, {
"x": 304.7756576538086,
"y": 337.4389457702637,
"z": 27.38126277923584,
"name": "faceOval"
}, {
"x": 280.80501556396484,
"y": 275.32050132751465,
"z": 45.0752067565918
}, {
"x": 295.43582916259766,
"y": 318.4501647949219,
"z": 26.2608003616333
}, {
"x": 281.4303207397461,
"y": 228.7355661392212,
"z": 40.94350814819336
}, {
"x": 331.2549591064453,
"y": 349.4216537475586,
"z": -7.376367449760437
}, {
"x": 352.4247741699219,
"y": 271.7330074310303,
"z": -24.953596591949463
}, {
"x": 327.5672912597656,
"y": 260.41900634765625,
"z": -5.456410646438599
}, {
"x": 284.5432472229004,
"y": 241.7647933959961,
"z": 29.668869972229004
}, {
"x": 310,
"y": 235.66174507141113,
"z": 8.502663969993591,
"name": "rightEye"
}, {
"x": 315.7071113586426,
"y": 235.7572603225708,
"z": 6.938687562942505,
"name": "rightEye"
}, {
"x": 330.41088104248047,
"y": 311.04143142700195,
"z": -9.325502514839172,
"name": "lips"
}, {
"x": 288.5377502441406,
"y": 285.31983375549316,
"z": 21.837315559387207
}, {
"x": 344.55039978027344,
"y": 359.4300842285156,
"z": -6.705257892608643,
"name": "faceOval"
}, {
"x": 323.41880798339844,
"y": 351.67362213134766,
"z": 7.802375555038452,
"name": "faceOval"
}, {
"x": 314.64088439941406,
"y": 346.11894607543945,
"z": 16.36339783668518,
"name": "faceOval"
}, {
"x": 349.4945526123047,
"y": 184.8434829711914,
"z": -0.21847527474164963
}, {
"x": 359.24694061279297,
"y": 359.8348903656006,
"z": -8.403456211090088,
"name": "faceOval"
}, {
"x": 321.26182556152344,
"y": 234.64492321014404,
"z": 6.90950870513916,
"name": "rightEye"
}, {
"x": 326.318359375,
"y": 232.90250301361084,
"z": 8.029969334602356,
"name": "rightEye"
}, {
"x": 329.6211624145508,
"y": 231.6195774078369,
"z": 9.722331762313843,
"name": "rightEye"
}, {
"x": 285.9398078918457,
"y": 228.2351303100586,
"z": 24.650139808654785
}, {
"x": 325.79288482666016,
"y": 227.88007736206055,
"z": 7.469738721847534,
"name": "rightEye"
}, {
"x": 320.1699447631836,
"y": 227.5934886932373,
"z": 6.168370842933655,
"name": "rightEye"
}, {
"x": 314.85408782958984,
"y": 227.85282611846924,
"z": 6.2675780057907104,
"name": "rightEye"
}, {
"x": 309.3084907531738,
"y": 229.1516876220703,
"z": 7.7031683921813965,
"name": "rightEye"
}, {
"x": 305.5621337890625,
"y": 230.92366218566895,
"z": 9.722331762313843,
"name": "rightEye"
}, {
"x": 277.8681945800781,
"y": 228.5354232788086,
"z": 59.71122741699219,
"name": "faceOval"
}, {
"x": 306.1444664001465,
"y": 235.1954698562622,
"z": 10.603528022766113,
"name": "rightEye"
}, {
"x": 355.4478454589844,
"y": 281.96210861206055,
"z": -20.565123558044434
}, {
"x": 333.02661895751953,
"y": 288.0105400085449,
"z": -14.72939133644104
}, {
"x": 337.15728759765625,
"y": 269.2059516906738,
"z": -19.8414945602417
}, {
"x": 345.9898376464844,
"y": 283.5453128814697,
"z": -20.4834246635437
}, {
"x": 351.48963928222656,
"y": 219.98916149139404,
"z": -7.0378947257995605
}, {
"x": 312.39574432373047,
"y": 336.50628089904785,
"z": 8.671900033950806
}, {
"x": 321.32152557373047,
"y": 343.1755256652832,
"z": 0.9067271649837494
}, {
"x": 343.78379821777344,
"y": 353.2975959777832,
"z": -14.355905055999756
}, {
"x": 296.8791389465332,
"y": 327.91497230529785,
"z": 41.01353645324707,
"name": "faceOval"
}, {
"x": 329.6939468383789,
"y": 229.27897453308105,
"z": 8.934508562088013,
"name": "rightEye"
}, {
"x": 341.6905212402344,
"y": 241.4073657989502,
"z": -14.589333534240723
}, {
"x": 359.03079986572266,
"y": 353.48859786987305,
"z": -15.803166627883911
}, {
"x": 333.1861877441406,
"y": 356.43213272094727,
"z": -1.0234417766332626,
"name": "faceOval"
}, {
"x": 283.97483825683594,
"y": 291.4318656921387,
"z": 41.94725513458252
}, {
"x": 343.33770751953125,
"y": 305.830135345459,
"z": -15.756480693817139,
"name": "lips"
}, {
"x": 342.40283966064453,
"y": 307.7453899383545,
"z": -17.4021577835083
}, {
"x": 341.53621673583984,
"y": 311.0595703125,
"z": -19.047834873199463
}, {
"x": 340.9107208251953,
"y": 315.4837703704834,
"z": -18.5576331615448,
"name": "lips"
}, {
"x": 339.1478729248047,
"y": 323.42233657836914,
"z": -14.367576837539673
}, {
"x": 333.3201599121094,
"y": 307.4406337738037,
"z": -9.617288708686829
}, {
"x": 331.2411117553711,
"y": 306.9811820983887,
"z": -9.669809937477112
}, {
"x": 329.23255920410156,
"y": 306.0508346557617,
"z": -9.582273960113525,
"name": "lips"
}, {
"x": 322.4586486816406,
"y": 301.33323669433594,
"z": -7.720675468444824
}, {
"x": 297.1712112426758,
"y": 286.9552803039551,
"z": 8.240055441856384
}, {
"x": 341.3060760498047,
"y": 235.4432201385498,
"z": -7.504753470420837
}, {
"x": 336.9318389892578,
"y": 224.3451976776123,
"z": 5.829898118972778
}, {
"x": 332.65323638916016,
"y": 226.70403957366943,
"z": 8.105834126472473
}, {
"x": 334.67357635498047,
"y": 306.4397621154785,
"z": -8.981193900108337,
"name": "lips"
}, {
"x": 297.4601936340332,
"y": 306.29210472106934,
"z": 15.476365089416504
}, {
"x": 342.9119110107422,
"y": 222.37077713012695,
"z": -2.754466235637665
}, {
"x": 335.4629898071289,
"y": 332.20250129699707,
"z": -11.823196411132812
}, {
"x": 353.2412338256836,
"y": 240.56339263916016,
"z": -27.147831916809082
}, {
"x": 346.3080596923828,
"y": 236.41446590423584,
"z": -18.452589511871338
}, {
"x": 352.6475143432617,
"y": 234.1420555114746,
"z": -19.748122692108154
}, {
"x": 337.3209762573242,
"y": 253.39937210083008,
"z": -16.024924516677856
}, {
"x": 358.6122131347656,
"y": 344.90861892700195,
"z": -18.592647314071655
}, {
"x": 358.1117248535156,
"y": 334.64990615844727,
"z": -17.49552845954895
}, {
"x": 346.4450454711914,
"y": 335.0321102142334,
"z": -16.32838249206543
}, {
"x": 319.17640686035156,
"y": 320.2833938598633,
"z": -3.276764452457428
}, {
"x": 325.2540588378906,
"y": 276.2369728088379,
"z": -6.460157036781311
}, {
"x": 326.7214584350586,
"y": 327.3939514160156,
"z": -7.417217493057251
}, {
"x": 310.7190132141113,
"y": 277.2265148162842,
"z": -3.5452082753181458
}, {
"x": 319.78355407714844,
"y": 284.8238182067871,
"z": -6.4543211460113525
}, {
"x": 305.773983001709,
"y": 290.83580017089844,
"z": 0.06907138042151928
}, {
"x": 344.4001770019531,
"y": 344.85408782958984,
"z": -16.946970224380493
}, {
"x": 333.1879425048828,
"y": 258.74256134033203,
"z": -11.90489649772644
}, {
"x": 313.80598068237305,
"y": 327.08919525146484,
"z": 2.2277912497520447
}, {
"x": 322.9637908935547,
"y": 334.6819496154785,
"z": -3.3643004298210144
}, {
"x": 313.4055519104004,
"y": 311.2166690826416,
"z": -1.1175429821014404
}, {
"x": 291.0865783691406,
"y": 298.2831001281738,
"z": 22.467575073242188
}, {
"x": 305.6580924987793,
"y": 313.3707904815674,
"z": 5.561453700065613
}, {
"x": 288.23760986328125,
"y": 305.9941864013672,
"z": 36.765122413635254
}, {
"x": 315.10692596435547,
"y": 296.26991271972656,
"z": -4.604393839836121
}, {
"x": 337.50518798828125,
"y": 247.5944423675537,
"z": -10.597691535949707
}, {
"x": 338.8450622558594,
"y": 265.47778129577637,
"z": -27.778091430664062
}, {
"x": 334.25254821777344,
"y": 269.0671920776367,
"z": -20.938611030578613
}, {
"x": 341.64512634277344,
"y": 259.6387195587158,
"z": -32.189905643463135
}, {
"x": 331.44081115722656,
"y": 219.0976095199585,
"z": 4.207563698291779
}, {
"x": 320.56339263916016,
"y": 216.49658203125,
"z": 2.930997312068939
}, {
"x": 311.21912002563477,
"y": 216.57853603363037,
"z": 2.9674705862998962
}, {
"x": 303.46256256103516,
"y": 218.54614734649658,
"z": 5.357203483581543
}, {
"x": 297.99999237060547,
"y": 222.505202293396,
"z": 9.325502514839172
}, {
"x": 294.93839263916016,
"y": 236.39654159545898,
"z": 18.534289598464966
}, {
"x": 278.87489318847656,
"y": 259.7095584869385,
"z": 45.68212032318115
}, {
"x": 300.3782653808594,
"y": 245.38593292236328,
"z": 12.278382778167725
}, {
"x": 307.06348419189453,
"y": 246.36857986450195,
"z": 8.164191246032715
}, {
"x": 315.5229187011719,
"y": 245.3949737548828,
"z": 5.503097176551819
}, {
"x": 323.71395111083984,
"y": 242.75178909301758,
"z": 4.6335723996162415
}, {
"x": 330.2785873413086,
"y": 239.34658527374268,
"z": 4.937030673027039
}, {
"x": 334.6982192993164,
"y": 236.0460376739502,
"z": 4.823233783245087
}, {
"x": 279.3412208557129,
"y": 263.5196113586426,
"z": 70.91583728790283,
"name": "faceOval"
}, {
"x": 334.65972900390625,
"y": 271.6648578643799,
"z": -17.775644063949585
}, {
"x": 342.05677032470703,
"y": 246.998462677001