Skip to content

Instantly share code, notes, and snippets.

@benursu
Created August 3, 2019 01:25
Show Gist options
  • Save benursu/93602973157fd725e22ca60d42df768d to your computer and use it in GitHub Desktop.
Save benursu/93602973157fd725e22ca60d42df768d to your computer and use it in GitHub Desktop.
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// Kraken
// @afrosquared | Ben Ursu
// Instagram | Spark AR Studio | SDK v65.0
// https://www.instagram.com/a/r/?effect_id=729495860843284
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//require
const Scene = require('Scene');
const Animation = require('Animation');
const R = require('Reactive');
const D = require('Diagnostics');
const Time = require('Time');
const Materials = require('Materials');
const Textures = require('Textures');
const FT = require('FaceTracking');
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//init
var zero = Scene.root.find('zero');
var rotation180 = Math.PI;
var rotation360 = Math.PI * 2;
var vectorForward = R.vector(1, 0, 0);
var faceOffsetX = 0.5;
var faceOffsetZ = 53.5;
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//face init
var faceTracker0 = Scene.root.find('faceTracker0');
var faceTracker0LeftEyePosition = FT.face(0).leftEye.center;
var faceTracker0LeftProxy = Scene.root.find('faceTracker0LeftProxy');
var faceTracker0PortholeLeft = Scene.root.find('faceTracker0PortholeLeft');
var faceTracker0RightEyePosition = FT.face(0).rightEye.center;
var faceTracker0RightProxy = Scene.root.find('faceTracker0RightProxy');
var faceTracker0PortholeRight = Scene.root.find('faceTracker0PortholeRight');
var faceTracker1 = Scene.root.find('faceTracker1');
var faceTracker1LeftEyePosition = FT.face(1).leftEye.center;
var faceTracker1LeftProxy = Scene.root.find('faceTracker1LeftProxy');
var faceTracker1PortholeLeft = Scene.root.find('faceTracker1PortholeLeft');
var faceTracker1RightEyePosition = FT.face(1).rightEye.center;
var faceTracker1RightProxy = Scene.root.find('faceTracker1RightProxy');
var faceTracker1PortholeRight = Scene.root.find('faceTracker1PortholeRight');
var faceTrackerCameraTransforms = [FT.face(0).cameraTransform, FT.face(0).cameraTransform, FT.face(1).cameraTransform, FT.face(1).cameraTransform];
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//face openness
var eyeOpennessStart = 5;
var eyeOpennessFactor = 13;
var faceTracker0LeftEyeOpenness = R.val(eyeOpennessStart).sub((R.val(1).sub(FT.face(0).leftEye.openness)).mul(eyeOpennessFactor));
var faceTracker0RightEyeOpenness = R.val(eyeOpennessStart).sub((R.val(1).sub(FT.face(0).rightEye.openness)).mul(eyeOpennessFactor));
var faceTracker1LeftEyeOpenness = R.val(eyeOpennessStart).sub((R.val(1).sub(FT.face(1).leftEye.openness)).mul(eyeOpennessFactor));
var faceTracker1RightEyeOpenness = R.val(eyeOpennessStart).sub((R.val(1).sub(FT.face(1).rightEye.openness)).mul(eyeOpennessFactor));
var mouthOpennessStart = 80;
var mouthOpennessFactor = 25;
var faceTracker0MouthOpenness = R.val(mouthOpennessStart).add((FT.face(0).mouth.openness).mul(mouthOpennessFactor));
var faceTracker1MouthOpenness = R.val(mouthOpennessStart).add((FT.face(1).mouth.openness).mul(mouthOpennessFactor));
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//face positions
faceTracker0LeftProxy.transform.x = FT.face(0).cameraTransform.applyTo(FT.face(0).leftEye.center).x;
faceTracker0LeftProxy.transform.y = FT.face(0).cameraTransform.applyTo(FT.face(0).leftEye.center).y.add(faceTracker0LeftEyeOpenness);
faceTracker0LeftProxy.transform.z = FT.face(0).cameraTransform.applyTo(FT.face(0).leftEye.center).z.add(faceTracker0MouthOpenness);
faceTracker0RightProxy.transform.x = FT.face(0).cameraTransform.applyTo(FT.face(0).rightEye.center).x;
faceTracker0RightProxy.transform.y = FT.face(0).cameraTransform.applyTo(FT.face(0).rightEye.center).y.add(faceTracker0RightEyeOpenness);
faceTracker0RightProxy.transform.z = FT.face(0).cameraTransform.applyTo(FT.face(0).rightEye.center).z.add(faceTracker0MouthOpenness);
faceTracker0PortholeLeft.transform.x = FT.face(0).cameraTransform.applyTo(FT.face(0).leftEye.center).x.add(-faceOffsetX);
faceTracker0PortholeLeft.transform.y = FT.face(0).cameraTransform.applyTo(FT.face(0).leftEye.center).y;
faceTracker0PortholeLeft.transform.z = FT.face(0).cameraTransform.applyTo(FT.face(0).leftEye.center).z.add(faceOffsetZ+1.5);
faceTracker0PortholeLeft.transform.rotationX = FT.face(0).cameraTransform.rotationX;
faceTracker0PortholeLeft.transform.rotationY = FT.face(0).cameraTransform.rotationY;
faceTracker0PortholeLeft.transform.rotationZ = FT.face(0).cameraTransform.rotationZ;
faceTracker0PortholeRight.transform.x = FT.face(0).cameraTransform.applyTo(FT.face(0).rightEye.center).x.add(faceOffsetX);
faceTracker0PortholeRight.transform.y = FT.face(0).cameraTransform.applyTo(FT.face(0).rightEye.center).y;
faceTracker0PortholeRight.transform.z = FT.face(0).cameraTransform.applyTo(FT.face(0).rightEye.center).z.add(faceOffsetZ+1.5);
faceTracker0PortholeRight.transform.rotationX = FT.face(0).cameraTransform.rotationX;
faceTracker0PortholeRight.transform.rotationY = FT.face(0).cameraTransform.rotationY;
faceTracker0PortholeRight.transform.rotationZ = FT.face(0).cameraTransform.rotationZ;
faceTracker1LeftProxy.transform.x = FT.face(1).cameraTransform.applyTo(FT.face(1).leftEye.center).x;
faceTracker1LeftProxy.transform.y = FT.face(1).cameraTransform.applyTo(FT.face(1).leftEye.center).y.add(faceTracker1LeftEyeOpenness);
faceTracker1LeftProxy.transform.z = FT.face(1).cameraTransform.applyTo(FT.face(1).leftEye.center).z.add(faceTracker1MouthOpenness);
faceTracker1RightProxy.transform.x = FT.face(1).cameraTransform.applyTo(FT.face(1).rightEye.center).x;
faceTracker1RightProxy.transform.y = FT.face(1).cameraTransform.applyTo(FT.face(1).rightEye.center).y.add(faceTracker1RightEyeOpenness);
faceTracker1RightProxy.transform.z = FT.face(1).cameraTransform.applyTo(FT.face(1).rightEye.center).z.add(faceTracker1MouthOpenness);
faceTracker1PortholeLeft.transform.x = FT.face(1).cameraTransform.applyTo(FT.face(1).leftEye.center).x.add(-faceOffsetX);
faceTracker1PortholeLeft.transform.y = FT.face(1).cameraTransform.applyTo(FT.face(1).leftEye.center).y;
faceTracker1PortholeLeft.transform.z = FT.face(1).cameraTransform.applyTo(FT.face(1).leftEye.center).z.add(faceOffsetZ+1.5);
faceTracker1PortholeLeft.transform.rotationX = FT.face(1).cameraTransform.rotationX;
faceTracker1PortholeLeft.transform.rotationY = FT.face(1).cameraTransform.rotationY;
faceTracker1PortholeLeft.transform.rotationZ = FT.face(1).cameraTransform.rotationZ;
faceTracker1PortholeRight.transform.x = FT.face(1).cameraTransform.applyTo(FT.face(1).rightEye.center).x.add(faceOffsetX);
faceTracker1PortholeRight.transform.y = FT.face(1).cameraTransform.applyTo(FT.face(1).rightEye.center).y;
faceTracker1PortholeRight.transform.z = FT.face(1).cameraTransform.applyTo(FT.face(1).rightEye.center).z.add(faceOffsetZ+1.5);
faceTracker1PortholeRight.transform.rotationX = FT.face(1).cameraTransform.rotationX;
faceTracker1PortholeRight.transform.rotationY = FT.face(1).cameraTransform.rotationY;
faceTracker1PortholeRight.transform.rotationZ = FT.face(1).cameraTransform.rotationZ;
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//segments
var segmentStreakTotal = 4;
var segmentSegmentTotal = 20;
var segmentScaleStart = 0.018;
var segmentScaleTaper = 0.018;
var segmentStartPositions = [];
segmentStartPositions.push(R.vector(-faceOffsetX,0,faceOffsetZ));
segmentStartPositions.push(R.vector(faceOffsetX,0,faceOffsetZ));
segmentStartPositions.push(R.vector(-faceOffsetX,0,faceOffsetZ));
segmentStartPositions.push(R.vector(faceOffsetX,0,faceOffsetZ));
var segmentProxies = [faceTracker0LeftProxy, faceTracker0RightProxy, faceTracker1LeftProxy, faceTracker1RightProxy];
var segmentEyePositions = [faceTracker0LeftEyePosition, faceTracker0RightEyePosition, faceTracker1LeftEyePosition, faceTracker1RightEyePosition];
var segmentEndPositions = [];
var segmentEndPositionsDurationMin = 2000;
var segmentEndPositionsDurationMax = 4000;
var segmentEndPositionsXDrivers = [];
var segmentEndPositionsYDrivers = [];
var segmentEndPositionsZDrivers = [];
var segmentEndPositionsXDriverSubs = [];
var segmentEndPositionsYDriverSubs = [];
var segmentEndPositionsZDriverSubs = [];
var segmentEndPositionsXMax = 2;
var segmentEndPositionsYMax = 2;
var segmentEndPositionsZStart = 25;
var segmentEndPositionsZMax = 10;
var segmentCurves = [];
var segmentCurvesDurationMin = 1500;
var segmentCurvesDurationMax = 3000;
var segmentCurvesXDrivers = [];
var segmentCurvesYDrivers = [];
var segmentCurvesZDrivers = [];
var segmentCurvesXDriverSubs = [];
var segmentCurvesYDriverSubs = [];
var segmentCurvesZDriverSubs = [];
var segmentCurvesXMax = 0.05;
var segmentCurvesYMax = 5;
var segmentCurvesZMax = 2.5;
var positions = [];
var segments = [];
var segmentLines = [];
var segmentLineCubes = [];
var segmentLineCubeNodes = [];
var segmentLineCubeNodeDrivers = [];
var segmentPositionRatios = [];
var segmentScaleRatios = [];
var segmentLineCubeNodeScaleDuration = 600;
for(var i = 0; i <= segmentStreakTotal; i++){
positions.push([]);
segments.push([]);
segmentLines.push([]);
segmentLineCubes.push([]);
segmentLineCubeNodes.push([]);
segmentLineCubeNodeDrivers.push([]);
segmentPositionRatios.push([]);
segmentScaleRatios.push([]);
}
for(var i = 0; i < segmentStreakTotal; i++){
var segmentEnd = Scene.root.find('segment' + i + '_end');
segmentEnd.transform.x = i*5;
segmentEnd.transform.y = 0;
segmentEnd.transform.z = 30;
segmentEndPositions.push(segmentEnd);
var segmentCurve = Scene.root.find('segment' + i + '_curves');
segmentCurve.transform.x = getRandom(-segmentCurvesXMax, segmentCurvesXMax);
segmentCurve.transform.y = getRandom(-segmentCurvesYMax, segmentCurvesYMax);
segmentCurve.transform.z = getRandom(0, segmentCurvesZMax);
segmentCurves.push(segmentCurve);
segmentCurvesXDrivers.push(null);
segmentCurvesYDrivers.push(null);
segmentCurvesZDrivers.push(null);
segmentCurvesXDriverSubs.push(null);
segmentCurvesYDriverSubs.push(null);
segmentCurvesZDriverSubs.push(null);
for(var k = 0; k < segmentSegmentTotal; k++){
var segment = Scene.root.find('segment' + i + '_' + k);
segment.hidden = false;
var segmentLine = segment.child('line');
var segmentLineCube = segmentLine.child('cube');
var segmentLineCubeNode = segmentLineCube.child('node-0');
segmentLineCubeNode.transform.scaleX = segmentScaleStart - ((k/segmentSegmentTotal) * segmentScaleTaper);
segmentLineCubeNode.transform.scaleZ = segmentScaleStart - ((k/segmentSegmentTotal) * segmentScaleTaper);
var segmentPositionRatio = R.val(1);
var segmentScaleRatio = R.val(1);
segments[i].push(segment);
segmentLines[i].push(segmentLine);
segmentLineCubes[i].push(segmentLineCube);
segmentLineCubeNodes[i].push(segmentLineCubeNode);
segmentLineCubeNodeDrivers[i].push(null);
segmentPositionRatios[i].push(segmentPositionRatio);
segmentScaleRatios[i].push(segmentScaleRatio);
}
for(var k = 0; k <= segmentSegmentTotal; k++){
var position = Scene.root.find('position' + i + '_' + k);
positions[i].push(position);
}
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// segment init
var ctExpSmooth = 200;
var connections = [];
var connectionsFloat = [];
for(var i = 0; i < segmentStreakTotal; i++){
var connection = Scene.root.find('connection' + i);
var connectionFloat = Scene.root.find('connection' + i + 'Float');
connections.push(connection);
connectionsFloat.push(connectionFloat);
connectionsFloat[i].transform.x = segmentProxies[i].transform.x.expSmooth(ctExpSmooth);
connectionsFloat[i].transform.y = segmentProxies[i].transform.y.expSmooth(ctExpSmooth);
connectionsFloat[i].transform.z = segmentProxies[i].transform.z.expSmooth(ctExpSmooth);
connections[i].transform.position = connectionsFloat[i].transform.position.expSmooth(ctExpSmooth);
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//segments lookat
for(var i = 0; i < segmentStreakTotal; i++){
for(var k = 0; k < segmentSegmentTotal; k++){
segments[i][k].transform.position = positions[i][k].transform.position.mul(segmentPositionRatios[i][k]);
segmentLineCubes[i][k].transform.scaleX = positions[i][k].transform.position.distance(positions[i][k+1].transform.position).mul(segmentScaleRatios[i][k]);
var position0_forwardVector = R.normalize(positions[i][k+1].transform.position.sub(positions[i][k].transform.position));
var position0_rotationAxis = position0_forwardVector.cross(vectorForward);
var position0_dot = position0_forwardVector.dot(vectorForward).add(1);
var position0_w0 = position0_dot.mul(-1);
var position0_x0 = position0_rotationAxis.x;
var position0_y0 = position0_rotationAxis.y;
var position0_z0 = position0_rotationAxis.z;
var position0QuatL = R.sqrt((position0_x0.mul(position0_x0)).add(position0_y0.mul(position0_y0)).add(position0_z0.mul(position0_z0)).add(position0_w0.mul(position0_w0)));
var position0QuatLL = R.val(1).div(position0QuatL);
var position0_w = position0_w0.mul(position0QuatLL);
var position0_x = position0_x0.mul(position0QuatLL);
var position0_y = position0_y0.mul(position0QuatLL);
var position0_z = position0_z0.mul(position0QuatLL);
//quaternion to euler using zyx
var position0_r11 = R.val(2).mul((position0_x.mul(position0_y).add(position0_w.mul(position0_z))));
var position0_r12 = (position0_w.mul(position0_w)).add(position0_x.mul(position0_x)).sub(position0_y.mul(position0_y)).sub(position0_z.mul(position0_z));
var position0_r21 = R.val(-2).mul((position0_x.mul(position0_z)).sub(position0_w.mul(position0_y)));
var position0_r31 = R.val(2).mul((position0_y.mul(position0_z)).add(position0_w.mul(position0_x)));
var position0_r32 = (position0_w.mul(position0_w)).sub(position0_x.mul(position0_x)).sub(position0_y.mul(position0_y)).add(position0_z.mul(position0_z));
var position0_heading = R.atan2(position0_r31, position0_r32);
var position0_asin_attitude = R.asin(position0_r21);
var position0_bank = R.atan2(position0_r11, position0_r12);
segments[i][k].transform.rotationX = position0_heading;
segments[i][k].transform.rotationY = position0_asin_attitude;
segments[i][k].transform.rotationZ = position0_bank;
}
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//segments start/end positions
function segmentPositions(){
for(var i = 0; i < segmentStreakTotal; i++){
for(var k = 0; k <= segmentSegmentTotal; k++){
var percentage = k/segmentSegmentTotal;
var bridgeToConnection0AttractionPerc = percentage;
var bridgeToConnection1AttractionPerc = R.vector(bridgeToConnection0AttractionPerc * bridgeToConnection0AttractionPerc, 0, bridgeToConnection0AttractionPerc * bridgeToConnection0AttractionPerc);
if(k == segmentSegmentTotal){
bridgeToConnection1AttractionPerc = 0;
}
var bridge = faceTrackerCameraTransforms[i].applyTo(segmentEyePositions[i].add(R.vector(segmentCurves[i].transform.x.mul(k*k), segmentCurves[i].transform.y.mul(Math.sin(Math.PI * percentage)), segmentCurves[i].transform.z.mul(k)))).add(segmentStartPositions[i]);
var bridgeToConnection0 = connections[i].transform.position.sub(bridge);
var bridgeToConnection0Weight = bridge.add(bridgeToConnection0.mul(bridgeToConnection0AttractionPerc));
positions[i][k].transform.position = bridgeToConnection0Weight;
}
}
}
segmentPositions();
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// segment animate
function segmentEndPositionsX(id, snapshots){
segmentEndPositionsXDrivers[id] = Animation.timeDriver({durationMilliseconds: getRandom(segmentEndPositionsDurationMin, segmentEndPositionsDurationMax)});
var sampler = Animation.samplers.easeInOutBounce(snapshots['segmentEndPositions[id].transform.x'], getRandom(-segmentEndPositionsXMax, segmentEndPositionsXMax));
segmentEndPositions[id].transform.x = Animation.animate(segmentEndPositionsXDrivers[id], sampler);
if(id == 0){
segmentEndPositionsXDriverSubs[id] = segmentEndPositionsXDrivers[id].onCompleted().subscribeWithSnapshot({'segmentEndPositions[id].transform.x': segmentEndPositions[id].transform.x }, function(e, snapshots){ segmentEndPositionsX(0, snapshots); });
}else if(id == 1){
segmentEndPositionsXDriverSubs[id] = segmentEndPositionsXDrivers[id].onCompleted().subscribeWithSnapshot({'segmentEndPositions[id].transform.x': segmentEndPositions[id].transform.x }, function(e, snapshots){ segmentEndPositionsX(1, snapshots); });
}else if(id == 2){
segmentEndPositionsXDriverSubs[id] = segmentEndPositionsXDrivers[id].onCompleted().subscribeWithSnapshot({'segmentEndPositions[id].transform.x': segmentEndPositions[id].transform.x }, function(e, snapshots){ segmentEndPositionsX(2, snapshots); });
}
segmentEndPositionsXDrivers[id].start();
}
function segmentEndPositionsY(id, snapshots){
segmentEndPositionsYDrivers[id] = Animation.timeDriver({durationMilliseconds: getRandom(segmentEndPositionsDurationMin, segmentEndPositionsDurationMax)});
var sampler = Animation.samplers.easeInOutBounce(snapshots['segmentEndPositions[id].transform.y'], getRandom(-segmentEndPositionsYMax, segmentEndPositionsYMax));
segmentEndPositions[id].transform.y = Animation.animate(segmentEndPositionsYDrivers[id], sampler);
if(id == 0){
segmentEndPositionsYDriverSubs[id] = segmentEndPositionsYDrivers[id].onCompleted().subscribeWithSnapshot({'segmentEndPositions[id].transform.y': segmentEndPositions[id].transform.y }, function(e, snapshots){ segmentEndPositionsY(0, snapshots); });
}else if(id == 1){
segmentEndPositionsYDriverSubs[id] = segmentEndPositionsYDrivers[id].onCompleted().subscribeWithSnapshot({'segmentEndPositions[id].transform.y': segmentEndPositions[id].transform.y }, function(e, snapshots){ segmentEndPositionsY(1, snapshots); });
}else if(id == 2){
segmentEndPositionsYDriverSubs[id] = segmentEndPositionsYDrivers[id].onCompleted().subscribeWithSnapshot({'segmentEndPositions[id].transform.y': segmentEndPositions[id].transform.y }, function(e, snapshots){ segmentEndPositionsY(2, snapshots); });
}
segmentEndPositionsYDrivers[id].start();
}
function segmentEndPositionsZ(id, snapshots){
segmentEndPositionsZDrivers[id] = Animation.timeDriver({durationMilliseconds: getRandom(segmentEndPositionsDurationMin, segmentEndPositionsDurationMax)});
var sampler = Animation.samplers.easeInOutBounce(snapshots['segmentEndPositions[id].transform.z'], segmentEndPositionsZStart + getRandom(-segmentEndPositionsZMax, segmentEndPositionsZMax));
segmentEndPositions[id].transform.z = Animation.animate(segmentEndPositionsZDrivers[id], sampler);
if(id == 0){
segmentEndPositionsZDriverSubs[id] = segmentEndPositionsZDrivers[id].onCompleted().subscribeWithSnapshot({'segmentEndPositions[id].transform.z': segmentEndPositions[id].transform.z }, function(e, snapshots){ segmentEndPositionsZ(0, snapshots); });
}else if(id == 1){
segmentEndPositionsZDriverSubs[id] = segmentEndPositionsZDrivers[id].onCompleted().subscribeWithSnapshot({'segmentEndPositions[id].transform.z': segmentEndPositions[id].transform.z }, function(e, snapshots){ segmentEndPositionsZ(1, snapshots); });
}else if(id == 2){
segmentEndPositionsZDriverSubs[id] = segmentEndPositionsZDrivers[id].onCompleted().subscribeWithSnapshot({'segmentEndPositions[id].transform.z': segmentEndPositions[id].transform.z }, function(e, snapshots){ segmentEndPositionsZ(2, snapshots); });
}
segmentEndPositionsZDrivers[id].start();
}
function segmentCurvesX(id, snapshots){
segmentCurvesXDrivers[id] = Animation.timeDriver({durationMilliseconds: getRandom(segmentCurvesDurationMin, segmentCurvesDurationMax)});
var sampler = Animation.samplers.easeInOutExpo(snapshots['segmentCurves[id].transform.x'], getRandom(-segmentCurvesXMax, segmentCurvesXMax));
segmentCurves[id].transform.x = Animation.animate(segmentCurvesXDrivers[id], sampler);
if(id == 0){
segmentCurvesXDriverSubs[id] = segmentCurvesXDrivers[id].onCompleted().subscribeWithSnapshot({'segmentCurves[id].transform.x': segmentCurves[id].transform.x }, function(e, snapshots){ segmentCurvesX(0, snapshots); });
}else if(id == 1){
segmentCurvesXDriverSubs[id] = segmentCurvesXDrivers[id].onCompleted().subscribeWithSnapshot({'segmentCurves[id].transform.x': segmentCurves[id].transform.x }, function(e, snapshots){ segmentCurvesX(1, snapshots); });
}else if(id == 2){
segmentCurvesXDriverSubs[id] = segmentCurvesXDrivers[id].onCompleted().subscribeWithSnapshot({'segmentCurves[id].transform.x': segmentCurves[id].transform.x }, function(e, snapshots){ segmentCurvesX(2, snapshots); });
}
segmentCurvesXDrivers[id].start();
}
function segmentCurvesY(id, snapshots){
segmentCurvesYDrivers[id] = Animation.timeDriver({durationMilliseconds: getRandom(segmentCurvesDurationMin, segmentCurvesDurationMax)});
var sampler = Animation.samplers.easeInOutExpo(snapshots['segmentCurves[id].transform.y'], getRandom(-segmentCurvesYMax, segmentCurvesYMax));
segmentCurves[id].transform.y = Animation.animate(segmentCurvesYDrivers[id], sampler);
if(id == 0){
segmentCurvesYDriverSubs[id] = segmentCurvesYDrivers[id].onCompleted().subscribeWithSnapshot({'segmentCurves[id].transform.y': segmentCurves[id].transform.y }, function(e, snapshots){ segmentCurvesY(0, snapshots); });
}else if(id == 1){
segmentCurvesYDriverSubs[id] = segmentCurvesYDrivers[id].onCompleted().subscribeWithSnapshot({'segmentCurves[id].transform.y': segmentCurves[id].transform.y }, function(e, snapshots){ segmentCurvesY(1, snapshots); });
}else if(id == 2){
segmentCurvesYDriverSubs[id] = segmentCurvesYDrivers[id].onCompleted().subscribeWithSnapshot({'segmentCurves[id].transform.y': segmentCurves[id].transform.y }, function(e, snapshots){ segmentCurvesY(2, snapshots); });
}
segmentCurvesYDrivers[id].start();
}
function segmentCurvesZ(id, snapshots){
segmentCurvesZDrivers[id] = Animation.timeDriver({durationMilliseconds: getRandom(segmentCurvesDurationMin, segmentCurvesDurationMax)});
var sampler = Animation.samplers.easeInOutExpo(snapshots['segmentCurves[id].transform.z'], getRandom(0, segmentCurvesZMax));
segmentCurves[id].transform.z = Animation.animate(segmentCurvesZDrivers[id], sampler);
if(id == 0){
segmentCurvesZDriverSubs[id] = segmentCurvesZDrivers[id].onCompleted().subscribeWithSnapshot({'segmentCurves[id].transform.z': segmentCurves[id].transform.z }, function(e, snapshots){ segmentCurvesZ(0, snapshots); });
}else if(id == 1){
segmentCurvesZDriverSubs[id] = segmentCurvesZDrivers[id].onCompleted().subscribeWithSnapshot({'segmentCurves[id].transform.z': segmentCurves[id].transform.z }, function(e, snapshots){ segmentCurvesZ(1, snapshots); });
}else if(id == 2){
segmentCurvesZDriverSubs[id] = segmentCurvesZDrivers[id].onCompleted().subscribeWithSnapshot({'segmentCurves[id].transform.z': segmentCurves[id].transform.z }, function(e, snapshots){ segmentCurvesZ(2, snapshots); });
}
segmentCurvesZDrivers[id].start();
}
function segmentCurvesStop(){
for(var i = 0; i < segmentStreakTotal; i++){
if(segmentCurvesXDrivers[i] != null){
segmentCurvesXDrivers[i].stop();
}
if(segmentCurvesXDriverSubs[i] != null){
segmentCurvesXDriverSubs[i].unsubscribe();
}
if(segmentCurvesYDrivers[i] != null){
segmentCurvesYDrivers[i].stop();
}
if(segmentCurvesYDriverSubs[i] != null){
segmentCurvesYDriverSubs[i].unsubscribe();
}
if(segmentCurvesZDrivers[i] != null){
segmentCurvesZDrivers[i].stop();
}
if(segmentCurvesZDriverSubs[i] != null){
segmentCurvesZDriverSubs[i].unsubscribe();
}
}
}
var segmentCurvesAll = {};
for(var i = 0; i < segmentStreakTotal; i++){
segmentCurvesAll['segmentEndPositions[' + i + '].transform.x'] = segmentEndPositions[i].transform.x;
segmentCurvesAll['segmentEndPositions[' + i + '].transform.y'] = segmentEndPositions[i].transform.y;
segmentCurvesAll['segmentEndPositions[' + i + '].transform.z'] = segmentEndPositions[i].transform.z;
segmentCurvesAll['segmentCurves[' + i + '].transform.x'] = segmentCurves[i].transform.x;
segmentCurvesAll['segmentCurves[' + i + '].transform.y'] = segmentCurves[i].transform.y;
segmentCurvesAll['segmentCurves[' + i + '].transform.z'] = segmentCurves[i].transform.z;
}
segmentCurvesAll['FT.face(0).isTracked'] = FT.face(0).isTracked;
segmentCurvesAll['FT.face(1).isTracked'] = FT.face(1).isTracked;
Time.setTimeoutWithSnapshot(segmentCurvesAll, function (e, snapshots) {
segmentCurvesX(0, { 'segmentCurves[id].transform.x': snapshots['segmentCurves[0].transform.x'] });
segmentCurvesY(0, { 'segmentCurves[id].transform.y': snapshots['segmentCurves[0].transform.y'] });
segmentCurvesZ(0, { 'segmentCurves[id].transform.z': snapshots['segmentCurves[0].transform.z'] });
segmentCurvesX(1, { 'segmentCurves[id].transform.x': snapshots['segmentCurves[1].transform.x'] });
segmentCurvesY(1, { 'segmentCurves[id].transform.y': snapshots['segmentCurves[1].transform.y'] });
segmentCurvesZ(1, { 'segmentCurves[id].transform.z': snapshots['segmentCurves[1].transform.z'] });
}, 0);
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//pearl
/*
var pearlBuried = R.vector(0, -5.00048, 51.48808);
var pearlFound = R.vector(0, 0, 20);
var pearl = Scene.root.find('pearl');
var pearlPositions = [];
for(var i = 0; i < segmentStreakTotal; i++){
var pearlPosition = pearl.child('position' + i);
pearlPositions.push(pearlPosition);
}
*/
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// face monitor
var faceTwoFoundStarted = false;
var subscription = FT.count.monitor({fireOnInitialValue: true}).subscribeWithSnapshot(segmentCurvesAll, function(e, snapshots) {
if(snapshots['FT.face(0).isTracked']){
faceTracker0PortholeLeft.hidden = false;
faceTracker0PortholeRight.hidden = false;
for(var k = 0; k < segmentSegmentTotal; k++){
segments[0][k].hidden = false;
segments[1][k].hidden = false;
}
}else{
faceTracker0PortholeLeft.hidden = true;
faceTracker0PortholeRight.hidden = true;
for(var k = 0; k < segmentSegmentTotal; k++){
segments[0][k].hidden = true;
segments[1][k].hidden = true;
}
}
if(snapshots['FT.face(1).isTracked']){
faceTracker1PortholeLeft.hidden = false;
faceTracker1PortholeRight.hidden = false;
for(var k = 0; k < segmentSegmentTotal; k++){
segments[2][k].hidden = false;
segments[3][k].hidden = false;
}
}else{
faceTracker1PortholeLeft.hidden = true;
faceTracker1PortholeRight.hidden = true;
for(var k = 0; k < segmentSegmentTotal; k++){
segments[2][k].hidden = true;
segments[3][k].hidden = true;
}
}
if(e.newValue == 2 && !faceTwoFoundStarted){
faceTwoFoundStarted = true;
Time.setTimeoutWithSnapshot(segmentCurvesAll, function (e, snapshots) {
segmentCurvesX(2, { 'segmentCurves[id].transform.x': snapshots['segmentCurves[2].transform.x'] });
segmentCurvesY(2, { 'segmentCurves[id].transform.y': snapshots['segmentCurves[2].transform.y'] });
segmentCurvesZ(2, { 'segmentCurves[id].transform.z': snapshots['segmentCurves[2].transform.z'] });
segmentCurvesX(3, { 'segmentCurves[id].transform.x': snapshots['segmentCurves[3].transform.x'] });
segmentCurvesY(3, { 'segmentCurves[id].transform.y': snapshots['segmentCurves[3].transform.y'] });
segmentCurvesZ(3, { 'segmentCurves[id].transform.z': snapshots['segmentCurves[3].transform.z'] });
}, 0);
}
});
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// helpers
function getRandom(min, max) {
return Math.random() * (max - min) + min;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment