Created
August 3, 2019 01:25
-
-
Save benursu/93602973157fd725e22ca60d42df768d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
////////////////////////////////////////////////////////////////////////// | |
////////////////////////////////////////////////////////////////////////// | |
////////////////////////////////////////////////////////////////////////// | |
// 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