Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //@input float faceScale = 3.0 {"label":"Face scale", "min": 1.0, "max": 5.0, "step":0.1}
- //@input float easeDuration = 0.5 {"label":"Zoom duration's)", "min": 0.1, "max": 10.0, "step":0.1}
- //@input Component.Head head
- //@input Component.Camera camera
- //@input Component.Image image
- var zoom = 0;
- var endZoom = 0;
- var startZoom = 0;
- var isFaceTracking = false;
- var startTime = 0;
- function onFaceFound()
- {
- isFaceTracking = true;
- startTime = getTime();
- startZoom = zoom;
- }
- function onFaceLost()
- {
- isFaceTracking = false;
- startTime = getTime();
- startZoom = zoom;
- }
- function onUpdate()
- {
- var top;
- var bottom;
- var center;
- var transform = script.image.getSceneObject().getComponent("Component.ScreenTransform");
- if(!isFaceTracking) {
- top = new vec2(0,1);
- right = new vec2(.5,.5);
- bottom = new vec2(0,-2);
- left = new vec2(.5,.5);
- center = new vec2(0.5,0.5);
- }else{
- top = script.head.getLandmark(71);
- right = script.head.getLandmark(16);
- bottom = script.head.getLandmark(8);
- left = script.head.getLandmark(0);
- center = script.head.getLandmark(29);
- }
- //Compute face height
- var faceSize = bottom.y - top.y;
- if(script.camera.aspect < 1) {
- faceSize = right.x - left.x;
- }
- //Set zoom so the face fits the screen (times the faceScale value)
- var endZoom = 1/faceSize * script.faceScale;
- //Reduce zoom scale on mobile vertical screens
- //if(script.camera.aspect < 1) endZoom /= 2;
- //Ease zoom value
- var elapsedDuration = Math.min(script.easeDuration, getTime()-startTime);
- var endValue = !isFaceTracking? 0 : endZoom;
- var func = !isFaceTracking? easeIn : easeOut
- zoom = func(elapsedDuration, startZoom, endValue-startZoom, script.easeDuration);
- //Compensate scale generated offset by panning
- var offsetX = (center.x - .5) * zoom;
- var offsetY = (center.y - .5) * zoom;
- //Move texture opposite to face position to center it.
- center.x = (-center.x*2+1) - offsetX;
- center.y = (center.y*2-1) + offsetY;
- //Avoid texture border to be visible
- if(center.x >= .5*zoom) center.x = .5*zoom;
- if(center.x <= -.5*zoom) center.x = -.5*zoom;
- if(center.y >= .5*zoom) center.y = .5*zoom;
- if(center.y <= -.5*zoom) center.y = -.5*zoom;
- //Move and scale texture
- transform.anchors.setCenter(center);
- transform.anchors.setSize(new vec2(zoom, zoom));
- }
- script.createEvent("FaceFoundEvent").bind(onFaceFound);
- script.createEvent("FaceLostEvent").bind(onFaceLost);
- script.createEvent("UpdateEvent").bind( onUpdate );
- function easeOut(t, b, c, d, s) {
- return c * (t /= d) * t * t * t * t * t + b;
- };
- function easeIn(t, b, c, d, s) {
- return c * ((t = t / d - 1) * t * t * t * t + 1) + b;
- }
Add Comment
Please, Sign In to add comment