Repository: cyrildiagne/ar-facedoodle
Branch: master
Commit: 43573ee72664
Files: 14
Total size: 131.6 KB
Directory structure:
gitextract_hzz635gr/
├── .gitignore
├── LICENSE
├── README.md
├── index.html
├── package.json
├── src/
│ ├── colorpicker.js
│ ├── facemesh.js
│ ├── main.js
│ ├── refmesh.js
│ ├── three.js
│ ├── triangulation.js
│ └── vendor/
│ └── OBJLoader.js
├── static/
│ └── facemesh.obj
└── style/
└── main.scss
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
node_modules
.DS_Store
.cache
dist
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2020 Cyril Diagne
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
# AR Face Doodle
Doodle on your face with AR directly from the web browser thanks to
[Tensorflow.js](https://www.tensorflow.org/js),
[FaceMesh](https://github.com/tensorflow/tfjs-models/tree/master/facemesh)
and [Three.js](https://threejs.org/).

Demo: [https://cyrildiagne.github.io/ar-facedoodle](https://cyrildiagne.github.io/ar-facedoodle)
## Setup
```
npm install && npm start
```
## Thanks and acknowledgement
- [tensorflow/tfjs-models facemesh](https://github.com/tensorflow/tfjs-models/tree/master/facemesh) For the face detection model
- [shawticus/facemesh-threejs](https://github.com/shawticus/facemesh-threejs) For the facemesh OBJ model
- [mourner/simplify.js](https://github.com/mourner/simplify-js) For the line smoothing
- [mrdoob/three.js](https://github.com/mrdoob/three.js) For the 3D engine
================================================
FILE: index.html
================================================
AR Face Doodle
================================================
FILE: package.json
================================================
{
"name": "ar-facedoodle",
"version": "1.0.0",
"description": "Doodle on your face using AR",
"repository": "https://github.com/cyrildiagne/ar-facedoodle",
"scripts": {
"start": "parcel index.html --host 0.0.0.0",
"deploy": "parcel build index.html --no-source-maps --public-url /ar-facedoodle/ && gh-pages -d dist",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "https://twitter.com/cyrildiagne",
"license": "MIT",
"eslintConfig": {
"extends": [
"prettier-standard"
]
},
"prettier": "prettier-config-standard",
"sass": {
"includePaths": [
"./node_modules"
]
},
"babel": {
"presets": [
[
"env",
{
"esmodules": false,
"targets": {
"browsers": [
"> 3%"
]
}
}
]
],
"plugins": [
[
"@babel/plugin-transform-runtime"
]
]
},
"dependencies": {
"@material/icon-button": "^6.0.0",
"@material/slider": "^6.0.0",
"@tensorflow-models/facemesh": "0.0.1",
"@tensorflow/tfjs-converter": "^1.7.3",
"@tensorflow/tfjs-core": "^1.7.3",
"a-color-picker": "^1.2.1",
"simplify-js": "^1.2.4",
"three": "^0.115.0"
},
"devDependencies": {
"@babel/core": "^7.9.0",
"@babel/plugin-transform-runtime": "^7.9.0",
"@babel/preset-env": "^7.9.5",
"@babel/runtime": "^7.9.2",
"babel-preset-env": "^1.7.0",
"eslint": "^6.8.0",
"eslint-config-prettier": "^6.11.0",
"eslint-config-prettier-standard": "^3.0.1",
"eslint-config-standard": "^14.1.1",
"eslint-plugin-import": "^2.20.2",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-prettier": "^3.1.3",
"eslint-plugin-promise": "^4.2.1",
"eslint-plugin-standard": "^4.0.1",
"gh-pages": "^2.2.0",
"node-sass-package-importer": "^5.3.2",
"parcel-bundler": "^1.12.4",
"parcel-plugin-clean-dist": "0.0.6",
"parcel-plugin-static-files-copy": "^2.3.1",
"prettier": "^2.0.5",
"prettier-config-standard": "^1.0.1",
"sass": "^1.26.5"
}
}
================================================
FILE: src/colorpicker.js
================================================
import * as colorpicker from 'a-color-picker'
function init(callback) {
const bt = document.getElementById('bt-picker')
bt.addEventListener('click', btClicked)
colorpicker.from('.picker').on('change', (picker, color) => {
if (color === 'rgb(255, 255, 255)') {
bt.style.color = 'black'
} else {
bt.style.color = color
}
const cursor = document.querySelector('.cursor')
cursor.style.backgroundColor = bt.style.color
callback(color)
})
}
function btClicked() {
const el = document.querySelector('.picker')
el.style.display = 'block'
const closeSurface = document.createElement('div')
closeSurface.classList = 'close-color'
document.body.prepend(closeSurface)
closeSurface.addEventListener('click', () => {
el.style.display = 'none'
closeSurface.remove()
})
}
export default {
init
}
================================================
FILE: src/facemesh.js
================================================
import * as facemesh from '@tensorflow-models/facemesh'
import * as tf from '@tensorflow/tfjs-core'
import { TRIANGULATION } from './triangulation'
let model
let canvas
let ctx
const state = {
backend: 'webgl'
}
async function init(video) {
await tf.setBackend(state.backend)
model = await facemesh.load({ maxFaces: 1 })
}
async function update(video, debug = false) {
const predictions = await model.estimateFaces(video)
if (debug) {
drawDebug(video, predictions)
}
if (predictions.length > 0) {
return predictions[0]
}
}
function drawDebug(video, predictions) {
if (!ctx) {
createDebug()
}
ctx.drawImage(
video,
0,
0,
video.videoWidth,
video.videoHeight,
0,
0,
canvas.width,
canvas.height
)
if (predictions.length > 0) {
predictions.forEach(prediction => {
const keypoints = prediction.scaledMesh
if (state.triangulateMesh) {
for (let i = 0; i < TRIANGULATION.length / 3; i++) {
const points = [
TRIANGULATION[i * 3],
TRIANGULATION[i * 3 + 1],
TRIANGULATION[i * 3 + 2]
].map(index => keypoints[index])
drawPath(ctx, points, true)
}
} else {
for (let i = 0; i < keypoints.length; i++) {
const x = keypoints[i][0]
const y = keypoints[i][1]
ctx.beginPath()
ctx.arc(x, y, 1 /* radius */, 0, 2 * Math.PI)
ctx.fill()
}
}
})
}
}
function createDebug(video) {
canvas = document.createElement('canvas')
canvas.width = video.width
canvas.height = video.height
ctx = canvas.getContext('2d')
ctx.translate(canvas.width, 0)
ctx.scale(-1, 1)
ctx.fillStyle = '#32EEDB'
ctx.strokeStyle = '#32EEDB'
ctx.lineWidth = 0.5
return canvas
}
function drawPath(ctx, points, closePath) {
const region = new Path2D()
region.moveTo(points[0][0], points[0][1])
for (let i = 1; i < points.length; i++) {
const point = points[i]
region.lineTo(point[0], point[1])
}
if (closePath) {
region.closePath()
}
ctx.stroke(region)
}
export default {
init,
update
}
================================================
FILE: src/main.js
================================================
import facemesh from './facemesh'
import refmesh from './refmesh'
import three from './three'
import colorpicker from './colorpicker'
import { MDCSlider } from '@material/slider/dist/mdc.slider'
const useCamera = true
let video
let threeEl
let cursorEl
let paused = false
let drawing = false
async function setupCamera() {
video = document.createElement('video')
const stream = await navigator.mediaDevices.getUserMedia({
audio: false,
video: {
facingMode: 'user',
width: 640,
height: 640
}
})
video.srcObject = stream
return new Promise(resolve => {
video.onloadedmetadata = () => {
resolve(video)
}
})
}
async function update() {
// Update facemesh.
if (useCamera) {
const face = await facemesh.update(video)
// Update three scene.
if (face) {
three.update(face.scaledMesh)
}
} else {
three.update(refmesh.debugPoints)
}
// Call for RAF if scene is not paused.
if (!paused) {
window.requestAnimationFrame(update)
}
}
function onMouseDown(evt) {
drawing = true
}
function onMouseMove(evt) {
const rect = threeEl.getBoundingClientRect()
const x = rect.width - (evt.clientX - rect.x)
const y = evt.clientY - rect.y
cursorEl.style.left = evt.clientX + 'px'
cursorEl.style.top = evt.clientY + 'px'
if (drawing) {
three.draw({ x, y })
} else {
const isOver = three.isOverFace({ x, y })
if (isOver) {
document.body.classList.add('hover-face')
} else {
if (document.body.classList.contains('hover-face')) {
document.body.classList.remove('hover-face')
}
}
}
}
function onMouseUp(evt) {
three.end()
drawing = false
document.body.classList.remove('hover-face')
}
function onTouchStart(evt) {
window.addEventListener('touchmove', onTouchMove)
}
function onTouchMove(evt) {
const rect = threeEl.getBoundingClientRect()
const x = rect.width - (evt.touches[0].clientX - rect.x)
const y = evt.touches[0].clientY - rect.y
three.draw({ x, y })
}
function onTouchEnd(evt) {
three.end()
window.removeEventListener('touchmove', onTouchMove)
}
function play() {
paused = false
window.requestAnimationFrame(update)
document.body.classList.remove('paused')
}
function pause() {
paused = true
document.body.classList.add('paused')
}
async function init() {
if (useCamera) {
// Initialize camera.
console.log('setting up camera...')
await setupCamera()
video.play()
video.width = video.videoWidth
video.height = video.videoHeight
// Initialize face mesh.
console.log('setting up facemesh...')
await facemesh.init(video)
}
// Initialize threejs scene.
console.log('setting up threejs...')
threeEl = await three.init(video)
threeEl.classList.add('three-canvas')
threeEl.addEventListener('mousedown', onMouseDown)
threeEl.addEventListener('mousemove', onMouseMove)
window.addEventListener('mouseup', onMouseUp)
threeEl.addEventListener('touchstart', onTouchStart)
window.addEventListener('touchend', onTouchEnd)
document.querySelector('.container').prepend(threeEl)
// Launch update loop.
update()
window.addEventListener('blur', pause)
window.addEventListener('focus', play)
// Setup UI.
// Color picker
colorpicker.init(color => (three.params.color = color))
// Slider.
const slider = new MDCSlider(document.querySelector('.mdc-slider'))
const thumb = document.querySelector('.mdc-slider__thumb')
thumb.style.transform = 'scale(1)'
const pin = document.querySelector('.mdc-slider__pin')
pin.style.bottom = '10px'
slider.listen('MDCSlider:input', () => {
const thickness = parseInt(slider.value)
thumb.style.transform = `scale(${1 + thickness / 50})`
pin.style.bottom = `${10 + thickness}px`
three.params.thickness = thickness
// Update cursor size.
const size = Math.max(2, thickness / 2)
cursorEl.style.width = size + 'px'
cursorEl.style.height = size + 'px'
})
// Undo button.
const undoEl = document.getElementById('undo')
undoEl.addEventListener('click', () => three.undo())
// Clear button.
const clearEl = document.getElementById('clear')
clearEl.addEventListener('click', () => three.clear())
// Debug button.
const debugEl = document.getElementById('debug')
debugEl.addEventListener('click', () => three.setDebug(!three.params.debug))
// Info bt.
const infoBt = document.getElementById('bt-info')
const infoEl = document.getElementById('info')
infoBt.addEventListener('click', () => {
infoEl.classList.toggle('show')
})
infoEl.addEventListener('click', () => {
infoEl.classList.remove('show')
})
// Setup cursor.
cursorEl = document.createElement('div')
cursorEl.classList.add('cursor')
document.body.append(cursorEl)
// Done.
document.body.classList.remove('loading')
}
window.onload = () => {
console.log('init')
init()
}
================================================
FILE: src/refmesh.js
================================================
const debugPoints = [
[298.1790771484375, 387.03167724609375, -14.120745658874512],
[300.2152099609375, 358.21246337890625, -31.661890029907227],
[298.96722412109375, 366.7823486328125, -15.867902755737305],
[293.5539245605469, 323.68035888671875, -25.673297882080078],
[300.63177490234375, 347.752197265625, -34.1967887878418],
[300.7069091796875, 333.7161865234375, -32.46065139770508],
[300.5322265625, 300.4746398925781, -18.32489585876465],
[240.8586883544922, 297.0817565917969, 3.295238494873047],
[300.92578125, 275.4305114746094, -15.480683326721191],
[301.3796691894531, 261.49365234375, -17.565792083740234],
[302.217041015625, 210.05763244628906, -14.386534690856934],
[297.95367431640625, 391.622314453125, -13.00723934173584],
[297.69073486328125, 394.67401123046875, -10.971356391906738],
[297.4516296386719, 395.25830078125, -8.254570960998535],
[297.35955810546875, 395.1733093261719, -7.759902477264404],
[297.3115234375, 398.7442932128906, -8.650358200073242],
[297.1659240722656, 403.46270751953125, -9.953529357910156],
[296.94647216796875, 409.1010437011719, -9.312821388244629],
[296.3753662109375, 420.02447509765625, -3.8191821575164795],
[299.82757568359375, 363.11761474609375, -28.395206451416016],
[291.6897888183594, 361.4345703125, -20.3421573638916],
[213.03945922851562, 255.58355712890625, 27.743202209472656],
[264.42474365234375, 306.226318359375, -1.8822672367095947],
[256.2830505371094, 306.6920166015625, -1.6084545850753784],
[248.49008178710938, 305.7471923828125, -0.14808014035224915],
[237.83763122558594, 300.2297668457031, 4.426307678222656],
[271.3021240234375, 303.95501708984375, -0.9919998049736023],
[253.87518310546875, 282.31085205078125, -5.48806619644165],
[262.4411315917969, 283.13909912109375, -5.154913902282715],
[245.84014892578125, 283.3853759765625, -3.5459940433502197],
[240.31863403320312, 286.40179443359375, -1.0740599632263184],
[231.61756896972656, 305.4979248046875, 7.720613479614258],
[266.0926208496094, 437.0557861328125, 4.119032382965088],
[237.98028564453125, 294.822509765625, 5.135197639465332],
[209.29916381835938, 299.28216552734375, 33.0094108581543],
[223.00498962402344, 298.51361083984375, 13.069906234741211],
[256.78436279296875, 344.7298278808594, -5.160249710083008],
[287.23016357421875, 384.89739990234375, -13.86629581451416],
[287.705078125, 393.78631591796875, -10.363572120666504],
[275.5537109375, 385.8682861328125, -10.376333236694336],
[267.7962646484375, 387.4253845214844, -5.726817607879639],
[279.1785583496094, 392.824462890625, -8.098724365234375],
[272.4394226074219, 392.031494140625, -3.8566644191741943],
[257.9046325683594, 399.8031005859375, 4.221691131591797],
[293.3802490234375, 357.6147155761719, -31.34697151184082],
[292.6982116699219, 347.45318603515625, -33.692848205566406],
[228.14358520507812, 273.68780517578125, -0.22682692110538483],
[274.4689025878906, 321.60693359375, -6.838437080383301],
[272.694580078125, 351.89569091796875, -17.42055892944336],
[272.20538330078125, 346.319580078125, -15.844796180725098],
[232.07119750976562, 341.92535400390625, 2.0097591876983643],
[293.18707275390625, 334.4962158203125, -30.855125427246094],
[247.62579345703125, 263.87725830078125, -10.370193481445312],
[236.17752075195312, 266.8315124511719, -5.848870754241943],
[220.88687133789062, 237.77780151367188, 15.25772762298584],
[283.2908935546875, 273.1679382324219, -14.303738594055176],
[269.8764343261719, 286.29296875, -3.0431814193725586],
[251.19052124023438, 390.20758056640625, 4.918463230133057],
[215.7345733642578, 389.6566162109375, 55.26961898803711],
[278.395751953125, 357.6062927246094, -14.705124855041504],
[285.4184265136719, 361.23248291015625, -14.602949142456055],
[258.7841796875, 389.179443359375, 4.841699600219727],
[262.52423095703125, 389.20587158203125, 3.359598159790039],
[231.7601776123047, 259.27642822265625, -3.5835821628570557],
[271.9053649902344, 355.42230224609375, -13.86953353881836],
[262.9801330566406, 265.2060852050781, -13.379878044128418],
[261.7451171875, 256.13360595703125, -15.21743106842041],
[254.1462860107422, 214.2293701171875, -7.917967319488525],
[226.5474090576172, 248.1802978515625, 4.397981643676758],
[258.96881103515625, 234.41006469726562, -11.954970359802246],
[223.42657470703125, 268.39898681640625, 4.354741096496582],
[218.30630493164062, 262.5375061035156, 15.277050971984863],
[287.3190612792969, 390.28955078125, -12.718772888183594],
[277.6383361816406, 390.25811767578125, -9.428858757019043],
[270.2147216796875, 389.89691162109375, -5.206142902374268],
[280.3625793457031, 359.31280517578125, -13.175246238708496],
[260.6769714355469, 389.10101318359375, 4.097344875335693],
[265.0876770019531, 391.9786376953125, 0.5450502038002014],
[263.56988525390625, 389.233154296875, 3.215026617050171],
[283.59954833984375, 355.99798583984375, -23.133930206298828],
[273.831298828125, 391.17767333984375, -2.83559250831604],
[280.6111755371094, 392.79827880859375, -5.641749382019043],
[288.4439392089844, 394.3298034667969, -7.794321060180664],
[285.39361572265625, 419.3924560546875, -3.6910548210144043],
[286.5469055175781, 407.94586181640625, -9.087989807128906],
[287.1264343261719, 402.10638427734375, -9.677717208862305],
[287.7097473144531, 397.5296630859375, -8.232913970947266],
[288.3638916015625, 394.4990234375, -7.328562259674072],
[273.1569519042969, 391.9190673828125, -2.4163973331451416],
[272.00140380859375, 392.863525390625, -3.404341697692871],
[270.4002380371094, 395.2790832519531, -4.201334476470947],
[268.97186279296875, 398.7427978515625, -3.0564887523651123],
[261.5496520996094, 377.6202392578125, -4.561906337738037],
[208.38990783691406, 341.843505859375, 60.4583625793457],
[299.4404296875, 364.6637268066406, -20.27260971069336],
[268.68365478515625, 390.962158203125, 0.9632411003112793],
[267.039306640625, 390.95074462890625, 0.3911586403846741],
[288.13818359375, 365.7796630859375, -14.559393882751465],
[274.23095703125, 360.8743591308594, -8.985363006591797],
[286.8714904785156, 363.6372985839844, -14.74904727935791],
[265.48736572265625, 326.5911560058594, -4.6448774337768555],
[251.76707458496094, 332.0326232910156, -2.822591543197632],
[270.4385681152344, 350.0209045410156, -12.240896224975586],
[233.85556030273438, 223.589111328125, 2.7089765071868896],
[239.39208984375, 238.236572265625, -4.42526912689209],
[244.87533569335938, 254.8623809814453, -10.002897262573242],
[265.22491455078125, 407.65887451171875, 1.22976553440094],
[281.1024475097656, 259.059814453125, -17.505752563476562],
[279.076416015625, 234.2976531982422, -15.902700424194336],
[276.24664306640625, 210.18637084960938, -13.638851165771484],
[241.67332458496094, 303.75128173828125, 2.2142083644866943],
[223.1727294921875, 311.6500244140625, 11.184993743896484],
[275.61322021484375, 301.571044921875, -0.25392746925354004],
[231.55865478515625, 287.89373779296875, 4.009753704071045],
[280.60302734375, 315.60076904296875, -9.191849708557129],
[278.4223327636719, 349.4830322265625, -23.354150772094727],
[214.8749542236328, 317.93212890625, 18.03703498840332],
[228.37127685546875, 318.32843017578125, 6.394485950469971],
[238.5069580078125, 322.1074523925781, 1.3253782987594604],
[253.87966918945312, 321.7847595214844, -1.019113302230835],
[265.4759521484375, 318.6402587890625, -2.280043840408325],
[274.1865234375, 314.4884338378906, -3.8911330699920654],
[292.4798583984375, 302.9285888671875, -16.13489532470703],
[214.88638305664062, 337.95330810546875, 17.710662841796875],
[225.13983154296875, 285.28155517578125, 6.38761568069458],
[295.702392578125, 362.5097351074219, -28.182981491088867],
[274.95721435546875, 331.19805908203125, -8.871806144714355],
[207.11639404296875, 297.6207275390625, 52.586395263671875],
[280.7156677246094, 309.44769287109375, -4.95869255065918],
[269.312744140625, 350.0954284667969, -6.121389389038086],
[235.44454956054688, 295.1263122558594, 6.259592056274414],
[278.01800537109375, 342.5654296875, -21.40158462524414],
[210.79800415039062, 365.399658203125, 59.42163848876953],
[275.43280029296875, 298.0166015625, 0.9179220199584961],
[285.5798645019531, 337.59710693359375, -27.331464767456055],
[231.7576141357422, 413.05908203125, 25.253280639648438],
[233.0160675048828, 423.8658447265625, 36.63697814941406],
[208.47862243652344, 340.7737121582031, 38.883094787597656],
[221.52906799316406, 399.97509765625, 31.757829666137695],
[213.6818084716797, 279.5225830078125, 25.672266006469727],
[264.7817077636719, 447.0621032714844, 8.18415641784668],
[296.15985107421875, 364.0947265625, -19.977298736572266],
[267.06536865234375, 337.62939453125, -6.465585231781006],
[216.49720764160156, 299.90728759765625, 18.837560653686523],
[249.13270568847656, 300.2607727050781, 0.03242945671081543],
[256.260009765625, 301.32421875, -1.2465742826461792],
[263.11810302734375, 393.8223876953125, 1.631466031074524],
[215.19541931152344, 357.75103759765625, 20.998371124267578],
[279.1003723144531, 459.8443908691406, 10.745009422302246],
[255.84317016601562, 446.391845703125, 21.790172576904297],
[245.4600830078125, 437.13970947265625, 28.35423469543457],
[301.8525695800781, 235.36895751953125, -16.55525016784668],
[294.718994140625, 461.6861572265625, 9.564546585083008],
[263.12164306640625, 300.96978759765625, -1.3045413494110107],
[269.57427978515625, 299.65863037109375, -0.38703393936157227],
[273.557373046875, 298.83892822265625, 0.8548519015312195],
[219.5872802734375, 282.44073486328125, 12.060924530029297],
[268.46490478515625, 291.8851318359375, -1.8388075828552246],
[261.52191162109375, 289.46514892578125, -3.1275906562805176],
[254.54998779296875, 288.80987548828125, -3.072970151901245],
[247.4393310546875, 289.94580078125, -1.6783688068389893],
[242.81747436523438, 292.0097351074219, 0.2838176190853119],
[208.8702850341797, 274.3497009277344, 41.36160659790039],
[244.23309326171875, 298.69769287109375, 1.804038643836975],
[298.62164306640625, 373.186767578125, -13.963418006896973],
[269.7718811035156, 373.5728759765625, -8.293177604675293],
[278.4598693847656, 356.54974365234375, -17.04210090637207],
[286.76055908203125, 372.9639587402344, -13.735464096069336],
[300.5703430175781, 287.6749267578125, -14.707551002502441],
[243.18748474121094, 426.1807556152344, 20.269384384155273],
[253.70654296875, 436.7740173339844, 14.615986824035645],
[278.7491455078125, 454.0180358886719, 2.783529043197632],
[223.41943359375, 409.1480407714844, 46.64860916137695],
[273.295654296875, 295.4744873046875, -0.2415575236082077],
[286.662353515625, 318.736572265625, -17.20730972290039],
[295.2564392089844, 455.72515869140625, 1.9054080247879028],
[266.687744140625, 454.40679931640625, 14.910948753356934],
[210.3699951171875, 362.27655029296875, 39.50703430175781],
[280.1830139160156, 393.1881103515625, -5.211543083190918],
[278.9965515136719, 395.3263244628906, -6.268320083618164],
[277.913330078125, 399.03558349609375, -7.276910305023193],
[277.0343322753906, 404.3016052246094, -6.438044548034668],
[274.2063293457031, 414.5286560058594, -1.941462516784668],
[266.2420349121094, 390.5473937988281, -0.016497928649187088],
[263.9146728515625, 389.5981140136719, -0.122717946767807],
[261.697265625, 388.1065979003906, -0.32760918140411377],
[254.43064880371094, 383.03460693359375, 0.07330796122550964],
[224.68130493164062, 362.9518737792969, 9.443501472473145],
[286.69403076171875, 308.6907653808594, -12.258654594421387],
[282.09661865234375, 290.51287841796875, -3.41546368598938],
[276.9400939941406, 292.6988525390625, -1.3320412635803223],
[268.1077880859375, 389.6227722167969, 0.5624357461929321],
[223.75128173828125, 386.07598876953125, 19.757707595825195],
[289.62872314453125, 289.4853515625, -10.93774127960205],
[269.7876281738281, 425.84527587890625, 1.3286749124526978],
[300.6136169433594, 322.39208984375, -27.500526428222656],
[292.91748046875, 313.90081787109375, -21.51654815673828],
[300.5587158203125, 311.93096923828125, -22.738204956054688],
[280.29046630859375, 333.8995361328125, -16.479372024536133],
[295.7247314453125, 445.8623046875, -2.1188454627990723],
[296.0556945800781, 432.5225830078125, -3.0110890865325928],
[282.57476806640625, 431.73980712890625, -2.0836141109466553],
[251.35142517089844, 405.6207580566406, 7.441960334777832],
[262.2080383300781, 357.1605529785156, -4.383188247680664],
[259.9346008300781, 417.1344909667969, 4.783696174621582],
[242.74911499023438, 355.18365478515625, -2.364675521850586],
[253.80038452148438, 366.0096435546875, -2.616335391998291],
[235.05438232421875, 370.0333251953125, 3.2513437271118164],
[279.8734130859375, 444.51654052734375, -1.0067998170852661],
[274.849365234375, 338.7448425292969, -12.030640602111816],
[245.11904907226562, 414.4852600097656, 13.113565444946289],
[255.70986938476562, 426.4257507324219, 9.530975341796875],
[244.17300415039062, 393.1248779296875, 7.200636863708496],
[216.7993927001953, 374.4271545410156, 24.227380752563477],
[234.30810546875, 396.002685546875, 12.771589279174805],
[213.98880004882812, 382.0549011230469, 38.41045379638672],
[246.35986328125, 376.63067626953125, 0.888126015663147],
[280.9052429199219, 324.9044189453125, -12.69654655456543],
[281.0602722167969, 354.3194580078125, -24.474390029907227],
[275.0966796875, 355.4166259765625, -17.8099422454834],
[285.320556640625, 348.15753173828125, -28.79677391052246],
[275.7753601074219, 282.3512268066406, -5.865403652191162],
[262.84906005859375, 276.986083984375, -7.439082622528076],
[251.5946044921875, 275.62396240234375, -7.277249336242676],
[242.0721435546875, 276.72552490234375, -4.872464179992676],
[235.13790893554688, 280.58404541015625, -1.1335917711257935],
[230.14804077148438, 296.7254333496094, 8.689035415649414],
[207.88185119628906, 319.94415283203125, 36.222721099853516],
[235.922607421875, 309.73529052734375, 4.900608539581299],
[244.2236785888672, 312.7978515625, 1.6990026235580444],
[254.93817138671875, 313.5443420410156, -0.43692925572395325],
[265.19036865234375, 311.93426513671875, -1.4867429733276367],
[273.19464111328125, 308.98016357421875, -1.5398086309432983],
[278.6622009277344, 305.7724609375, -1.9914441108703613],
[207.6420135498047, 319.61761474609375, 58.40398025512695],
[275.00689697265625, 357.35009765625, -14.697525024414062],
[286.7452087402344, 327.8433837890625, -21.438478469848633],
[287.3891296386719, 355.6502990722656, -28.812564849853516],
[291.53106689453125, 360.39251708984375, -25.9072322845459],
[287.0721435546875, 356.9381103515625, -25.85338020324707],
[277.0426025390625, 360.0472412109375, -12.39292049407959],
[293.08709716796875, 361.5616455078125, -27.419021606445312],
[293.50030517578125, 363.1676025390625, -20.14118003845215],
[278.35089111328125, 298.6317138671875, 0.2076733261346817],
[283.0218811035156, 300.48175048828125, -3.057471752166748],
[285.76177978515625, 301.8895263671875, -6.940402507781982],
[240.08578491210938, 293.5745849609375, 2.3983771800994873],
[236.07052612304688, 289.68572998046875, 2.4990200996398926],
[307.3732604980469, 324.0601806640625, -25.065885543823242],
[356.67523193359375, 299.8014831542969, 7.595158100128174],
[306.9847412109375, 361.759521484375, -19.91704750061035],
[381.818603515625, 260.7698059082031, 34.44782638549805],
[333.31622314453125, 307.80841064453125, 0.8499112725257874],
[341.2498779296875, 308.71881103515625, 1.6960941553115845],
[348.78326416015625, 308.2080078125, 3.661770820617676],
[359.02825927734375, 303.1348876953125, 8.94857120513916],
[326.7879638671875, 305.22027587890625, 1.1685311794281006],
[345.2674560546875, 284.56524658203125, -2.0088536739349365],
[336.768798828125, 285, -2.4163801670074463],
[353.04400634765625, 285.9664001464844, 0.45641767978668213],
[358.04010009765625, 289.2410583496094, 3.284507989883423],
[364.31390380859375, 308.7838134765625, 12.568134307861328],
[324.36669921875, 437.7641906738281, 6.122448921203613],
[359.4388427734375, 297.6155700683594, 9.600309371948242],
[382.962158203125, 303.8727111816406, 39.76386260986328],
[372.3107604980469, 302.26690673828125, 18.538833618164062],
[339.4228515625, 346.74981689453125, -2.363318920135498],
[308.92352294921875, 385.3271789550781, -13.11467456817627],
[307.30987548828125, 394.150146484375, -9.700993537902832],
[319.6434326171875, 386.7612609863281, -8.919146537780762],
[326.3415832519531, 388.61492919921875, -3.6562552452087402],
[315.2393798828125, 393.47552490234375, -6.758571624755859],
[321.29876708984375, 393.0090026855469, -2.0756425857543945],
[333.91412353515625, 401.28338623046875, 6.845234394073486],
[306.9276123046875, 357.91748046875, -30.962732315063477],
[308.24560546875, 347.8184814453125, -33.25374221801758],
[370.2144775390625, 277.15875244140625, 4.948965549468994],
[323.48406982421875, 322.86029052734375, -5.0297932624816895],
[325.33209228515625, 353.02862548828125, -15.71037483215332],
[325.71063232421875, 347.51788330078125, -14.104110717773438],
[362.6228332519531, 345.078369140625, 6.643834114074707],
[307.93426513671875, 334.89654541015625, -30.296648025512695],
[353.20819091796875, 266.5593566894531, -6.758531093597412],
[363.6017150878906, 269.9488830566406, -1.3440293073654175],
[376.6258544921875, 242.72125244140625, 21.28090476989746],
[318.34912109375, 274.029541015625, -13.134204864501953],
[329.233642578125, 287.79913330078125, -0.8236775398254395],
[341.02166748046875, 391.9947509765625, 8.104843139648438],
[369.6722412109375, 392.50140380859375, 61.400611877441406],
[319.373779296875, 358.50640869140625, -13.441617965698242],
[312.39410400390625, 361.8641357421875, -13.971587181091309],
[333.64019775390625, 390.7327880859375, 7.61594820022583],
[329.98028564453125, 390.59906005859375, 5.84257173538208],
[367.95550537109375, 262.7685852050781, 1.2506029605865479],
[325.44000244140625, 356.60809326171875, -12.187370300292969],
[338.5452880859375, 267.15838623046875, -10.905488967895508],
[340.33306884765625, 258.23284912109375, -12.713081359863281],
[348.302978515625, 217.42800903320312, -4.553675651550293],
[372.1968078613281, 252.34613037109375, 9.78996753692627],
[343.51422119140625, 236.95462036132812, -9.055185317993164],
[374.4295654296875, 272.2535705566406, 9.881559371948242],
[378.1052551269531, 267.1137390136719, 21.304649353027344],
[308.3089599609375, 390.70428466796875, -12.006296157836914],
[317.1768798828125, 390.987548828125, -8.017443656921387],
[323.79833984375, 391.0067138671875, -3.2889156341552734],
[317.25225830078125, 360.08978271484375, -12.160839080810547],
[331.86663818359375, 390.61322021484375, 6.680799961090088],
[327.66259765625, 393.31414794921875, 2.7461254596710205],
[328.9090576171875, 390.6084289550781, 5.631084442138672],
[315.3644104003906, 356.60345458984375, -21.98170280456543],
[319.64178466796875, 392.15325927734375, -1.1716930866241455],
[313.44720458984375, 393.4586486816406, -4.418369770050049],
[306.0958251953125, 394.66497802734375, -7.112936019897461],
[307.0981750488281, 419.7776184082031, -2.9867327213287354],
[307.0517272949219, 408.3765563964844, -8.33465576171875],
[306.98052978515625, 402.5163269042969, -8.902058601379395],
[306.64788818359375, 397.8790283203125, -7.4810791015625],
[306.0570983886719, 394.83721923828125, -6.573723793029785],
[320.11328125, 392.8348388671875, -0.750707745552063],
[321.2628173828125, 393.8656311035156, -1.6959993839263916],
[322.7669982910156, 396.33990478515625, -2.4832804203033447],
[323.917724609375, 399.8404541015625, -1.2069100141525269],
[333.12835693359375, 379.15460205078125, -2.201312780380249],
[378.8597717285156, 345.8829040527344, 67.32080841064453],
[324.14459228515625, 392.10662841796875, 3.0477957725524902],
[325.8373107910156, 392.2274475097656, 2.5118913650512695],
[309.4422607421875, 366.2791748046875, -13.972805976867676],
[322.49346923828125, 362.0115661621094, -7.678974151611328],
[310.86614990234375, 364.2325134277344, -14.162775993347168],
[331.717041015625, 328.252197265625, -2.210709810256958],
[344.65142822265625, 334.338623046875, 0.47783684730529785],
[326.8472900390625, 351.3416748046875, -10.444955825805664],
[366.27752685546875, 227.95407104492188, 7.6168999671936035],
[361.3927001953125, 241.8026885986328, -0.1350962221622467],
[356.2882080078125, 257.7562255859375, -6.220260143280029],
[326.7144775390625, 408.7587585449219, 3.371832847595215],
[321.48876953125, 260.19677734375, -16.227548599243164],
[324.25311279296875, 235.73077392578125, -14.394697189331055],
[327.57879638671875, 212.00201416015625, -11.954652786254883],
[355.3073425292969, 306.49041748046875, 6.494428634643555],
[371.68927001953125, 315.40301513671875, 16.618350982666016],
[322.81280517578125, 302.6331787109375, 1.7007064819335938],
[365.780029296875, 291.1285095214844, 8.933826446533203],
[318.10748291015625, 316.57489013671875, -7.726454257965088],
[320.6505126953125, 350.390625, -21.980348587036133],
[378.52520751953125, 322.00885009765625, 24.170019149780273],
[366.93524169921875, 321.79217529296875, 11.436684608459473],
[357.4869689941406, 325.15869140625, 5.6696953773498535],
[342.8868408203125, 324.0008544921875, 2.3119006156921387],
[331.87579345703125, 320.30194091796875, 0.25034573674201965],
[323.7598876953125, 315.7703857421875, -1.982524037361145],
[308.10546875, 303.3229675292969, -15.518848419189453],
[377.65325927734375, 341.747314453125, 23.78961944580078],
[371.64019775390625, 288.90704345703125, 11.829926490783691],
[303.86749267578125, 362.6624755859375, -27.897249221801758],
[322.88385009765625, 332.43109130859375, -7.141077995300293],
[382.97076416015625, 302.5579528808594, 59.73387145996094],
[317.8991394042969, 310.38824462890625, -3.501786231994629],
[327.3390197753906, 351.4356689453125, -4.344942569732666],
[361.591552734375, 298.120849609375, 10.992892265319824],
[320.9140625, 343.58575439453125, -20.00631332397461],
[375.4109802246094, 368.93756103515625, 65.99598693847656],
[323.0166320800781, 299.0319519042969, 2.9272162914276123],
[314.5860290527344, 338.2750244140625, -26.292192459106445],
[356.2896728515625, 414.80413818359375, 29.786441802978516],
[353.1893615722656, 425.3591613769531, 41.277565002441406],
[381.3948974609375, 344.77032470703125, 45.5704231262207],
[366.114990234375, 402.3834228515625, 37.07483673095703],
[380.6361389160156, 284.1849365234375, 32.13893508911133],
[324.7380065917969, 447.59088134765625, 10.31078052520752],
[302.6345520019531, 364.2626647949219, -19.767332077026367],
[329.860595703125, 339.1981201171875, -4.306419849395752],
[377.75982666015625, 303.9954833984375, 24.840557098388672],
[348.72662353515625, 302.6435546875, 3.7496886253356934],
[341.731201171875, 303.3505859375, 2.0609114170074463],
[329.43316650390625, 395.2054443359375, 3.9594509601593018],
[375.923828125, 361.1905212402344, 26.88157844543457],
[310.0873107910156, 460.0473327636719, 11.899538040161133],
[331.9680480957031, 447.0196838378906, 24.759647369384766],
[341.5283508300781, 438.0824890136719, 32.1016960144043],
[334.96044921875, 302.6367492675781, 1.4755160808563232],
[328.69384765625, 300.9761962890625, 2.033987283706665],
[324.81878662109375, 299.9778137207031, 3.052812337875366],
[376.3876647949219, 286.4664306640625, 17.91488265991211],
[330.051025390625, 293.26513671875, 0.6276898980140686],
[336.9576416015625, 291.23876953125, -0.24208274483680725],
[343.93206787109375, 290.8462829589844, 0.3155216872692108],
[350.867919921875, 292.2984619140625, 2.1698615550994873],
[355.1660461425781, 294.61590576171875, 4.397724151611328],
[383.58807373046875, 279.548583984375, 48.35405349731445],
[353.4559326171875, 301.2651062011719, 5.846395969390869],
[325.9066467285156, 374.74859619140625, -6.504605293273926],
[319.656494140625, 357.40264892578125, -15.848856925964355],
[310.1542053222656, 373.465087890625, -12.970613479614258],
[345.263427734375, 427.4197998046875, 23.920984268188477],
[335.1993408203125, 437.513916015625, 17.505901336669922],
[311.4644470214844, 454.2825012207031, 3.926825523376465],
[362.0497131347656, 411.3240966796875, 52.155921936035156],
[325.20245361328125, 296.5793151855469, 1.9624319076538086],
[313.1584167480469, 319.390869140625, -16.205463409423828],
[321.92657470703125, 454.7729187011719, 17.1419734954834],
[378.24371337890625, 365.84832763671875, 45.87765121459961],
[313.75372314453125, 393.8746337890625, -3.938037157058716],
[314.8427734375, 396.027587890625, -4.977667808532715],
[315.6759948730469, 399.723876953125, -5.9359869956970215],
[316.2149658203125, 405.08477783203125, -5.035343170166016],
[317.9674072265625, 415.27899169921875, -0.34057602286338806],
[326.77056884765625, 391.82421875, 2.174017906188965],
[329.22265625, 390.9358825683594, 2.294630527496338],
[331.4928283691406, 389.49554443359375, 2.192715644836426],
[339.0069580078125, 384.77569580078125, 2.977928876876831],
[367.70367431640625, 366.0517578125, 14.414066314697266],
[312.97625732421875, 309.38580322265625, -11.222635269165039],
[317.3673400878906, 291.33135986328125, -2.129173994064331],
[322.009765625, 293.80670166015625, 0.5677414536476135],
[324.796142578125, 390.81390380859375, 2.6979939937591553],
[366.18212890625, 388.74053955078125, 24.754619598388672],
[310.79144287109375, 289.9751892089844, -10.173527717590332],
[321.41802978515625, 426.5231628417969, 3.075554847717285],
[307.807373046875, 314.2569885253906, -21.006572723388672],
[318.476806640625, 334.8522033691406, -15.173004150390625],
[309.13702392578125, 432.0695495605469, -1.2716456651687622],
[339.7491149902344, 407.15130615234375, 10.460354804992676],
[333.603271484375, 358.87530517578125, -2.1252334117889404],
[331.00543212890625, 418.21185302734375, 7.167931079864502],
[352.12615966796875, 357.6951599121094, 1.217620849609375],
[341.0467529296875, 367.9482421875, 0.2293931543827057],
[358.05242919921875, 372.63299560546875, 7.3089141845703125],
[311.1943054199219, 444.88116455078125, 0.08458244800567627],
[322.95361328125, 339.92236328125, -10.42269515991211],
[344.79071044921875, 415.96343994140625, 16.583690643310547],
[334.338134765625, 427.4009704589844, 12.199787139892578],
[347.4801025390625, 395.11376953125, 10.842185020446777],
[373.0355224609375, 377.535400390625, 29.82500648498535],
[356.07659912109375, 398.1593933105469, 17.007970809936523],
[373.7404479980469, 385.13348388671875, 44.442726135253906],
[347.0653991699219, 378.772705078125, 4.24334716796875],
[317.87005615234375, 325.85968017578125, -11.319250106811523],
[317.9876708984375, 355.0179138183594, -23.249361038208008],
[322.93359375, 356.45257568359375, -16.41042709350586],
[314.8368835449219, 348.8318176269531, -27.80367660522461],
[324.2010498046875, 283.498779296875, -4.098787307739258],
[337.25775146484375, 278.7808837890625, -4.839216232299805],
[348.373779296875, 277.998291015625, -3.796363115310669],
[357.41845703125, 279.5406494140625, -0.7076868414878845],
[363.39544677734375, 283.70416259765625, 3.515821933746338],
[366.15875244140625, 300.0559997558594, 13.776080131530762],
[383.0858154296875, 324.3414306640625, 43.073463439941406],
[360.28375244140625, 312.86663818359375, 9.544275283813477],
[352.3401184082031, 315.5252990722656, 5.716311931610107],
[342.1090087890625, 315.728759765625, 2.8683881759643555],
[332.3074645996094, 313.54278564453125, 1.0963972806930542],
[324.771484375, 310.1976318359375, 0.4078766107559204],
[319.69049072265625, 306.7348937988281, -0.4225405752658844],
[380.8294677734375, 324.1416931152344, 65.51505279541016],
[322.54266357421875, 358.4033508300781, -13.312748908996582],
[313.2991943359375, 328.52197265625, -20.393056869506836],
[312.4696350097656, 356.1797180175781, -27.984386444091797],
[307.6595458984375, 360.6966552734375, -25.45814323425293],
[312.2298583984375, 357.42681884765625, -25.0369873046875],
[320.1729431152344, 361.0259094238281, -11.240046501159668],
[306.3169860839844, 361.8370056152344, -27.032991409301758],
[305.1815490722656, 363.4141845703125, -19.843814849853516],
[320.2969055175781, 299.5377197265625, 1.8979803323745728],
[315.833740234375, 301.26409912109375, -1.7907793521881104],
[313.56158447265625, 302.59619140625, -5.894857406616211],
[357.62335205078125, 296.29754638671875, 6.705108642578125],
[361.6152038574219, 292.66925048828125, 7.069137096405029]
]
export default {
debugPoints
}
================================================
FILE: src/three.js
================================================
import * as THREE from 'three'
import { OBJLoader } from './vendor/OBJLoader'
import simplify from 'simplify-js'
let camera
let scene
let renderer
let videoTexture
let baseMesh
let raycaster
let currPlane
const planes = []
const planeWidth = 1024
const planeHeight = 1024
const params = {
debug: false,
color: '#ffffff',
thickness: 20,
smooth: 1.5
}
async function init(video) {
// Initialize camera.
const width = video ? video.width : 640
const height = video ? video.height : 640
const ratio = width / height
const fov = 50
const near = 1
const far = 5000
camera = new THREE.PerspectiveCamera(fov, ratio, near, far)
camera.position.z = height
camera.position.x = -width / 2
camera.position.y = -height / 2
// Initialize renderer.
renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true })
renderer.setPixelRatio(window.devicePixelRatio)
renderer.setSize(width, height)
// Initialize scene.
scene = new THREE.Scene()
if (video) {
addVideoSprite(video)
}
// Init Raycaster.
raycaster = new THREE.Raycaster()
// addDebugMesh()
await addFBXMesh()
return renderer.domElement
}
function alignPlane(plane) {
const vertices = baseMesh.geometry.vertices
const centroid = new THREE.Vector3()
plane.mesh.position.set(0, 0, 0)
plane.mesh.lookAt(plane.face.normal)
centroid.add(vertices[plane.face.a])
centroid.add(vertices[plane.face.b])
centroid.add(vertices[plane.face.c])
centroid.divideScalar(3)
const centroidWithOffset = centroid
.clone()
.add(plane.face.normal.multiplyScalar(-10))
plane.mesh.position.copy(centroidWithOffset)
if (params.debug) {
plane.debug.position.copy(plane.mesh.position)
plane.debug.rotation.copy(plane.mesh.rotation)
}
}
function update(facemesh) {
// Update the video sprite.
if (videoTexture) {
videoTexture.needsUpdate = true
}
if (baseMesh) {
for (let i = 0; i < facemesh.length; i++) {
const [x, y, z] = facemesh[i]
baseMesh.geometry.vertices[i].set(x - 640, -y, -z)
}
baseMesh.geometry.verticesNeedUpdate = true
baseMesh.geometry.normalsNeedUpdate = true
baseMesh.geometry.computeBoundingSphere()
baseMesh.geometry.computeFaceNormals()
baseMesh.geometry.computeVertexNormals()
}
for (const plane of planes) {
alignPlane(plane)
}
// Render.
renderer.render(scene, camera)
}
function addVideoSprite(video) {
videoTexture = new THREE.Texture(video)
videoTexture.minFilter = THREE.LinearFilter
const videoSprite = new THREE.Sprite(
new THREE.MeshBasicMaterial({
map: videoTexture,
depthWrite: false
})
)
const width = video.width
const height = video.height
videoSprite.center.set(0.5, 0.5)
videoSprite.scale.set(width, height, 1)
videoSprite.position.copy(camera.position)
videoSprite.position.z = 0
scene.add(videoSprite)
}
function addFBXMesh() {
const loader = new OBJLoader()
return new Promise((resolve, reject) => {
loader.load('facemesh.obj', obj => {
obj.traverse(child => {
if (child instanceof THREE.Mesh) {
const mat = new THREE.MeshNormalMaterial({
side: THREE.DoubleSide
})
if (!params.debug) {
mat.transparent = true
mat.opacity = 0
}
baseMesh = new THREE.Mesh(child.geometry, mat)
scene.add(baseMesh)
resolve()
}
})
})
})
}
function draw(pt) {
// Raycase draw point.
const x = (pt.x / renderer.domElement.clientWidth) * 2 - 1
const y = -(pt.y / renderer.domElement.clientHeight) * 2 + 1
raycaster.setFromCamera(new THREE.Vector2(x, y), camera)
if (currPlane) {
const intersects = raycaster.intersectObject(currPlane.mesh)
if (intersects.length) {
// Add intersection UV to the list of points.
let { x, y } = intersects[0].uv
x = x * planeWidth
y = (1 - y) * planeHeight
currPlane.points.push({ x, y })
// Simplify path to smooth out the line.
const pts = simplify(currPlane.points, params.smooth)
// const pts = currPlane.points
// Draw using Quadratic Curve
const ctx = currPlane.ctx
ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height)
// for (let i = 0; i < pts.length - 2; i++) {
// ctx.beginPath()
// ctx.moveTo(pts[i].x, pts[i].y)
// const pct = (i + 1) / pts.length
// ctx.lineWidth = Math.sin(pct * Math.PI) * params.thickness
// ctx.lineTo(pts[i + 1].x, pts[i + 1].y)
// ctx.stroke()
// }
if (currPlane.points.length < 3) {
ctx.arc(x, y, params.thickness / 2, 0, Math.PI * 2, !0)
ctx.fill()
ctx.closePath()
} else {
ctx.beginPath()
ctx.lineWidth = params.thickness
let i = 0
ctx.moveTo(pts[i].x, pts[i].y)
for (i; i < pts.length - 2; i++) {
const c = {
x: (pts[i].x + pts[i + 1].x) / 2,
y: (pts[i].y + pts[i + 1].y) / 2
}
ctx.quadraticCurveTo(pts[i].x, pts[i].y, c.x, c.y)
}
ctx.quadraticCurveTo(pts[i].x, pts[i].y, pts[i + 1].x, pts[i + 1].y)
ctx.stroke()
}
currPlane.mesh.material.map.needsUpdate = true
}
} else {
baseMesh.geometry.verticesNeedUpdate = true
baseMesh.geometry.normalsNeedUpdate = true
baseMesh.geometry.computeBoundingSphere()
baseMesh.geometry.computeFaceNormals()
baseMesh.geometry.computeVertexNormals()
const intersects = raycaster.intersectObject(baseMesh)
if (intersects.length) {
const face = intersects[0].face
const position = intersects[0].point
const uv = intersects[0].uv
const plane = createDrawingPlane(position, face, uv)
planes.push(plane)
scene.add(plane.mesh)
currPlane = plane
}
}
}
function end() {
currPlane = null
}
function undo() {
end()
if (planes.length) {
const plane = planes.pop()
scene.remove(plane.mesh)
scene.remove(plane.debug)
}
}
function clear() {
end()
for (const plane of planes) {
scene.remove(plane.mesh)
scene.remove(plane.debug)
}
planes.splice(0, planes.length)
}
function setDebug(value) {
params.debug = value
if (params.debug) {
baseMesh.material.transparent = false
baseMesh.material.opacity = 1
for (const plane of planes) {
scene.add(plane.debug)
}
} else {
baseMesh.material.transparent = true
baseMesh.material.opacity = 0
for (const plane of planes) {
scene.remove(plane.debug)
}
}
}
function isOverFace(pt) {
// Raycase draw point.
const x = (pt.x / renderer.domElement.clientWidth) * 2 - 1
const y = -(pt.y / renderer.domElement.clientHeight) * 2 + 1
raycaster.setFromCamera(new THREE.Vector2(x, y), camera)
const intersects = raycaster.intersectObject(baseMesh)
if (intersects.length) {
return true
}
return false
}
function createDrawingPlane(position, face, uv) {
const width = planeWidth
const height = planeHeight
// Create Canvas.
const canvas = document.createElement('canvas')
canvas.width = width
canvas.height = height
const ctx = canvas.getContext('2d')
ctx.strokeStyle = params.color
ctx.lineCap = 'round'
ctx.lineJoin = 'round'
ctx.lineWidth = params.thickness
// Create Texture.
const texture = new THREE.CanvasTexture(canvas)
// Create Mesh.
const geom = new THREE.PlaneGeometry(width / 2, height / 2, 1, 1)
const mat = new THREE.MeshBasicMaterial({
map: texture,
side: THREE.DoubleSide,
transparent: true,
depthWrite: false
})
const mesh = new THREE.Mesh(geom, mat)
// Create an object that will contain some debug helpers.
const debugObj = new THREE.Object3D()
const plane = {
mesh,
face,
ctx,
points: [],
debug: debugObj
}
alignPlane(plane)
// Add Debug Helper.
const helper = new THREE.AxesHelper(50)
debugObj.add(helper)
// Add Debug Grid.
const pgeom = new THREE.PlaneGeometry(30, 30, 3, 3)
const pmat = new THREE.MeshBasicMaterial({
color: '#ffffff',
wireframe: true
})
const debugPlane = new THREE.Mesh(pgeom, pmat)
debugObj.add(debugPlane)
if (params.debug) {
debugObj.lookAt(face.normal)
debugObj.position.copy(plane.mesh.position)
scene.add(debugObj)
}
return plane
}
export default {
init,
update,
draw,
end,
undo,
clear,
params,
isOverFace,
setDebug
}
================================================
FILE: src/triangulation.js
================================================
/**
* @license
* Copyright 2020 Google LLC. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================================
*/
export const 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];
================================================
FILE: src/vendor/OBJLoader.js
================================================
import * as THREE from 'three';
const OBJLoader = function (manager) {
this.manager = (manager !== undefined) ? manager : THREE.DefaultLoadingManager;
};
OBJLoader.prototype = {
constructor: OBJLoader,
load: function (url, onLoad, onProgress, onError) {
var scope = this;
var loader = new THREE.FileLoader(scope.manager);
loader.setCrossOrigin(this.crossOrigin);
loader.load(url, function (text) {
onLoad(scope.parse(text));
});
},
parse: function (text) {
function vector(x, y, z) {
return new THREE.Vector3(parseFloat(x), parseFloat(y), parseFloat(z));
}
function uv(u, v) {
return new THREE.Vector2(parseFloat(u), parseFloat(v));
}
function face3(a, b, c, normals) {
return new THREE.Face3(a, b, c, normals);
}
var object = new THREE.Object3D();
var geometry, material, mesh;
function parseVertexIndex(index) {
index = parseInt(index);
return index >= 0 ? index - 1 : index + vertices.length;
}
function parseNormalIndex(index) {
index = parseInt(index);
return index >= 0 ? index - 1 : index + normals.length;
}
function parseUVIndex(index) {
index = parseInt(index);
return index >= 0 ? index - 1 : index + uvs.length;
}
function add_face(a, b, c, normals_inds) {
if (normals_inds === undefined) {
geometry.faces.push(face3(
vertices[parseVertexIndex(a)] - 1,
vertices[parseVertexIndex(b)] - 1,
vertices[parseVertexIndex(c)] - 1
));
} else {
geometry.faces.push(face3(
vertices[parseVertexIndex(a)] - 1,
vertices[parseVertexIndex(b)] - 1,
vertices[parseVertexIndex(c)] - 1,
[
normals[parseNormalIndex(normals_inds[0])].clone(),
normals[parseNormalIndex(normals_inds[1])].clone(),
normals[parseNormalIndex(normals_inds[2])].clone()
]
));
}
}
function add_uvs(a, b, c) {
geometry.faceVertexUvs[0].push([
uvs[parseUVIndex(a)].clone(),
uvs[parseUVIndex(b)].clone(),
uvs[parseUVIndex(c)].clone()
]);
}
function handle_face_line(faces, uvs, normals_inds) {
if (faces[3] === undefined) {
add_face(faces[0], faces[1], faces[2], normals_inds);
if (uvs !== undefined && uvs.length > 0) {
add_uvs(uvs[0], uvs[1], uvs[2]);
}
} else {
if (normals_inds !== undefined && normals_inds.length > 0) {
add_face(faces[0], faces[1], faces[3], [normals_inds[0], normals_inds[1], normals_inds[3]]);
add_face(faces[1], faces[2], faces[3], [normals_inds[1], normals_inds[2], normals_inds[3]]);
} else {
add_face(faces[0], faces[1], faces[3]);
add_face(faces[1], faces[2], faces[3]);
}
if (uvs !== undefined && uvs.length > 0) {
add_uvs(uvs[0], uvs[1], uvs[3]);
add_uvs(uvs[1], uvs[2], uvs[3]);
}
}
}
// create mesh if no objects in text
if (/^o /gm.test(text) === false) {
geometry = new THREE.Geometry();
material = new THREE.MeshLambertMaterial();
mesh = new THREE.Mesh(geometry, material);
object.add(mesh);
}
var vertices = [];
var normals = [];
var uvs = [];
// v float float float
var vertex_pattern = /v( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/;
// vn float float float
var normal_pattern = /vn( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/;
// vt float float
var uv_pattern = /vt( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/;
// f vertex vertex vertex ...
var face_pattern1 = /f( +-?\d+)( +-?\d+)( +-?\d+)( +-?\d+)?/;
// f vertex/uv vertex/uv vertex/uv ...
var face_pattern2 = /f( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))?/;
// f vertex/uv/normal vertex/uv/normal vertex/uv/normal ...
var face_pattern3 = /f( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))?/;
// f vertex//normal vertex//normal vertex//normal ...
var face_pattern4 = /f( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))?/
// fixes
text = text.replace(/\\\r?\n/g, ''); // handles line continuations \
var lines = text.split('\n');
for (var i = 0; i < lines.length; i++) {
var line = lines[i];
line = line.trim();
var result;
if (line.length === 0 || line.charAt(0) === '#') {
continue;
} else if ((result = vertex_pattern.exec(line)) !== null) {
// ["v 1.0 2.0 3.0", "1.0", "2.0", "3.0"]
vertices.push(
geometry.vertices.push(
vector(
result[1], result[2], result[3]
)
)
);
} else if ((result = normal_pattern.exec(line)) !== null) {
// ["vn 1.0 2.0 3.0", "1.0", "2.0", "3.0"]
normals.push(
vector(
result[1], result[2], result[3]
)
);
} else if ((result = uv_pattern.exec(line)) !== null) {
// ["vt 0.1 0.2", "0.1", "0.2"]
uvs.push(
uv(
result[1], result[2]
)
);
} else if ((result = face_pattern1.exec(line)) !== null) {
// ["f 1 2 3", "1", "2", "3", undefined]
handle_face_line(
[result[1], result[2], result[3], result[4]]
);
} else if ((result = face_pattern2.exec(line)) !== null) {
// ["f 1/1 2/2 3/3", " 1/1", "1", "1", " 2/2", "2", "2", " 3/3", "3", "3", undefined, undefined, undefined]
handle_face_line(
[result[2], result[5], result[8], result[11]], //faces
[result[3], result[6], result[9], result[12]] //uv
);
} else if ((result = face_pattern3.exec(line)) !== null) {
// ["f 1/1/1 2/2/2 3/3/3", " 1/1/1", "1", "1", "1", " 2/2/2", "2", "2", "2", " 3/3/3", "3", "3", "3", undefined, undefined, undefined, undefined]
handle_face_line(
[result[2], result[6], result[10], result[14]], //faces
[result[3], result[7], result[11], result[15]], //uv
[result[4], result[8], result[12], result[16]] //normal
);
} else if ((result = face_pattern4.exec(line)) !== null) {
// ["f 1//1 2//2 3//3", " 1//1", "1", "1", " 2//2", "2", "2", " 3//3", "3", "3", undefined, undefined, undefined]
handle_face_line(
[result[2], result[5], result[8], result[11]], //faces
[], //uv
[result[3], result[6], result[9], result[12]] //normal
);
} else if (/^o /.test(line)) {
geometry = new THREE.Geometry();
material = new THREE.MeshLambertMaterial();
mesh = new THREE.Mesh(geometry, material);
mesh.name = line.substring(2).trim();
object.add(mesh);
} else if (/^g /.test(line)) {
// group
} else if (/^usemtl /.test(line)) {
// material
material.name = line.substring(7).trim();
} else if (/^mtllib /.test(line)) {
// mtl file
} else if (/^s /.test(line)) {
// smooth shading
} else {
// console.log( "THREE.OBJLoader: Unhandled line " + line );
}
}
var children = object.children;
for (var i = 0, l = children.length; i < l; i++) {
var geometry = children[i].geometry;
geometry.computeFaceNormals();
geometry.computeBoundingSphere();
}
return object;
}
};
export { OBJLoader }
================================================
FILE: static/facemesh.obj
================================================
# Blender v2.82 (sub 7) OBJ File: 'facemesh.blend'
# www.blender.org
mtllib facemesh.mtl
o New_Object_Mesh
v -0.391703 -30.513420 2.929656
v -0.327589 -13.526743 20.004915
v -0.277804 -19.081829 4.867016
v 4.676590 7.354108 12.994000
v -0.341671 -7.029040 22.194536
v -0.256098 1.456693 20.194050
v 0.042588 21.398129 5.349126
v 40.740379 22.225311 -17.598557
v 0.153374 35.699390 1.791313
v 0.168240 44.109463 3.275271
v 0.305854 75.679169 -1.215682
v -0.401943 -33.307640 1.980729
v -0.353038 -35.152973 0.271872
v -0.298869 -35.372543 -2.202204
v -0.383511 -43.380497 -4.554055
v -0.380759 -45.765694 -3.531934
v -0.375800 -48.769741 -2.175002
v -0.346630 -52.423962 -2.879055
v -0.210762 -58.960518 -7.838552
v -0.312770 -16.804180 16.935862
v 5.330989 -15.891883 8.959006
v 59.252075 45.024712 -42.973286
v 24.303938 17.272987 -12.049582
v 29.855165 16.900997 -12.405232
v 35.257412 17.248531 -13.901323
v 42.839596 20.181641 -18.603035
v 19.722767 18.600685 -12.644763
v 32.206211 31.506393 -9.249606
v 26.232580 31.091812 -9.459580
v 37.812805 30.680012 -11.180326
v 41.577534 28.681141 -13.608844
v 46.852428 16.752567 -21.682589
v 21.362268 -67.651222 -16.156527
v 42.811665 23.334782 -19.481913
v 61.226650 18.545483 -46.896729
v 52.608521 20.229435 -27.221169
v 29.815342 -5.982173 -7.366467
v 8.356757 -29.271130 2.429451
v 7.673128 -34.688419 -0.667224
v 17.319040 -29.935246 -1.448414
v 22.952820 -31.073929 -7.030187
v 14.271839 -34.198078 -3.557678
v 19.257126 -33.982254 -8.587597
v 28.898727 -41.488403 -17.926575
v 4.481228 -13.266599 19.543421
v 5.145666 -6.912517 21.565374
v 49.791157 35.510239 -14.748238
v 17.507236 8.069736 -6.102351
v 19.160110 -9.840832 5.476562
v 19.476845 -6.456553 3.765532
v 46.812027 -4.392895 -14.950462
v 4.913116 0.883450 18.439407
v 36.728039 41.949772 -4.671053
v 44.525261 39.921650 -9.190274
v 54.554008 56.340248 -31.316057
v 12.168645 36.842499 0.139669
v 21.087973 29.243511 -11.267314
v 33.790276 -33.987850 -18.535112
v 54.908672 -38.197388 -65.231491
v 15.004392 -13.357043 3.031813
v 9.891405 -15.715839 3.393411
v 29.438778 -33.590706 -18.662237
v 26.598118 -33.884201 -17.275576
v 47.538151 44.221828 -11.741336
v 19.731133 -11.971386 2.130724
v 26.163134 41.372887 -1.397717
v 27.206575 46.849468 0.161694
v 32.893444 72.052567 -8.644912
v 50.880817 50.548409 -20.260151
v 29.385611 60.140594 -4.011586
v 52.872715 38.334484 -19.436506
v 55.990223 41.354923 -30.659679
v 8.145041 -32.573151 1.370785
v 15.633457 -32.607052 -2.414984
v 21.087002 -32.570480 -7.420076
v 13.637033 -14.415978 1.735104
v 28.108210 -33.636101 -17.931772
v 24.640327 -37.758896 -14.705924
v 25.614784 -34.105255 -17.126053
v 11.325471 -12.454526 11.281258
v 18.158592 -33.391689 -9.437989
v 13.113791 -34.052814 -5.823841
v 7.035420 -34.890533 -3.074133
v 8.551800 -58.263882 -8.376295
v 8.117520 -51.452351 -3.529671
v 7.789455 -47.792210 -2.989572
v 7.386213 -44.795372 -4.471762
v 6.853819 -42.781071 -5.394631
v 18.273136 -39.374020 -11.351515
v 19.244640 -39.985825 -10.410431
v 20.545877 -41.436604 -9.717621
v 21.599977 -43.478828 -10.892609
v 26.958124 -25.780521 -8.247591
v 60.547493 -8.602262 -71.708138
v -0.285215 -17.898754 9.133472
v 21.623245 -37.560238 -15.056973
v 23.135502 -37.352428 -14.529606
v 7.850791 -18.531700 3.377678
v 18.058542 -15.315192 -2.432274
v 8.811674 -17.204643 3.581658
v 23.701252 5.113960 -8.232275
v 33.219639 1.894928 -9.990783
v 20.717361 -8.753664 0.313672
v 46.270363 65.615051 -19.235329
v 42.495056 57.160217 -11.583475
v 38.723221 47.277775 -5.392136
v 23.616018 -48.102921 -14.802400
v 13.989193 45.362541 2.778713
v 15.796125 60.751297 0.196890
v 18.052998 75.101227 -2.592651
v 40.062183 18.269352 -16.317156
v 52.394577 12.848121 -25.064829
v 16.895411 20.034092 -13.330769
v 47.300411 27.137192 -18.691217
v 13.305011 11.688559 -3.789199
v 15.077642 -8.380561 11.280568
v 57.830547 8.510499 -31.630203
v 48.881886 9.493465 -20.162457
v 42.076454 7.699603 -14.991509
v 31.559713 7.976216 -12.328252
v 23.547586 9.790773 -10.973671
v 17.586954 12.272169 -9.283197
v 5.507946 19.686798 2.973412
v 57.985950 -3.256486 -30.787766
v 51.468445 28.257584 -21.158148
v 2.615532 -16.443922 16.623390
v 17.341846 2.373301 -3.681009
v 62.193714 18.698460 -65.600105
v 13.219665 15.385485 -8.219237
v 21.440145 -8.843401 -5.797756
v 44.598610 23.065853 -20.604412
v 15.345642 -4.180233 9.180137
v 58.650524 -23.054722 -69.897934
v 17.130035 22.092831 -14.694052
v 10.108676 -1.131684 14.953390
v 44.606174 -51.371353 -37.042763
v 42.972649 -59.312057 -46.894756
v 61.575474 -6.646063 -51.200180
v 51.698292 -43.463940 -43.096886
v 58.667263 30.770981 -40.297688
v 21.775030 -74.430191 -19.471718
v 2.047860 -17.615932 8.766379
v 22.778292 -1.483693 -5.986648
v 56.802494 18.945831 -32.953720
v 34.930332 20.698803 -14.234451
v 30.001928 20.254974 -12.861559
v 26.042513 -38.562534 -15.706674
v 57.748531 -15.702432 -33.405308
v 11.330700 -83.466934 -20.814280
v 27.653599 -74.072510 -32.430817
v 34.637005 -67.794334 -39.003334
v 0.205507 60.446140 1.429344
v -0.014131 -84.795830 -19.284725
v 25.309420 20.515541 -12.693746
v 20.985510 21.252903 -13.449100
v 18.346273 21.675690 -14.640030
v 55.035046 29.571712 -26.796894
v 21.985285 25.478378 -12.407498
v 26.717546 26.716942 -11.243027
v 31.416763 27.014359 -11.427041
v 36.261787 26.298676 -12.877275
v 39.443439 25.027885 -14.802340
v 61.567997 33.234631 -55.508896
v 38.344521 21.425240 -16.043129
v -0.283227 -22.835312 2.929769
v 21.176298 -23.167084 -3.703203
v 14.966014 -12.749868 5.310005
v 8.719563 -22.697067 2.334445
v 0.141385 28.649921 1.406427
v 36.684841 -59.936714 -32.159046
v 29.405146 -67.156494 -26.245543
v 11.850958 -79.286079 -13.768339
v 49.464115 -50.303288 -56.441460
v 18.646063 23.506187 -13.736939
v 9.313857 10.031965 4.312936
v -0.097555 -80.672401 -12.514790
v 20.190439 -79.625748 -25.443485
v 60.050102 -20.083969 -51.129978
v 13.062889 -41.298908 -8.026192
v 14.038498 -42.705715 -7.082882
v 14.884039 -45.073914 -6.204046
v 15.523176 -48.324768 -7.105758
v 17.106590 -54.080486 -11.139311
v 23.890659 -33.588512 -13.247632
v 25.679350 -32.855568 -13.317421
v 27.300512 -31.873524 -13.143246
v 31.815681 -29.103104 -13.590711
v 51.562771 -18.112133 -21.991924
v 9.287562 16.009937 -0.840998
v 12.634535 26.710350 -10.365831
v 16.145561 25.423695 -12.643601
v 22.392563 -33.014324 -13.711056
v 51.360542 -33.508823 -31.886326
v 7.569176 27.398006 -2.649560
v 19.395390 -60.430435 -13.869312
v -0.139347 8.253318 14.962630
v 5.130049 13.178600 8.537459
v -0.064695 14.490357 9.914152
v 13.679506 0.902021 4.023934
v -0.163536 -74.222153 -9.167343
v -0.188253 -66.050659 -8.516518
v 10.018951 -65.199104 -9.808981
v 32.436947 -45.148766 -20.809521
v 26.086281 -13.444077 -7.774351
v 26.408873 -53.656773 -17.879459
v 39.426929 -12.648893 -10.321648
v 31.733070 -19.103127 -10.097721
v 44.333290 -22.059017 -16.155952
v 11.475121 -73.021126 -10.628958
v 17.476896 -2.054946 -0.275513
v 36.032677 -51.575695 -25.823637
v 28.587585 -59.943913 -21.882406
v 37.687042 -36.364758 -20.509777
v 56.274845 -26.450497 -36.194405
v 44.015095 -39.248489 -25.576450
v 57.115608 -32.472286 -49.586803
v 36.741611 -25.418667 -13.993815
v 13.194196 6.188581 -0.034378
v 13.161253 -11.368348 12.481596
v 17.433899 -12.019117 6.038604
v 10.260014 -7.518275 16.735033
v 17.056665 31.493172 -8.496260
v 26.042393 34.655415 -7.290590
v 33.912411 35.358974 -7.643402
v 40.502232 34.436863 -10.055379
v 45.147739 31.819832 -13.748941
v 47.974079 21.713245 -22.979763
v 62.015759 6.021857 -49.346500
v 43.870193 14.550788 -18.856926
v 38.080006 13.025960 -15.525772
v 30.738440 12.722532 -13.225120
v 23.718529 13.741654 -12.144513
v 18.308809 15.551921 -11.824625
v 14.674701 17.526020 -11.345362
v 61.414421 5.051208 -70.530090
v 17.480141 -13.170094 3.085974
v 9.293222 4.654150 8.821153
v 8.690671 -12.167177 16.872761
v 5.539879 -15.194092 14.321405
v 8.835292 -13.031940 14.048054
v 16.073324 -14.847165 0.962954
v 4.456174 -15.915439 15.850921
v 3.995910 -17.020542 8.855565
v 15.081600 21.841644 -13.758110
v 11.850179 20.770798 -10.312963
v 9.975327 19.987106 -6.259644
v 41.349754 24.058044 -16.829649
v 44.335926 26.411774 -17.067303
v -4.933437 7.306862 12.832303
v -39.557358 21.427799 -18.723644
v -5.759441 -15.948621 8.835617
v -57.314793 44.416153 -44.996033
v -23.294079 16.695900 -12.755176
v -28.838215 16.277988 -13.266344
v -34.186539 16.668358 -14.919426
v -41.609428 19.427177 -19.805939
v -18.727068 18.134312 -13.225418
v -31.299002 30.783356 -10.185483
v -25.348385 30.484879 -10.168536
v -36.856441 29.900997 -12.256269
v -40.513809 27.823536 -14.816440
v -45.558876 16.160557 -22.991751
v -21.236019 -67.629868 -16.730902
v -41.601208 22.514027 -20.686962
v -59.369560 18.024475 -48.902332
v -51.201389 19.594296 -28.745480
v -29.351946 -6.103733 -8.092149
v -9.023136 -29.247574 2.196111
v -8.299863 -34.651318 -0.867335
v -17.776714 -29.864914 -1.895026
v -23.290581 -30.914558 -7.624582
v -14.749841 -34.116322 -3.974968
v -19.606474 -33.827911 -9.111079
v -28.894905 -41.387436 -18.665972
v -5.139418 -13.319161 19.426989
v -5.754573 -6.967084 21.458084
v -48.604088 34.580875 -16.200335
v -16.972008 7.911997 -6.572989
v -19.245827 -9.834166 4.982230
v -19.427536 -6.457109 3.261186
v -45.907448 -4.648933 -16.173428
v -5.392848 0.844442 18.292828
v -35.897770 41.033051 -5.626067
v -43.502777 39.002102 -10.372753
v -52.859444 55.694847 -33.069000
v -11.712626 36.487724 -0.135837
v -20.154068 28.769238 -11.888829
v -33.750340 -33.838543 -19.396286
v -52.995476 -38.395267 -67.132385
v -15.147238 -13.401670 2.667139
v -10.136940 -15.717710 3.212129
v -29.571869 -33.349567 -19.422304
v -26.721500 -33.648884 -17.976484
v -46.405823 43.231853 -13.084427
v -19.718687 -11.935544 1.668206
v -25.499416 40.664646 -2.005397
v -26.542826 46.144039 -0.487395
v -31.918697 71.576714 -9.592605
v -49.478191 49.791859 -21.817379
v -28.609982 59.584484 -4.746192
v -51.548882 37.470181 -21.014814
v -54.353493 40.577595 -32.446762
v -8.848559 -32.569904 1.171319
v -16.143618 -32.494175 -2.825132
v -21.451145 -32.452530 -8.010982
v -13.756038 -14.412023 1.468066
v -28.247259 -33.416073 -18.662537
v -24.925657 -37.594521 -15.343097
v -25.712385 -33.902946 -17.815462
v -11.635601 -12.579294 10.933297
v -18.424841 -33.263954 -9.926016
v -13.525257 -33.961899 -6.163164
v -7.548410 -34.822258 -3.273077
v -8.887934 -58.224354 -8.552992
v -8.726043 -51.443874 -3.770199
v -8.500104 -47.772083 -3.232642
v -8.093838 -44.760731 -4.711023
v -7.531825 -42.745762 -5.673565
v -18.653446 -39.255287 -11.808201
v -19.659336 -39.873890 -10.931899
v -20.975924 -41.348999 -10.201480
v -21.973021 -43.383892 -11.415076
v -27.028786 -25.677513 -8.922566
v -58.347717 -9.025102 -73.768936
v -21.845783 -37.416756 -15.637444
v -23.421255 -37.196758 -15.131150
v -8.205168 -18.499249 3.217656
v -18.032061 -15.237701 -2.806179
v -9.115054 -17.195915 3.404947
v -23.089077 4.929069 -8.835421
v -32.524120 1.663303 -10.828115
v -20.620441 -8.749314 -0.192320
v -44.947170 64.980270 -20.665092
v -41.374809 56.400486 -12.802796
v -37.841049 46.389095 -6.413615
v -23.704187 -48.030380 -15.416173
v -13.535759 44.974751 2.455831
v -15.222555 60.491947 -0.207817
v -17.316429 74.842575 -3.072198
v -38.906075 17.591454 -17.469841
v -51.064823 12.344380 -26.570110
v -15.926041 19.634270 -13.845269
v -46.071987 26.319286 -20.042429
v -12.865487 11.559813 -4.191400
v -15.312442 -8.435188 10.891084
v -56.346260 8.046040 -33.412514
v -47.710503 9.044941 -21.496042
v -41.096718 7.341463 -16.165649
v -30.735201 7.667091 -13.178363
v -22.789608 9.485648 -11.623262
v -16.894325 12.015253 -9.759981
v -5.335283 19.615028 2.849476
v -56.611397 -3.591827 -32.485126
v -50.163853 27.504608 -22.694008
v -3.226783 -16.490803 16.527092
v -16.998390 2.281179 -4.144701
v -59.907581 18.190147 -67.788582
v -12.623874 15.172495 -8.587569
v -21.196543 -8.799633 -6.304061
v -43.351585 22.224377 -21.879959
v -15.441827 -4.233854 8.769805
v -56.554459 -23.386772 -71.938911
v -16.109531 21.658562 -15.191843
v -10.396348 -1.159737 14.651482
v -43.560661 -51.464420 -38.333099
v -41.675323 -59.341324 -48.293068
v -59.760590 -7.033219 -53.156292
v -50.377552 -43.642754 -44.612595
v -56.921444 30.146595 -42.233101
v -21.522091 -74.374847 -20.106380
v -2.616564 -17.607235 8.713786
v -22.338272 -1.575811 -6.547659
v -55.289814 18.358158 -34.627491
v -33.830372 19.986847 -15.209258
v -28.950985 19.580753 -13.777636
v -26.290773 -38.418682 -16.368961
v -56.389957 -15.956049 -35.047909
v -11.200459 -83.409058 -21.175097
v -26.954569 -73.994064 -33.328976
v -33.665581 -67.766304 -40.120533
v -24.286055 19.882946 -13.391455
v -19.944052 20.702087 -14.109816
v -17.310085 21.193329 -15.181563
v -53.595871 28.873020 -28.484720
v -20.921028 24.998272 -12.996388
v -25.646255 26.143505 -11.976130
v -30.365446 26.372856 -12.309917
v -35.178154 25.561092 -13.895178
v -38.317825 24.216946 -15.916949
v -59.408649 32.684929 -57.656033
v -37.192719 20.707165 -17.111137
v -21.281239 -23.029049 -4.222301
v -15.157898 -12.797924 4.947150
v -9.188842 -22.659161 2.121181
v -35.928844 -59.954929 -33.202618
v -28.896282 -67.064819 -27.091606
v -11.874543 -79.262939 -14.062256
v -47.786060 -50.441795 -58.094799
v -17.613239 23.081791 -14.293269
v -9.215925 9.966502 4.058419
v -19.845755 -79.539818 -26.082466
v -58.342361 -20.394119 -52.992722
v -13.618283 -41.233158 -8.430911
v -14.613350 -42.656502 -7.491632
v -15.431113 -44.992344 -6.601082
v -16.032204 -48.334381 -7.517800
v -17.313938 -54.006523 -11.566554
v -24.116661 -33.394909 -13.839737
v -25.944876 -32.653660 -13.991773
v -27.536654 -31.655899 -13.865972
v -31.810308 -28.984108 -14.376004
v -50.554882 -18.329090 -23.314131
v -8.967526 15.892131 -1.069099
v -11.866599 26.406727 -10.687633
v -15.234859 25.017143 -13.108602
v -22.561583 -32.822556 -14.316895
v -50.284225 -33.662445 -33.268169
v -7.128628 27.253517 -2.826803
v -19.365589 -60.383896 -14.342003
v -5.181956 13.121339 8.383138
v -13.589266 0.841265 3.660518
v -10.197321 -65.154373 -10.120326
v -32.139851 -45.136925 -21.645422
v -25.793055 -13.417929 -8.384905
v -26.202562 -53.596958 -18.505630
v -38.863796 -12.802266 -11.220296
v -31.457006 -19.114738 -10.842288
v -43.704163 -22.207359 -17.165840
v -11.592940 -72.987465 -10.968139
v -17.278479 -2.092864 -0.720745
v -35.489304 -51.596691 -26.788641
v -28.295044 -59.876347 -22.602802
v -37.320599 -36.349304 -21.458643
v -54.925629 -26.692108 -37.785477
v -43.276859 -39.328278 -26.739330
v -55.539810 -32.776176 -51.381760
v -36.444962 -25.407291 -14.843914
v -12.961104 6.102340 -0.409334
v -13.454464 -11.445515 12.137245
v -17.564360 -12.059621 5.621463
v -10.715003 -7.607129 16.467787
v -16.314608 31.070625 -8.948398
v -25.258001 34.013256 -7.938076
v -33.061665 34.584133 -8.522104
v -39.581573 33.594002 -11.170484
v -44.058594 30.950245 -15.031268
v -46.656044 20.958736 -24.395113
v -60.129742 5.542511 -51.383507
v -42.681316 13.975063 -20.151581
v -37.034630 12.552341 -16.581438
v -29.781696 12.260968 -14.082767
v -22.818651 13.323147 -12.786913
v -17.440197 15.195401 -12.294885
v -13.844924 17.229855 -11.733282
v -59.130005 4.626853 -72.719711
v -17.561745 -13.164773 2.671800
v -9.385215 4.565241 8.507298
v -9.200927 -12.269557 16.633667
v -6.023980 -15.282946 14.191987
v -9.226430 -13.143612 13.793691
v -16.131813 -14.792025 0.611744
v -5.001357 -15.981090 15.724745
v -4.461918 -17.033875 8.776276
v -14.132870 21.455196 -14.228653
v -11.076156 20.508572 -10.665399
v -9.422017 19.810177 -6.498888
v -40.188858 23.236755 -17.994774
v -43.177692 25.564831 -18.317093
vt 0.546087 0.168528
vt 0.498263 0.164907
vt 0.498168 0.128287
vt 0.553316 0.133293
vt 0.498184 0.193879
vt 0.543931 0.196208
vt 0.540329 0.228141
vt 0.498096 0.226218
vt 0.535023 0.257739
vt 0.498062 0.255480
vt 0.530307 0.290855
vt 0.497808 0.287865
vt 0.529673 0.305171
vt 0.497756 0.302529
vt 0.530338 0.318594
vt 0.497680 0.316069
vt 0.497626 0.327215
vt 0.529652 0.328153
vt 0.530148 0.386702
vt 0.530697 0.399800
vt 0.497768 0.395548
vt 0.497633 0.384228
vt 0.498252 0.425121
vt 0.533423 0.425093
vt 0.530369 0.441469
vt 0.498398 0.440617
vt 0.505792 0.455007
vt 0.498616 0.455525
vt 0.504333 0.475436
vt 0.498807 0.475445
vt 0.507276 0.483601
vt 0.498834 0.483394
vt 0.508467 0.495095
vt 0.498778 0.495031
vt 0.499093 0.510909
vt 0.510440 0.510869
vt 0.514257 0.532179
vt 0.499103 0.531894
vt 0.499032 0.557867
vt 0.518707 0.555534
vt 0.526518 0.588384
vt 0.499123 0.591527
vt 0.545399 0.630252
vt 0.499290 0.635640
vt 0.560350 0.680967
vt 0.499421 0.673102
vt 0.565865 0.723628
vt 0.499629 0.715845
vt 0.576943 0.797884
vt 0.499715 0.796787
vt 0.592899 0.870759
vt 0.500116 0.875700
vt 0.407680 0.869818
vt 0.423023 0.796796
vt 0.433757 0.721907
vt 0.438873 0.679387
vt 0.453350 0.629551
vt 0.471960 0.588240
vt 0.479525 0.555009
vt 0.483830 0.531985
vt 0.487639 0.510731
vt 0.489331 0.494704
vt 0.490426 0.483461
vt 0.493316 0.475342
vt 0.491395 0.455076
vt 0.467016 0.441744
vt 0.463382 0.425361
vt 0.465330 0.400044
vt 0.465660 0.387008
vt 0.465013 0.318854
vt 0.465664 0.328564
vt 0.465835 0.305345
vt 0.465510 0.290960
vt 0.461360 0.257998
vt 0.456420 0.228306
vt 0.453025 0.196271
vt 0.451024 0.168653
vt 0.443401 0.133284
vt 0.675079 0.852096
vt 0.646003 0.792826
vt 0.760225 0.814904
vt 0.717401 0.773979
vt 0.830747 0.762860
vt 0.772036 0.738348
vt 0.887010 0.698852
vt 0.822261 0.688868
vt 0.941279 0.630144
vt 0.863002 0.630429
vt 0.978435 0.548917
vt 0.886985 0.565455
vt 0.888184 0.503683
vt 0.988333 0.476334
vt 0.883788 0.443324
vt 0.977270 0.408328
vt 0.866882 0.382640
vt 0.948001 0.341249
vt 0.901032 0.276056
vt 0.841509 0.328845
vt 0.836943 0.231680
vt 0.792454 0.288035
vt 0.771086 0.203489
vt 0.744606 0.258325
vt 0.696957 0.223505
vt 0.708345 0.174128
vt 0.647980 0.198625
vt 0.656479 0.155030
vt 0.596399 0.178227
vt 0.602649 0.142874
vt 0.325446 0.850452
vt 0.354382 0.790500
vt 0.239773 0.812694
vt 0.283123 0.771008
vt 0.168659 0.760491
vt 0.228054 0.735392
vt 0.373507 0.727579
vt 0.376186 0.702008
vt 0.317479 0.725787
vt 0.328122 0.702815
vt 0.111383 0.696393
vt 0.177175 0.685603
vt 0.056428 0.627843
vt 0.135586 0.627728
vt 0.018834 0.546744
vt 0.111279 0.563145
vt 0.008510 0.474549
vt 0.109831 0.501427
vt 0.019771 0.406585
vt 0.114204 0.441384
vt 0.048391 0.339677
vt 0.130954 0.380903
vt 0.094921 0.274782
vt 0.155834 0.327033
vt 0.159381 0.230220
vt 0.205225 0.286878
vt 0.225532 0.202359
vt 0.253052 0.257398
vt 0.288474 0.173291
vt 0.300440 0.222976
vt 0.340377 0.154562
vt 0.349193 0.198607
vt 0.394125 0.142805
vt 0.400838 0.178190
vt 0.404750 0.210366
vt 0.359140 0.235998
vt 0.317321 0.269141
vt 0.285656 0.326700
vt 0.239626 0.345585
vt 0.206198 0.371396
vt 0.204261 0.420429
vt 0.204010 0.475882
vt 0.193013 0.527420
vt 0.183036 0.576215
vt 0.204980 0.632477
vt 0.233430 0.678008
vt 0.271577 0.707991
vt 0.290445 0.691467
vt 0.259833 0.669042
vt 0.237591 0.631470
vt 0.217571 0.586887
vt 0.230428 0.552154
vt 0.411913 0.242902
vt 0.373770 0.267210
vt 0.341127 0.302120
vt 0.320128 0.342814
vt 0.259495 0.539761
vt 0.287084 0.482487
vt 0.297585 0.536236
vt 0.343279 0.516102
vt 0.343754 0.544724
vt 0.381567 0.535208
vt 0.376400 0.556680
vt 0.407056 0.549364
vt 0.400157 0.568392
vt 0.425924 0.562888
vt 0.415825 0.581352
vt 0.447125 0.577088
vt 0.431255 0.597840
vt 0.258568 0.574476
vt 0.248092 0.596583
vt 0.278466 0.566233
vt 0.309883 0.563056
vt 0.344199 0.565430
vt 0.373608 0.572780
vt 0.347504 0.583353
vt 0.370625 0.586365
vt 0.366141 0.599611
vt 0.345946 0.597903
vt 0.322773 0.583337
vt 0.298014 0.585156
vt 0.280737 0.591914
vt 0.260510 0.626962
vt 0.279801 0.652748
vt 0.304743 0.666334
vt 0.335625 0.670553
vt 0.369088 0.663914
vt 0.403623 0.644487
vt 0.414329 0.621493
vt 0.415433 0.601659
vt 0.405827 0.590922
vt 0.393697 0.582390
vt 0.322654 0.598596
vt 0.304235 0.600661
vt 0.387845 0.593092
vt 0.396867 0.599054
vt 0.401345 0.605502
vt 0.400072 0.617256
vt 0.385111 0.633837
vt 0.365746 0.646393
vt 0.340429 0.651332
vt 0.314030 0.647709
vt 0.294410 0.637543
vt 0.276117 0.624321
vt 0.267400 0.603810
vt 0.290315 0.602772
vt 0.276895 0.605727
vt 0.289186 0.612442
vt 0.301513 0.618795
vt 0.318539 0.625793
vt 0.341426 0.629243
vt 0.361825 0.626776
vt 0.380348 0.619499
vt 0.391585 0.610826
vt 0.395416 0.605514
vt 0.392307 0.604430
vt 0.383347 0.602973
vt 0.626827 0.730532
vt 0.683138 0.729420
vt 0.729120 0.712026
vt 0.766788 0.681663
vt 0.794629 0.635546
vt 0.816456 0.578760
vt 0.806064 0.529551
vt 0.795180 0.477666
vt 0.794823 0.422091
vt 0.792653 0.373371
vt 0.759465 0.346755
vt 0.712933 0.327262
vt 0.680258 0.269474
vt 0.638095 0.235844
vt 0.592477 0.210382
vt 0.551502 0.577529
vt 0.567532 0.598613
vt 0.584757 0.622870
vt 0.595663 0.646385
vt 0.583478 0.602695
vt 0.623910 0.704882
vt 0.672369 0.706540
vt 0.710338 0.695172
vt 0.740638 0.672935
vt 0.762427 0.634738
vt 0.782298 0.589612
vt 0.769413 0.554361
vt 0.630731 0.666483
vt 0.664526 0.673604
vt 0.695411 0.669706
vt 0.720532 0.656316
vt 0.739762 0.630366
vt 0.751893 0.599827
vt 0.741713 0.576936
vt 0.740587 0.541772
vt 0.721548 0.568565
vt 0.702266 0.537784
vt 0.690114 0.564909
vt 0.655782 0.545856
vt 0.655708 0.567104
vt 0.622888 0.557614
vt 0.626096 0.574165
vt 0.598950 0.569174
vt 0.605795 0.583554
vt 0.582947 0.582110
vt 0.593407 0.591942
vt 0.572717 0.563235
vt 0.591878 0.549787
vt 0.617631 0.535795
vt 0.656242 0.517099
vt 0.597939 0.606991
vt 0.599268 0.618954
vt 0.602667 0.600425
vt 0.612037 0.594685
vt 0.629520 0.588425
vt 0.652712 0.585741
vt 0.677472 0.585601
vt 0.702283 0.587885
vt 0.719650 0.595009
vt 0.732735 0.607327
vt 0.724141 0.627779
vt 0.705794 0.641100
vt 0.686063 0.650882
vt 0.659630 0.654333
vt 0.634171 0.648883
vt 0.614665 0.635966
vt 0.604143 0.607097
vt 0.608124 0.612524
vt 0.607335 0.606133
vt 0.616611 0.604955
vt 0.633933 0.601988
vt 0.654273 0.600545
vt 0.677765 0.601449
vt 0.696182 0.603565
vt 0.710088 0.606036
vt 0.723305 0.609122
vt 0.711128 0.615825
vt 0.698890 0.622135
vt 0.681925 0.628799
vt 0.659011 0.631835
vt 0.638631 0.629091
vt 0.619774 0.621416
vt 0.541776 0.550039
vt 0.564574 0.539998
vt 0.585679 0.526437
vt 0.607250 0.507606
vt 0.635452 0.485422
vt 0.456684 0.549709
vt 0.433887 0.539747
vt 0.412904 0.526252
vt 0.391664 0.507390
vt 0.363598 0.484925
vt 0.260829 0.421329
vt 0.301082 0.410450
vt 0.325922 0.453221
vt 0.333854 0.398342
vt 0.357750 0.428609
vt 0.380936 0.455487
vt 0.399589 0.477284
vt 0.422724 0.507740
vt 0.442560 0.518574
vt 0.463878 0.528208
vt 0.534215 0.528479
vt 0.555864 0.518741
vt 0.575788 0.507766
vt 0.598751 0.476913
vt 0.617628 0.455328
vt 0.712848 0.483873
vt 0.738949 0.422659
vt 0.698436 0.411254
vt 0.673658 0.454145
vt 0.640627 0.428566
vt 0.664438 0.398300
vt 0.677640 0.342844
vt 0.656173 0.302220
vt 0.623605 0.267024
vt 0.585238 0.242723
vt 0.587116 0.418150
vt 0.566956 0.394556
vt 0.595796 0.384579
vt 0.615594 0.403264
vt 0.643007 0.382556
vt 0.658038 0.353469
vt 0.636922 0.319746
vt 0.608904 0.292890
vt 0.574607 0.271581
vt 0.563553 0.299165
vt 0.594068 0.314602
vt 0.621094 0.332727
vt 0.639331 0.352644
vt 0.622679 0.371438
vt 0.561913 0.383072
vt 0.589797 0.377274
vt 0.616716 0.366539
vt 0.633445 0.352878
vt 0.614171 0.336189
vt 0.588962 0.323133
vt 0.561179 0.312735
vt 0.421863 0.271901
vt 0.387526 0.293085
vt 0.359579 0.320071
vt 0.338562 0.354122
vt 0.354039 0.383117
vt 0.381617 0.403754
vt 0.410343 0.418843
vt 0.429607 0.394966
vt 0.400603 0.385323
vt 0.373403 0.372382
vt 0.356655 0.353634
vt 0.374782 0.333239
vt 0.401922 0.315005
vt 0.432275 0.299240
vt 0.434370 0.383683
vt 0.406401 0.377819
vt 0.379288 0.367513
vt 0.362588 0.353802
vt 0.381628 0.336769
vt 0.406957 0.323503
vt 0.434532 0.313196
vt 0.434774 0.323971
vt 0.529913 0.375128
vt 0.497680 0.374389
vt 0.558656 0.374341
vt 0.529908 0.364516
vt 0.558776 0.364158
vt 0.497684 0.364532
vt 0.465900 0.375599
vt 0.465974 0.365006
vt 0.437562 0.374762
vt 0.437534 0.364743
vt 0.369451 0.353316
vt 0.385979 0.363940
vt 0.410445 0.368790
vt 0.412332 0.362938
vt 0.390318 0.359146
vt 0.374080 0.352708
vt 0.387000 0.339697
vt 0.392092 0.343148
vt 0.408807 0.331174
vt 0.410176 0.336901
vt 0.436164 0.332025
vt 0.560697 0.323601
vt 0.586941 0.330631
vt 0.559220 0.331533
vt 0.585683 0.336451
vt 0.608809 0.339120
vt 0.603877 0.342475
vt 0.626726 0.352368
vt 0.622217 0.351840
vt 0.610229 0.362946
vt 0.605878 0.358401
vt 0.585706 0.368118
vt 0.583979 0.362368
vt 0.473063 0.507172
vt 0.476296 0.492164
vt 0.480611 0.482833
vt 0.489265 0.474957
vt 0.485745 0.457207
vt 0.463813 0.446801
vt 0.422222 0.451193
vt 0.438425 0.455897
vt 0.453305 0.498702
vt 0.434399 0.489695
vt 0.423171 0.480597
vt 0.432574 0.471631
vt 0.439934 0.466983
vt 0.440781 0.480412
vt 0.459374 0.487641
vt 0.446372 0.474369
vt 0.466258 0.480852
vt 0.460122 0.451958
vt 0.481205 0.459967
vt 0.447622 0.456140
vt 0.446138 0.462146
vt 0.450344 0.468030
vt 0.468407 0.474935
vt 0.477575 0.477092
vt 0.485519 0.473230
vt 0.525102 0.507282
vt 0.521724 0.492516
vt 0.517304 0.483105
vt 0.508504 0.475062
vt 0.511790 0.457148
vt 0.533774 0.446606
vt 0.575892 0.450669
vt 0.575167 0.480582
vt 0.565709 0.471563
vt 0.563926 0.489733
vt 0.544989 0.498891
vt 0.538832 0.487879
vt 0.557423 0.480480
vt 0.559633 0.455604
vt 0.558198 0.466921
vt 0.551860 0.474490
vt 0.531909 0.481137
vt 0.512344 0.473331
vt 0.520434 0.477399
vt 0.516472 0.460005
vt 0.537633 0.451780
vt 0.550306 0.455966
vt 0.551754 0.462142
vt 0.547644 0.468060
vt 0.529593 0.475315
vn 0.1592 -0.8484 0.5049
vn 0.1504 -0.4451 0.8827
vn 0.1320 -0.0787 0.9881
vn 0.1062 -0.1369 0.9849
vn 0.1121 -0.5852 0.8031
vn 0.1054 -0.1617 0.9812
vn 0.0467 0.4298 0.9017
vn 0.0650 0.4101 0.9097
vn 0.0966 -0.3145 0.9443
vn 0.0612 0.0046 0.9981
vn 0.1271 -0.3372 0.9328
vn 0.1258 -0.9510 0.2825
vn 0.1376 -0.9809 0.1372
vn 0.1265 -0.6940 0.7088
vn 0.1114 -0.3146 0.9427
vn 0.2206 0.2947 0.9298
vn 0.3574 0.5875 0.7260
vn 0.3711 0.5647 0.7372
vn 0.4116 0.5396 0.7345
vn 0.4805 0.4221 0.7687
vn 0.2711 -0.2544 0.9283
vn 0.1029 -0.2459 0.9638
vn 0.0510 0.1351 0.9895
vn 0.0783 0.1741 0.9816
vn -0.1076 0.1750 0.9787
vn -0.0790 0.1357 0.9876
vn -0.1192 -0.2448 0.9622
vn -0.2889 -0.2554 0.9227
vn -0.5062 0.4266 0.7495
vn -0.4382 0.5400 0.7186
vn -0.3989 0.5640 0.7230
vn -0.3814 0.5902 0.7114
vn -0.2461 0.2990 0.9220
vn -0.1292 -0.3152 0.9402
vn -0.1370 -0.6946 0.7062
vn -0.1343 -0.9819 0.1335
vn -0.1375 -0.9499 0.2805
vn -0.1509 -0.3374 0.9292
vn -0.0872 0.0049 0.9962
vn -0.1214 -0.3078 0.9437
vn -0.0934 0.4192 0.9031
vn -0.0729 0.4292 0.9003
vn -0.1348 -0.1620 0.9775
vn -0.1342 -0.5849 0.7999
vn -0.1343 -0.1447 0.9803
vn -0.1639 -0.0780 0.9834
vn -0.1772 -0.4421 0.8793
vn -0.1778 -0.8497 0.4964
vn 0.3544 0.1815 0.9173
vn 0.6057 0.2409 0.7584
vn 0.8361 0.2217 0.5018
vn 0.9411 0.1043 0.3215
vn 0.9758 0.0010 0.2187
vn 0.9921 0.0453 0.1166
vn 1.0000 -0.0022 0.0092
vn 0.9983 -0.0455 -0.0358
vn 0.9911 -0.1247 -0.0456
vn 0.9690 -0.2440 -0.0399
vn 0.9133 -0.4057 0.0359
vn 0.8420 -0.5074 0.1829
vn 0.7936 -0.5195 0.3166
vn 0.7869 -0.5094 0.3482
vn 0.7683 -0.5463 0.3335
vn 0.5616 -0.7118 0.4219
vn -0.3849 0.1857 0.9041
vn -0.6354 0.2407 0.7337
vn -0.8523 0.2182 0.4754
vn -0.2659 0.1914 0.9448
vn -0.2287 -0.3177 0.9202
vn -0.4009 -0.1712 0.9000
vn -0.5090 0.2521 0.8230
vn -0.9492 0.1060 0.2963
vn -0.9811 0.0104 0.1935
vn -0.9944 0.0522 0.0918
vn -0.9999 0.0026 -0.0115
vn -0.9978 -0.0379 -0.0548
vn -0.9907 -0.1194 -0.0651
vn -0.9690 -0.2395 -0.0615
vn -0.9140 -0.4056 0.0117
vn -0.8482 -0.5065 0.1551
vn -0.8051 -0.5200 0.2854
vn -0.7971 -0.5124 0.3194
vn -0.7822 -0.5428 0.3058
vn -0.5796 -0.7096 0.4007
vn -0.6140 -0.3296 0.7172
vn -0.7816 -0.2681 0.5632
vn -0.7631 -0.3361 0.5521
vn -0.7436 -0.4263 0.5150
vn -0.8025 -0.4229 0.4209
vn -0.9067 -0.3425 0.2463
vn -0.9723 -0.1863 0.1413
vn -0.9863 -0.0765 0.1459
vn -0.9840 -0.0104 0.1781
vn -0.9708 0.0645 0.2311
vn -0.9661 0.0317 0.2564
vn -0.9707 0.0182 0.2395
vn -0.9187 0.1774 0.3528
vn -0.7389 0.2691 0.6177
vn -0.5780 0.0057 0.8160
vn -0.7965 -0.0153 0.6044
vn -0.8731 -0.1965 0.4461
vn -0.8200 -0.2264 0.5257
vn -0.8260 0.1482 0.5438
vn -0.4995 -0.0770 0.8629
vn -0.6761 -0.1480 0.7218
vn -0.6752 -0.2218 0.7035
vn -0.5310 -0.3357 0.7780
vn -0.8106 0.0661 0.5819
vn -0.7636 0.1441 0.6294
vn -0.3830 0.2560 0.8875
vn -0.3056 0.4648 0.8310
vn -0.4798 0.5123 0.7123
vn -0.6602 0.5402 0.5218
vn -0.8221 0.4431 0.3574
vn -0.8950 0.2061 0.3956
vn -0.6591 0.1513 0.7367
vn -0.6129 0.3357 0.7153
vn -0.4853 0.3622 0.7958
vn -0.2868 0.2704 0.9190
vn -0.2290 0.2555 0.9393
vn -0.0975 0.1572 0.9827
vn -0.1300 -0.1049 0.9859
vn -0.3167 -0.1383 0.9384
vn -0.5147 -0.0402 0.8564
vn -0.6467 0.0790 0.7586
vn -0.5488 -0.4732 0.6891
vn -0.5653 -0.4839 0.6680
vn -0.4772 -0.4152 0.7745
vn -0.3369 -0.4497 0.8272
vn -0.2117 -0.5799 0.7867
vn -0.2480 -0.7125 0.6564
vn -0.6063 -0.5706 0.5540
vn -0.8825 -0.0290 0.4694
vn -0.7865 0.4085 0.4632
vn -0.5084 0.5485 0.6638
vn -0.3389 0.4168 0.8435
vn -0.2775 0.1254 0.9525
vn -0.4564 0.1374 0.8791
vn -0.0450 0.1285 0.9907
vn -0.2040 0.3841 0.9005
vn -0.5524 0.3957 0.7337
vn -0.6576 -0.2153 0.7220
vn -0.2760 -0.5773 0.7685
vn -0.0622 -0.6385 0.7671
vn -0.0686 -0.4802 0.8745
vn -0.2586 -0.4654 0.8465
vn -0.3774 -0.4503 0.8092
vn -0.5139 -0.5065 0.6924
vn -0.4224 -0.5896 0.6885
vn -0.6527 0.0999 0.7510
vn -0.5491 0.1739 0.8174
vn -0.5956 0.2219 0.7720
vn -0.4719 -0.6799 0.5613
vn -0.4898 -0.5197 0.7000
vn -0.3333 -0.4484 0.8293
vn -0.2331 -0.4421 0.8661
vn -0.0503 -0.4123 0.9096
vn 0.1536 -0.3520 0.9233
vn 0.0195 -0.3819 0.9240
vn -0.2344 -0.4676 0.8523
vn -0.2851 0.5128 0.8098
vn 0.0794 0.5107 0.8561
vn 0.0581 0.2758 0.9594
vn 0.2363 0.1915 0.9526
vn 0.4753 0.2546 0.8422
vn 0.7151 0.2709 0.6444
vn 0.9087 0.1738 0.3796
vn 0.9643 0.0086 0.2647
vn 0.9590 0.0240 0.2822
vn 0.9645 0.0638 0.2565
vn 0.9790 -0.0198 0.2027
vn 0.9821 -0.0835 0.1687
vn 0.9677 -0.1931 0.1623
vn 0.8963 -0.3510 0.2709
vn 0.7862 -0.4264 0.4473
vn 0.7216 -0.4287 0.5436
vn 0.7413 -0.3311 0.5838
vn 0.7614 -0.2592 0.5943
vn 0.5886 -0.3297 0.7381
vn 0.8792 0.2013 0.4319
vn 0.5957 -0.5648 0.5711
vn 0.8611 -0.0306 0.5075
vn 0.2118 -0.3203 0.9233
vn 0.3723 -0.1754 0.9114
vn 0.5474 -0.0003 0.8369
vn 0.7738 -0.0185 0.6332
vn 0.8584 -0.2003 0.4723
vn 0.8034 -0.2336 0.5477
vn 0.8104 0.1478 0.5670
vn 0.1963 -0.5732 0.7955
vn 0.2455 -0.7046 0.6658
vn 0.3133 -0.4442 0.8394
vn 0.4484 -0.4119 0.7933
vn 0.5208 -0.4754 0.7091
vn 0.6405 0.1419 0.7547
vn 0.5986 0.3210 0.7339
vn 0.4627 0.3406 0.8185
vn 0.2585 0.2560 0.9315
vn 0.1993 0.2407 0.9499
vn 0.3052 0.4048 0.8619
vn 0.4758 0.5371 0.6965
vn 0.7622 0.3936 0.5139
vn 0.8071 0.4408 0.3928
vn 0.6382 0.5344 0.5542
vn 0.4546 0.4968 0.7392
vn 0.2794 0.4480 0.8492
vn 0.6294 -0.2057 0.7493
vn 0.5150 0.3808 0.7680
vn 0.1601 0.3594 0.9193
vn 0.1004 -0.1134 0.9885
vn 0.2893 -0.1476 0.9458
vn 0.4858 -0.0519 0.8725
vn 0.6290 0.0802 0.7733
vn 0.6297 0.0931 0.7713
vn 0.3881 -0.5902 0.7078
vn 0.4913 -0.5079 0.7075
vn 0.3569 -0.4416 0.8232
vn 0.2420 -0.4486 0.8603
vn 0.0464 -0.4607 0.8864
vn 0.0546 -0.6233 0.7801
vn 0.2544 -0.5714 0.7803
vn 0.2125 -0.4659 0.8589
vn 0.2478 0.5151 0.8205
vn 0.0064 0.1076 0.9942
vn -0.1243 0.5003 0.8569
vn -0.0834 0.2680 0.9598
vn 0.0599 0.1541 0.9862
vn 0.2573 0.1181 0.9591
vn 0.4288 0.1407 0.8924
vn 0.5239 0.1799 0.8326
vn 0.5676 0.2257 0.7917
vn 0.4596 -0.6779 0.5738
vn 0.4756 -0.5185 0.7106
vn 0.3152 -0.4459 0.8378
vn 0.2175 -0.4382 0.8722
vn 0.0250 -0.4084 0.9124
vn -0.1647 -0.3581 0.9191
vn -0.0337 -0.3830 0.9231
vn 0.7979 0.3795 0.4683
vn 0.8060 0.3592 0.4705
vn 0.7225 0.3202 0.6128
vn 0.4787 0.2742 0.8340
vn 0.2832 0.2287 0.9314
vn -0.8137 0.3822 0.4379
vn -0.8232 0.3651 0.4347
vn -0.7424 0.3336 0.5810
vn -0.5032 0.2868 0.8152
vn -0.3108 0.2384 0.9201
vn -0.8628 -0.0411 0.5038
vn -0.8728 -0.2594 0.4135
vn -0.7521 -0.3516 0.5575
vn -0.6837 -0.1264 0.7187
vn -0.4215 0.1605 0.8925
vn -0.4533 -0.4399 0.7752
vn -0.3691 -0.3215 0.8720
vn -0.2165 -0.1682 0.9617
vn -0.2388 -0.0805 0.9677
vn -0.7395 0.1524 0.6557
vn -0.8064 0.4086 0.4276
vn -0.8332 0.3819 0.4000
vn -0.7762 0.3885 0.4966
vn 0.7580 0.3877 0.5245
vn 0.8209 0.3790 0.4273
vn 0.7957 0.4001 0.4546
vn 0.7195 0.1343 0.6813
vn 0.2120 -0.0869 0.9734
vn 0.3518 0.2421 0.9042
vn 0.7895 0.0569 0.6112
vn 0.7434 0.1351 0.6551
vn 0.8453 -0.0505 0.5319
vn 0.8557 -0.2693 0.4420
vn 0.7267 -0.3588 0.5858
vn 0.6521 -0.1423 0.7447
vn 0.3916 0.1465 0.9084
vn 0.1947 -0.1725 0.9656
vn 0.3465 -0.3258 0.8796
vn 0.4259 -0.4387 0.7913
vn 0.4993 -0.3336 0.7996
vn 0.6488 -0.2216 0.7280
vn 0.6545 -0.1447 0.7421
vn 0.4749 -0.0731 0.8770
vn 0.4211 0.0265 0.9066
vn 0.6181 -0.1828 0.7645
vn 0.2932 -0.5246 0.7993
vn 0.3951 -0.2292 0.8896
vn 0.5854 -0.1167 0.8023
vn 0.5851 -0.1399 0.7988
vn 0.4202 -0.1610 0.8930
vn 0.4992 -0.4452 0.7434
vn 0.6624 -0.2967 0.6879
vn 0.7053 -0.1130 0.6998
vn 0.3068 0.0675 0.9494
vn 0.2298 -0.7798 0.5823
vn 0.5871 -0.4868 0.6469
vn 0.4935 -0.2832 0.8224
vn 0.5170 0.0037 0.8560
vn 0.3726 -0.4019 0.8364
vn 0.5059 -0.6246 0.5949
vn 0.4777 -0.7688 0.4250
vn 0.3670 -0.8512 0.3752
vn 0.5569 0.1365 0.8193
vn 0.7136 0.0843 0.6954
vn 0.5878 -0.1255 0.7992
vn 0.4601 -0.1192 0.8798
vn -0.4488 -0.1728 0.8768
vn -0.6128 -0.1477 0.7763
vn -0.6169 -0.1258 0.7769
vn -0.4294 -0.2348 0.8720
vn -0.3123 -0.5267 0.7906
vn -0.5179 -0.2719 0.8111
vn -0.5405 0.0176 0.8412
vn -0.4487 0.0371 0.8929
vn -0.6420 -0.1600 0.7499
vn -0.6105 -0.4733 0.6351
vn -0.2354 -0.7843 0.5740
vn -0.3440 0.0592 0.9371
vn -0.7349 -0.1318 0.6653
vn -0.6877 -0.3110 0.6560
vn -0.5216 -0.4525 0.7233
vn -0.4030 -0.3938 0.8261
vn -0.5266 -0.6219 0.5795
vn -0.4996 -0.7600 0.4158
vn -0.3883 -0.8450 0.3676
vn -0.5752 0.1442 0.8052
vn -0.7357 0.0811 0.6725
vn -0.6082 -0.1295 0.7832
vn -0.4838 -0.1226 0.8665
vn -0.2372 0.4384 0.8669
vn 0.1167 -0.6891 0.7152
vn 0.3229 -0.7033 0.6333
vn 0.0936 -0.9953 -0.0239
vn 0.0704 -0.9945 0.0775
vn -0.1365 -0.6947 0.7062
vn -0.0785 -0.9947 0.0666
vn -0.0939 -0.9949 -0.0368
vn -0.3481 -0.7098 0.6124
vn -0.3329 -0.8976 0.2891
vn 0.0664 -0.9811 -0.1815
vn -0.4464 -0.7932 0.4142
vn -0.4080 -0.8533 0.3246
vn 0.1318 -0.9886 0.0734
vn 0.2353 -0.9207 -0.3114
vn -0.2768 0.4431 0.8527
vn 0.2193 0.7035 0.6760
vn 0.0902 0.8994 0.4277
vn -0.1194 0.7225 0.6810
vn -0.2025 0.5426 0.8152
vn -0.2524 0.4950 0.8314
vn -0.3030 0.6495 0.6974
vn 0.2180 0.4352 0.8736
vn 0.2457 0.4838 0.8400
vn 0.1883 0.5330 0.8249
vn 0.1049 0.7308 0.6745
vn -0.1011 0.9022 0.4192
vn 0.2961 0.6437 0.7057
vn -0.2231 0.7070 0.6711
vn 0.2605 0.4387 0.8600
vn 0.3329 -0.8909 0.3088
vn -0.1487 -0.9867 0.0654
vn -0.2463 -0.9137 -0.3233
vn -0.0701 -0.9810 -0.1809
vn 0.4332 -0.7917 0.4307
vn 0.4005 -0.8504 0.3412
vn -0.6831 0.5452 0.4860
vn -0.6703 0.2731 0.6901
vn -0.6394 -0.2469 0.7281
vn -0.4956 -0.7139 0.4948
vn -0.3062 -0.9450 0.1150
vn -0.4558 -0.7358 0.5009
vn -0.4922 -0.0087 0.8704
vn -0.5600 0.1232 0.8193
vn -0.4962 -0.7198 0.4855
vn -0.7748 0.5430 0.3239
vn -0.7571 0.5904 0.2797
vn -0.8906 0.4515 0.0542
vn -0.9254 -0.3783 0.0227
vn -0.5223 -0.7818 0.3407
vn -0.9674 -0.0220 0.2524
vn -0.8327 0.2228 0.5069
vn -0.7818 0.2284 0.5802
vn -0.7043 -0.6091 0.3647
vn -0.7700 -0.3222 0.5507
vn -0.7353 -0.2042 0.6462
vn -0.6442 -0.5555 0.5257
vn -0.4021 -0.0337 0.9150
vn -0.0798 -0.8075 0.5844
vn -0.1470 -0.9403 0.3069
vn -0.2999 -0.9221 0.2445
vn -0.4402 -0.8666 0.2351
vn -0.6030 -0.7782 0.1758
vn -0.6342 -0.7704 0.0662
vn 0.6630 0.5433 0.5149
vn 0.6453 0.2654 0.7164
vn 0.6146 -0.2527 0.7473
vn 0.4815 -0.7137 0.5087
vn 0.3027 -0.9450 0.1239
vn 0.4372 -0.7396 0.5117
vn 0.4648 -0.0163 0.8853
vn 0.5321 0.1129 0.8391
vn 0.9194 -0.3909 0.0439
vn 0.8952 0.4395 0.0741
vn 0.7659 0.5390 0.3505
vn 0.7542 0.5836 0.3011
vn 0.7636 0.2149 0.6089
vn 0.8210 0.2045 0.5330
vn 0.9589 -0.0391 0.2810
vn 0.4722 -0.7278 0.4974
vn 0.5036 -0.7861 0.3584
vn 0.6778 -0.6227 0.3909
vn 0.7505 -0.3348 0.5697
vn 0.7110 -0.2067 0.6721
vn 0.5938 -0.7810 0.1932
vn 0.6342 -0.7692 0.0779
vn 0.6263 -0.5602 0.5421
vn 0.3685 -0.0223 0.9294
vn 0.0480 -0.7986 0.6000
vn 0.1241 -0.9399 0.3179
vn 0.2798 -0.9272 0.2490
vn 0.4239 -0.8721 0.2446
vn 0.5364 -0.4849 0.6908
vn -0.7302 -0.4589 0.5062
vn -0.5746 -0.4394 0.6904
vn -0.4590 -0.3504 0.8164
vn -0.2759 -0.2692 0.9227
vn -0.0727 -0.2298 0.9705
vn 0.1782 -0.1917 0.9651
vn 0.3111 -0.2337 0.9212
vn 0.1622 -0.3986 0.9027
vn -0.1807 -0.4112 0.8935
vn -0.3287 -0.2241 0.9175
vn -0.1940 -0.1855 0.9633
vn 0.0374 -0.2249 0.9737
vn 0.2605 -0.2674 0.9277
vn 0.4395 -0.3497 0.8274
vn 0.5655 -0.4365 0.6998
vn 0.7197 -0.4582 0.5216
usemtl None
s off
f 172/1/1 176/2/1 153/3/1 149/4/1
f 200/5/2 176/2/2 172/1/2 209/6/2
f 200/5/3 209/6/3 202/7/3 201/8/3
f 201/8/4 202/7/4 84/9/4 19/10/4
f 19/10/5 84/9/5 85/11/5 18/12/5
f 18/12/6 85/11/6 86/13/6 17/14/6
f 17/14/7 86/13/7 87/15/7 16/16/7
f 15/17/8 16/16/8 87/15/8 88/18/8
f 73/19/9 38/20/9 1/21/9 12/22/9
f 165/23/10 1/21/10 38/20/10 168/24/10
f 165/23/11 168/24/11 98/25/11 3/26/11
f 3/26/12 98/25/12 142/27/12 95/28/12
f 126/29/13 20/30/13 95/28/13 142/27/13
f 45/31/14 2/32/14 20/30/14 126/29/14
f 46/33/15 5/34/15 2/32/15 45/31/15
f 6/35/16 5/34/16 46/33/16 52/36/16
f 6/35/17 52/36/17 4/37/17 196/38/17
f 198/39/18 196/38/18 4/37/18 197/40/18
f 123/41/19 7/42/19 198/39/19 197/40/19
f 194/43/20 169/44/20 7/42/20 123/41/20
f 194/43/21 56/45/21 9/46/21 169/44/21
f 108/47/22 10/48/22 9/46/22 56/45/22
f 109/49/23 152/50/23 10/48/23 108/47/23
f 110/51/24 11/52/24 152/50/24 109/49/24
f 11/52/25 339/53/25 338/54/25 152/50/25
f 338/54/26 337/55/26 10/48/26 152/50/26
f 337/55/27 286/56/27 9/46/27 10/48/27
f 418/57/28 169/44/28 9/46/28 286/56/28
f 418/57/29 352/58/29 7/42/29 169/44/29
f 352/58/30 420/59/30 198/39/30 7/42/30
f 249/60/31 196/38/31 198/39/31 420/59/31
f 249/60/32 282/61/32 6/35/32 196/38/32
f 276/62/33 5/34/33 6/35/33 282/61/33
f 276/62/34 275/63/34 2/32/34 5/34/34
f 275/63/35 355/64/35 20/30/35 2/32/35
f 371/65/36 95/28/36 20/30/36 355/64/36
f 327/66/37 3/26/37 95/28/37 371/65/37
f 394/67/38 165/23/38 3/26/38 327/66/38
f 268/68/39 1/21/39 165/23/39 394/67/39
f 303/69/40 12/22/40 1/21/40 268/68/40
f 317/70/41 16/16/41 15/17/41 318/71/41
f 317/70/42 316/72/42 17/14/42 16/16/42
f 316/72/43 315/73/43 18/12/43 17/14/43
f 314/74/44 19/10/44 18/12/44 315/73/44
f 422/75/45 201/8/45 19/10/45 314/74/45
f 429/76/46 200/5/46 201/8/46 422/75/46
f 397/77/47 176/2/47 200/5/47 429/76/47
f 378/78/48 153/3/48 176/2/48 397/77/48
f 68/79/49 110/51/49 109/49/49 70/80/49
f 104/81/50 68/79/50 70/80/50 105/82/50
f 55/83/51 104/81/51 105/82/51 69/84/51
f 22/85/52 55/83/52 69/84/52 72/86/52
f 163/87/53 22/85/53 72/86/53 140/88/53
f 128/89/54 163/87/54 140/88/54 35/90/54
f 228/91/55 235/92/55 128/89/55 35/90/55
f 235/92/56 228/91/56 138/93/56 94/94/56
f 94/94/57 138/93/57 178/95/57 133/96/57
f 59/97/58 133/96/58 178/95/58 216/98/58
f 173/99/59 59/97/59 216/98/59 139/100/59
f 137/101/60 173/99/60 139/100/60 136/102/60
f 137/101/61 136/102/61 170/103/61 151/104/61
f 151/104/62 170/103/62 171/105/62 150/106/62
f 150/106/63 171/105/63 141/107/63 177/108/63
f 149/4/64 177/108/64 141/107/64 172/1/64
f 339/53/65 298/109/65 300/110/65 338/54/65
f 298/109/66 333/111/66 334/112/66 300/110/66
f 333/111/67 285/113/67 299/114/67 334/112/67
f 300/110/68 297/115/68 337/55/68 338/54/68
f 297/115/69 296/116/69 286/56/69 337/55/69
f 297/115/70 335/117/70 283/118/70 296/116/70
f 334/112/71 335/117/71 297/115/71 300/110/71
f 285/113/72 252/119/72 302/120/72 299/114/72
f 252/119/73 390/121/73 369/122/73 302/120/73
f 390/121/74 357/123/74 265/124/74 369/122/74
f 455/125/75 448/126/75 265/124/75 357/123/75
f 455/125/76 324/127/76 367/128/76 448/126/76
f 367/128/77 324/127/77 362/129/77 402/130/77
f 362/129/78 289/131/78 436/132/78 402/130/78
f 289/131/79 398/133/79 368/134/79 436/132/79
f 398/133/80 366/135/80 365/136/80 368/134/80
f 365/136/81 366/135/81 380/137/81 395/138/81
f 395/138/82 380/137/82 379/139/82 396/140/82
f 396/140/83 379/139/83 401/141/83 370/142/83
f 378/78/84 397/77/84 370/142/84 401/141/84
f 263/143/85 370/142/85 397/77/85 429/76/85
f 263/143/86 432/144/86 396/140/86 370/142/86
f 432/144/87 431/145/87 395/138/87 396/140/87
f 431/145/88 435/146/88 365/136/88 395/138/88
f 435/146/89 417/147/89 368/134/89 365/136/89
f 417/147/90 434/148/90 436/132/90 368/134/90
f 434/148/91 377/149/91 402/130/91 436/132/91
f 377/149/92 353/150/92 367/128/92 402/130/92
f 346/151/93 448/126/93 367/128/93 353/150/93
f 346/151/94 373/152/94 265/124/94 448/126/94
f 384/153/95 369/122/95 265/124/95 373/152/95
f 301/154/96 302/120/96 369/122/96 384/153/96
f 294/155/97 299/114/97 302/120/97 301/154/97
f 299/114/98 294/155/98 335/117/98 334/112/98
f 284/156/99 283/118/99 335/117/99 294/155/99
f 277/157/100 284/156/100 294/155/100 301/154/100
f 354/158/101 277/157/101 301/154/101 384/153/101
f 266/159/102 354/158/102 384/153/102 373/152/102
f 341/160/103 266/159/103 373/152/103 346/151/103
f 419/161/104 263/143/104 429/76/104 422/75/104
f 419/161/105 425/162/105 432/144/105 263/143/105
f 425/162/106 423/163/106 431/145/106 432/144/106
f 423/163/107 433/164/107 435/146/107 431/145/107
f 347/165/108 341/160/108 346/151/108 353/150/108
f 353/150/109 281/166/109 348/167/109 347/165/109
f 348/167/110 281/166/110 331/168/110 349/169/110
f 331/168/111 330/170/111 350/171/111 349/169/111
f 330/170/112 278/172/112 351/173/112 350/171/112
f 278/172/113 344/174/113 358/175/113 351/173/113
f 413/176/114 466/177/114 358/175/114 344/174/114
f 418/57/115 466/177/115 413/176/115 352/58/115
f 266/159/116 341/160/116 262/178/116 447/179/116
f 262/178/117 341/160/117 347/165/117 449/180/117
f 450/181/118 449/180/118 347/165/118 348/167/118
f 450/181/119 348/167/119 349/169/119 451/182/119
f 452/183/120 451/182/120 349/169/120 350/171/120
f 254/184/121 253/185/121 381/186/121 375/187/121
f 452/183/122 253/185/122 254/184/122 451/182/122
f 255/188/123 450/181/123 451/182/123 254/184/123
f 340/189/124 449/180/124 450/181/124 255/188/124
f 256/190/125 262/178/125 449/180/125 340/189/125
f 343/191/126 354/158/126 266/159/126 447/179/126
f 446/192/127 277/157/127 354/158/127 343/191/127
f 445/193/128 284/156/128 277/157/128 446/192/128
f 444/194/129 283/118/129 284/156/129 445/193/129
f 443/195/130 296/116/130 283/118/130 444/194/130
f 442/196/131 286/56/131 296/116/131 443/195/131
f 442/196/132 414/197/132 418/57/132 286/56/132
f 465/198/133 466/177/133 418/57/133 414/197/133
f 454/199/134 358/175/134 466/177/134 465/198/134
f 454/199/135 453/200/135 351/173/135 358/175/135
f 351/173/136 453/200/136 452/183/136 350/171/136
f 255/188/137 254/184/137 375/187/137 374/201/137
f 374/201/138 391/202/138 340/189/138 255/188/138
f 257/203/139 253/185/139 452/183/139 453/200/139
f 342/204/140 257/203/140 453/200/140 454/199/140
f 464/205/141 342/204/141 454/199/141 465/198/141
f 415/206/142 464/205/142 465/198/142 414/197/142
f 287/207/143 415/206/143 414/197/143 442/196/143
f 259/208/144 287/207/144 442/196/144 443/195/144
f 258/209/145 259/208/145 443/195/145 444/194/145
f 260/210/146 258/209/146 444/194/146 445/193/146
f 261/211/147 260/210/147 445/193/147 446/192/147
f 468/212/148 261/211/148 446/192/148 343/191/148
f 360/213/149 468/212/149 343/191/149 447/179/149
f 447/179/150 262/178/150 256/190/150 360/213/150
f 391/202/151 250/214/151 256/190/151 340/189/151
f 264/215/152 360/213/152 256/190/152 250/214/152
f 467/216/153 468/212/153 360/213/153 264/215/153
f 261/211/154 468/212/154 467/216/154 389/217/154
f 388/218/155 260/210/155 261/211/155 389/217/155
f 387/219/156 258/209/156 260/210/156 388/218/156
f 386/220/157 259/208/157 258/209/157 387/219/157
f 385/221/158 287/207/158 259/208/158 386/220/158
f 399/222/159 415/206/159 287/207/159 385/221/159
f 363/223/160 464/205/160 415/206/160 399/222/160
f 383/224/161 342/204/161 464/205/161 363/223/161
f 382/225/162 257/203/162 342/204/162 383/224/162
f 253/185/163 257/203/163 382/225/163 381/186/163
f 67/226/164 70/80/164 109/49/164 108/47/164
f 67/226/165 106/227/165 105/82/165 70/80/165
f 106/227/166 64/228/166 69/84/166 105/82/166
f 64/228/167 71/229/167 72/86/167 69/84/167
f 71/229/168 157/230/168 140/88/168 72/86/168
f 157/230/169 144/231/169 35/90/169 140/88/169
f 117/232/170 228/91/170 35/90/170 144/231/170
f 124/233/171 138/93/171 228/91/171 117/232/171
f 148/234/172 178/95/172 138/93/172 124/233/172
f 214/235/173 216/98/173 178/95/173 148/234/173
f 193/236/174 139/100/174 216/98/174 214/235/174
f 215/237/175 136/102/175 139/100/175 193/236/175
f 211/238/176 170/103/176 136/102/176 215/237/176
f 212/239/177 171/105/177 170/103/177 211/238/177
f 33/240/178 141/107/178 171/105/178 212/239/178
f 172/1/179 141/107/179 33/240/179 209/6/179
f 194/43/180 123/41/180 189/241/180 246/242/180
f 56/45/181 194/43/181 190/243/181 222/244/181
f 245/245/182 190/243/182 194/43/182 246/242/182
f 66/246/183 67/226/183 108/47/183 56/45/183
f 66/246/184 53/247/184 106/227/184 67/226/184
f 53/247/185 54/248/185 64/228/185 106/227/185
f 54/248/186 47/249/186 71/229/186 64/228/186
f 47/249/187 125/250/187 157/230/187 71/229/187
f 125/250/188 36/251/188 144/231/188 157/230/188
f 36/251/189 112/252/189 117/232/189 144/231/189
f 53/247/190 66/246/190 223/253/190 224/254/190
f 56/45/191 222/244/191 223/253/191 66/246/191
f 224/254/192 225/255/192 54/248/192 53/247/192
f 225/255/193 226/256/193 47/249/193 54/248/193
f 114/257/194 227/258/194 36/251/194 125/250/194
f 227/258/195 32/259/195 112/252/195 36/251/195
f 118/260/196 112/252/196 32/259/196 229/261/196
f 119/262/197 118/260/197 229/261/197 230/263/197
f 120/264/198 119/262/198 230/263/198 231/265/198
f 121/266/199 120/264/199 231/265/199 232/267/199
f 122/268/200 121/266/200 232/267/200 233/269/200
f 129/270/201 122/268/201 233/269/201 234/271/201
f 246/242/202 129/270/202 234/271/202 245/245/202
f 115/272/203 129/270/203 246/242/203 189/241/203
f 48/273/204 122/268/204 129/270/204 115/272/204
f 101/274/205 121/266/205 122/268/205 48/273/205
f 102/275/206 120/264/206 121/266/206 101/274/206
f 190/243/207 245/245/207 244/276/207 191/277/207
f 113/278/208 244/276/208 245/245/208 234/271/208
f 113/278/209 234/271/209 233/269/209 27/279/209
f 23/280/210 232/267/210 231/265/210 24/281/210
f 24/281/211 231/265/211 230/263/211 25/282/211
f 25/282/212 230/263/212 229/261/212 111/283/212
f 111/283/213 229/261/213 32/259/213 26/284/213
f 131/285/214 26/284/214 32/259/214 227/258/214
f 248/286/215 131/285/215 227/258/215 114/257/215
f 248/286/216 114/257/216 226/256/216 31/287/216
f 30/288/217 31/287/217 226/256/217 225/255/217
f 28/289/218 30/288/218 225/255/218 224/254/218
f 29/290/219 28/289/219 224/254/219 223/253/219
f 29/290/220 223/253/220 222/244/220 57/291/220
f 222/244/221 190/243/221 191/277/221 57/291/221
f 191/277/222 244/276/222 134/292/222 174/293/222
f 134/292/223 244/276/223 113/278/223 156/294/223
f 232/267/224 23/280/224 27/279/224 233/269/224
f 156/294/225 113/278/225 27/279/225 155/295/225
f 154/296/226 155/295/226 27/279/226 23/280/226
f 154/296/227 23/280/227 24/281/227 146/297/227
f 146/297/228 24/281/228 25/282/228 145/298/228
f 145/298/229 25/282/229 111/283/229 164/299/229
f 164/299/230 111/283/230 26/284/230 8/300/230
f 8/300/231 26/284/231 131/285/231 34/301/231
f 34/301/232 131/285/232 248/286/232 247/302/232
f 247/302/233 248/286/233 31/287/233 162/303/233
f 162/303/234 31/287/234 30/288/234 161/304/234
f 161/304/235 30/288/235 28/289/235 160/305/235
f 160/305/236 28/289/236 29/290/236 159/306/236
f 159/306/237 29/290/237 57/291/237 158/307/237
f 57/291/238 191/277/238 174/293/238 158/307/238
f 175/308/239 189/241/239 123/41/239 197/40/239
f 175/308/240 218/309/240 115/272/240 189/241/240
f 218/309/241 127/310/241 48/273/241 115/272/241
f 127/310/242 143/311/242 101/274/242 48/273/242
f 143/311/243 37/312/243 102/275/243 101/274/243
f 413/176/244 400/313/244 420/59/244 352/58/244
f 400/313/245 413/176/245 344/174/245 438/314/245
f 356/315/246 438/314/246 344/174/246 278/172/246
f 372/316/247 356/315/247 278/172/247 330/170/247
f 267/317/248 372/316/248 330/170/248 331/168/248
f 412/318/249 281/166/249 353/150/249 377/149/249
f 434/148/250 417/147/250 412/318/250 377/149/250
f 428/319/251 412/318/251 417/147/251 435/146/251
f 426/320/252 281/166/252 412/318/252 428/319/252
f 281/166/253 426/320/253 267/317/253 331/168/253
f 428/319/254 435/146/254 433/164/254 437/321/254
f 437/321/255 427/322/255 426/320/255 428/319/255
f 427/322/256 424/323/256 267/317/256 426/320/256
f 359/324/257 372/316/257 267/317/257 424/323/257
f 430/325/258 356/315/258 372/316/258 359/324/258
f 421/326/259 438/314/259 356/315/259 430/325/259
f 457/327/260 400/313/260 438/314/260 421/326/260
f 420/59/261 400/313/261 457/327/261 249/60/261
f 175/308/262 197/40/262 4/37/262 237/328/262
f 237/328/263 199/329/263 218/309/263 175/308/263
f 199/329/264 210/330/264 127/310/264 218/309/264
f 210/330/265 130/331/265 143/311/265 127/310/265
f 130/331/266 204/332/266 37/312/266 143/311/266
f 51/333/267 119/262/267 120/264/267 102/275/267
f 117/232/268 112/252/268 118/260/268 124/233/268
f 118/260/269 119/262/269 51/333/269 124/233/269
f 51/333/270 188/334/270 148/234/270 124/233/270
f 148/234/271 188/334/271 193/236/271 214/235/271
f 188/334/272 208/335/272 215/237/272 193/236/272
f 206/336/273 208/335/273 188/334/273 51/333/273
f 102/275/274 37/312/274 206/336/274 51/333/274
f 206/336/275 37/312/275 204/332/275 207/337/275
f 217/338/276 208/335/276 206/336/276 207/337/276
f 213/339/277 215/237/277 208/335/277 217/338/277
f 213/339/278 203/340/278 211/238/278 215/237/278
f 203/340/279 205/341/279 212/239/279 211/238/279
f 205/341/280 195/342/280 33/240/280 212/239/280
f 209/6/281 33/240/281 195/342/281 202/7/281
f 166/343/282 168/24/282 38/20/282 40/344/282
f 166/343/283 40/344/283 41/345/283 93/346/283
f 213/339/284 217/338/284 187/347/284 58/348/284
f 58/348/285 44/349/285 203/340/285 213/339/285
f 44/349/286 107/350/286 205/341/286 203/340/286
f 107/350/287 183/351/287 195/342/287 205/341/287
f 202/7/288 195/342/288 183/351/288 84/9/288
f 182/352/289 85/11/289 84/9/289 183/351/289
f 92/353/290 182/352/290 183/351/290 107/350/290
f 147/354/291 92/353/291 107/350/291 44/349/291
f 62/355/292 147/354/292 44/349/292 58/348/292
f 186/356/293 62/355/293 58/348/293 187/347/293
f 93/346/294 41/345/294 186/356/294 187/347/294
f 217/338/295 207/337/295 93/346/295 187/347/295
f 204/332/296 166/343/296 93/346/296 207/337/296
f 40/344/297 38/20/297 73/19/297 74/357/297
f 75/358/298 41/345/298 40/344/298 74/357/298
f 185/359/299 186/356/299 41/345/299 75/358/299
f 77/360/300 62/355/300 186/356/300 185/359/300
f 78/361/301 147/354/301 62/355/301 77/360/301
f 91/362/302 92/353/302 147/354/302 78/361/302
f 181/363/303 182/352/303 92/353/303 91/362/303
f 85/11/304 182/352/304 181/363/304 86/13/304
f 407/364/305 419/161/305 422/75/305 314/74/305
f 407/364/306 336/365/306 425/162/306 419/161/306
f 336/365/307 274/366/307 423/163/307 425/162/307
f 274/366/308 288/367/308 433/164/308 423/163/308
f 288/367/309 411/368/309 437/321/309 433/164/309
f 411/368/310 323/369/310 427/322/310 437/321/310
f 323/369/311 392/370/311 424/323/311 427/322/311
f 394/67/312 392/370/312 270/371/312 268/68/312
f 271/372/313 270/371/313 392/370/313 323/369/313
f 410/373/314 271/372/314 323/369/314 411/368/314
f 292/374/315 410/373/315 411/368/315 288/367/315
f 376/375/316 292/374/316 288/367/316 274/366/316
f 322/376/317 376/375/317 274/366/317 336/365/317
f 406/377/318 322/376/318 336/365/318 407/364/318
f 314/74/319 315/73/319 406/377/319 407/364/319
f 270/371/320 304/378/320 303/69/320 268/68/320
f 304/378/321 270/371/321 271/372/321 305/379/321
f 305/379/322 271/372/322 410/373/322 409/380/322
f 409/380/323 410/373/323 292/374/323 307/381/323
f 307/381/324 292/374/324 376/375/324 308/382/324
f 308/382/325 376/375/325 322/376/325 321/383/325
f 321/383/326 322/376/326 406/377/326 405/384/326
f 315/73/327 316/72/327 405/384/327 406/377/327
f 404/385/328 405/384/328 316/72/328 317/70/328
f 39/386/329 73/19/329 12/22/329 13/387/329
f 39/386/330 42/388/330 74/357/330 73/19/330
f 42/388/331 39/386/331 83/389/331 82/390/331
f 14/391/332 83/389/332 39/386/332 13/387/332
f 12/22/333 303/69/333 269/392/333 13/387/333
f 13/387/334 269/392/334 313/393/334 14/391/334
f 269/392/335 272/394/335 312/395/335 313/393/335
f 303/69/336 304/378/336 272/394/336 269/392/336
f 409/380/337 307/381/337 293/396/337 408/397/337
f 312/395/338 272/394/338 273/398/338 311/399/338
f 305/379/339 273/398/339 272/394/339 304/378/339
f 305/379/340 409/380/340 408/397/340 273/398/340
f 416/400/341 408/397/341 293/396/341 309/401/341
f 311/399/342 273/398/342 408/397/342 416/400/342
f 293/396/343 307/381/343 308/382/343 326/402/343
f 326/402/344 325/403/344 309/401/344 293/396/344
f 326/402/345 320/404/345 319/405/345 325/403/345
f 404/385/346 403/406/346 319/405/346 320/404/346
f 317/70/347 318/71/347 403/406/347 404/385/347
f 321/383/348 405/384/348 404/385/348 320/404/348
f 308/382/349 321/383/349 320/404/349 326/402/349
f 181/363/350 180/407/350 87/15/350 86/13/350
f 90/408/351 180/407/351 181/363/351 91/362/351
f 179/409/352 88/18/352 87/15/352 180/407/352
f 179/409/353 180/407/353 90/408/353 89/410/353
f 90/408/354 97/411/354 96/412/354 89/410/354
f 78/361/355 97/411/355 90/408/355 91/362/355
f 96/412/356 97/411/356 63/413/356 79/414/356
f 78/361/357 77/360/357 63/413/357 97/411/357
f 184/415/358 63/413/358 77/360/358 185/359/358
f 184/415/359 192/416/359 79/414/359 63/413/359
f 184/415/360 43/417/360 81/418/360 192/416/360
f 42/388/361 82/390/361 81/418/361 43/417/361
f 75/358/362 74/357/362 42/388/362 43/417/362
f 185/359/363 75/358/363 43/417/363 184/415/363
f 457/327/364 364/419/364 282/61/364 249/60/364
f 364/419/365 441/420/365 276/62/365 282/61/365
f 441/420/366 458/421/366 275/63/366 276/62/366
f 458/421/367 462/422/367 355/64/367 275/63/367
f 462/422/368 463/423/368 371/65/368 355/64/368
f 463/423/369 329/424/369 327/66/369 371/65/369
f 328/425/370 392/370/370 394/67/370 327/66/370
f 424/323/371 392/370/371 328/425/371 359/324/371
f 328/425/372 327/66/372 329/424/372 461/426/372
f 361/427/373 364/419/373 457/327/373 421/326/373
f 280/428/374 361/427/374 421/326/374 430/325/374
f 332/429/375 280/428/375 430/325/375 359/324/375
f 295/430/376 332/429/376 359/324/376 328/425/376
f 295/430/377 328/425/377 461/426/377 456/431/377
f 279/432/378 280/428/378 332/429/378 295/430/378
f 345/433/379 361/427/379 280/428/379 279/432/379
f 364/419/380 361/427/380 345/433/380 441/420/380
f 279/432/381 295/430/381 456/431/381 440/434/381
f 440/434/382 439/435/382 345/433/382 279/432/382
f 441/420/383 345/433/383 439/435/383 458/421/383
f 291/436/384 329/424/384 463/423/384 251/437/384
f 291/436/385 306/438/385 461/426/385 329/424/385
f 306/438/386 290/439/386 456/431/386 461/426/386
f 290/439/387 393/440/387 440/434/387 456/431/387
f 393/440/388 310/441/388 439/435/388 440/434/388
f 310/441/389 460/442/389 458/421/389 439/435/389
f 460/442/390 459/443/390 462/422/390 458/421/390
f 462/422/391 459/443/391 251/437/391 463/423/391
f 135/444/392 237/328/392 4/37/392 52/36/392
f 135/444/393 52/36/393 46/33/393 221/445/393
f 238/446/394 221/445/394 46/33/394 45/31/394
f 242/447/395 238/446/395 45/31/395 126/29/395
f 242/447/396 126/29/396 142/27/396 243/448/396
f 243/448/397 142/27/397 98/25/397 100/449/397
f 99/450/398 98/25/398 168/24/398 166/343/398
f 204/332/399 130/331/399 99/450/399 166/343/399
f 99/450/400 130/331/400 103/451/400 65/452/400
f 50/453/401 103/451/401 130/331/401 210/330/401
f 135/444/402 132/454/402 199/329/402 237/328/402
f 199/329/403 132/454/403 50/453/403 210/330/403
f 132/454/404 135/444/404 221/445/404 116/455/404
f 116/455/405 49/456/405 50/453/405 132/454/405
f 103/451/406 50/453/406 49/456/406 65/452/406
f 99/450/407 241/457/407 100/449/407 98/25/407
f 241/457/408 99/450/408 65/452/408 236/458/408
f 220/459/409 236/458/409 65/452/409 49/456/409
f 219/460/410 220/459/410 49/456/410 116/455/410
f 221/445/411 238/446/411 219/460/411 116/455/411
f 238/446/412 242/447/412 239/461/412 240/462/412
f 239/461/413 242/447/413 243/448/413 21/463/413
f 21/463/414 243/448/414 100/449/414 61/464/414
f 61/464/415 100/449/415 241/457/415 76/465/415
f 76/465/416 241/457/416 236/458/416 60/466/416
f 60/466/417 236/458/417 220/459/417 167/467/417
f 167/467/418 220/459/418 219/460/418 80/468/418
f 219/460/419 238/446/419 240/462/419 80/468/419
f 125/250/420 47/249/420 226/256/420 114/257/420
f 264/215/421 250/214/421 467/216/421
f 391/202/422 389/217/422 467/216/422 250/214/422
f 391/202/423 374/201/423 388/218/423 389/217/423
f 374/201/424 375/187/424 387/219/424 388/218/424
f 375/187/425 381/186/425 386/220/425 387/219/425
f 385/221/426 386/220/426 381/186/426 382/225/426
f 399/222/427 385/221/427 382/225/427 383/224/427
f 363/223/428 399/222/428 383/224/428
f 134/292/429 156/294/429 174/293/429
f 155/295/430 158/307/430 174/293/430 156/294/430
f 154/296/431 159/306/431 158/307/431 155/295/431
f 146/297/432 160/305/432 159/306/432 154/296/432
f 145/298/433 161/304/433 160/305/433 146/297/433
f 164/299/434 162/303/434 161/304/434 145/298/434
f 8/300/435 247/302/435 162/303/435 164/299/435
f 34/301/436 247/302/436 8/300/436
================================================
FILE: style/main.scss
================================================
@use "@material/theme" with (
$primary: blue,
$secondary: #000000,
$background: #fff,
);
@use "@material/icon-button";
@use "@material/slider";
@include slider.core-styles;
@include icon-button.core-styles;
html,
body {
margin: 0;
padding: 0;
background: #f5f5f5;
width: 100%;
height: 100%;
overflow: hidden;
font-family: 'Poppins', 'Roboto', 'Helvetica', 'Arial', sans-serif;
}
body.loading::before {
content: ' ';
display: block;
width: 100%;
height: 100%;
position: absolute;
background: url(../assets/spinner.svg) no-repeat center center;
}
.ui .mdc-icon-button.material-icons-outlined {
@include icon-button.icon-size(24px, 24px, 14px);
}
.container {
position: relative;
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
opacity: 1;
transition: opacity 0.5s;
overflow: hidden;
}
.loading .container {
opacity: 0;
}
.info {
display: none;
position: absolute;
width: 100%;
height: 100%;
align-items: flex-start;
justify-content: center;
z-index: 8;
}
.info.show {
display: flex;
}
.info-content {
background: #00000070;
padding: 1em;
width: 100%;
height: 100%;
padding-bottom: 3em;
color: white;
font-size: 28px;
padding: 1em 1.5em;
max-width: 800px;
h1 {
margin: 0;
line-height: 72px;
}
a {
color: white;
}
}
.alt-bts {
position: absolute;
top: 0.5em;
right: 0.5em;
z-index: 9;
display: flex;
flex-direction: column;
> * {
margin: 0.5em;
}
}
#bt-info {
background: white;
border-radius: 5em;
box-shadow: 0 0px 1px rgba(0, 0, 0, 0.1), 0 2px 15px rgba(0, 0, 0, 0.05);
}
/** Canvas **/
.three-canvas {
transform: scale(-1, 1);
box-shadow: 0 2px 15px rgba(0, 0, 0, 0.15);
border-radius: 2em;
}
.paused .three-canvas {
opacity: 0.5;
}
/** UI **/
.ui {
display: flex;
align-items: center;
justify-content: center;
border-radius: 9em;
padding: 0 .5em;
box-shadow: 0 0px 1px rgba(0, 0, 0, 0.1), 0 2px 15px rgba(0, 0, 0, 0.05);
background: white;
margin-top: 1.25em;
}
/** Color picker **/
.picker .a-color-picker {
border-radius: 15px;
overflow: hidden;
box-shadow: 0 2px 15px rgba(0, 0, 0, 0.15);
}
.color {
position: relative;
display: inline-block;
}
.picker {
position: absolute;
z-index: 3;
bottom: 65px;
left: -100px;
display: none;
}
.close-color {
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
z-index: 2;
}
#bt-picker {
border-radius: 1em;
}
/** Slider **/
.slider {
width: 150px;
display: inline-block;
margin: 0.5em 1em;
}
.mdc-slider__track-container {
position: absolute;
top: calc(1em + 5px);
width: 100%;
height: 10px;
overflow: hidden;
border-radius: 7em;
}
.mdc-slider__track-marker-container {
display: none;
}
.mdc-slider--discrete.mdc-slider--active .mdc-slider__pin {
transform: rotate(-45deg) scale(1) translate(30px, -30px);
}
.mdc-slider:not(.mdc-slider--disabled) .mdc-slider__track-container::after {
opacity: 0.1;
}
/** CURSOR **/
$cursorSize : 12px;
.cursor {
display: none;
position: absolute;
z-index: 999;
width: $cursorSize;
height: $cursorSize;
border-radius: 75px;
background: white;
pointer-events: none;
opacity: 0.8;
transform: translate(-50%, -50%);
}
.hover-face .container {
cursor:none;
}
.hover-face .cursor {
display: block;
}
/** LAPTOP **/
@media only screen and (max-height: 800px) and (min-width: 600px) {
body {
display: flex;
align-items: center;
justify-content: center;
}
.container {
position: relative;
width: 640px;
height: 640px;
border-radius: 2em;
}
.three-canvas {
border-radius: 0;
}
.ui {
position: absolute;
bottom: 1em;
}
}
/** MOBILE **/
@media only screen and (max-width: 600px) {
.ui {
position: absolute;
bottom: 1em;
}
.picker {
left: -20px;
}
}