From e9934ac696b7d70466ca962d97b18a2272592719 Mon Sep 17 00:00:00 2001 From: Faye Li Date: Wed, 5 Apr 2017 14:59:19 -0700 Subject: [PATCH 1/3] selfie stick script --- script-archive/selfieStick.js | 104 ++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 script-archive/selfieStick.js diff --git a/script-archive/selfieStick.js b/script-archive/selfieStick.js new file mode 100644 index 0000000000..767cf55144 --- /dev/null +++ b/script-archive/selfieStick.js @@ -0,0 +1,104 @@ +// selfieStick.js +// +// Created by Faye Li on March 23, 2016 +// +// Usage instruction: Spacebar toggles camera control - WASD first person free movement or no movement but allowing others to grab the selfie stick +// and control your camera. +// For best result, turn off avatar collisions(Developer > Avatar > Uncheck Enable Avatar Collisions) +// + +(function() { // BEGIN LOCAL_SCOPE + var MODEL_URL = "https://hifi-content.s3.amazonaws.com/faye/twitch-stream/selfie_stick.json"; + var AVATAR_URL = "https://hifi-content.s3.amazonaws.com/jimi/avatar/camera/fst/camera.fst"; + var originalAvatar = null; + var importedEntityIDs = []; + var selfieStickEntityID = null; + var lensEntityID = null; + var freeMovementMode = true; + + changeAvatar(); + importModel(); + processImportedEntities(); + parentEntityToAvatar(); + setupSpaceBarControl(); + + function changeAvatar() { + originalAvatar = MyAvatar.skeletonModelURL; + MyAvatar.skeletonModelURL = AVATAR_URL; + } + + function importModel() { + var success = Clipboard.importEntities(MODEL_URL); + var spawnLocation = MyAvatar.position; + if (success) { + importedEntityIDs = Clipboard.pasteEntities(spawnLocation); + } + } + + function processImportedEntities() { + importedEntityIDs.forEach(function(id){ + var props = Entities.getEntityProperties(id); + if (props.name === "Selfie Stick") { + selfieStickEntityID = id; + } else if (props.name === "Lens") { + lensEntityID = id; + } + }); + } + + function parentEntityToAvatar() { + var props = { + "parentID" : MyAvatar.sessionUUID + }; + Entities.editEntity(selfieStickEntityID, props); + } + + function unparentEntityFromAvatar() { + var props = { + "parentID" : 0 + }; + Entities.editEntity(selfieStickEntityID, props); + } + + function parentAvatarToEntity() { + MyAvatar.setParentID(selfieStickEntityID); + } + + function unparentAvatarFromEntity() { + MyAvatar.setParentID(0); + } + + function setupSpaceBarControl() { + var mappingName = "Handheld-Cam-Space-Bar"; + var myMapping = Controller.newMapping(mappingName); + myMapping.from(Controller.Hardware.Keyboard.Space).to(function(value){ + if ( value === 0 ) { + return; + } + if (freeMovementMode) { + freeMovementMode = false; + // Camera.mode = "entity"; + // Camera.cameraEntity = lensEntityID; + unparentEntityFromAvatar(); + parentAvatarToEntity(); + } else { + freeMovementMode = true; + // Camera.mode = "first person"; + unparentAvatarFromEntity(); + parentEntityToAvatar(); + } + }); + Controller.enableMapping(mappingName); + } + + // Removes all entities we imported and reset settings we've changed + function cleanup() { + importedEntityIDs.forEach(function(id) { + Entities.deleteEntity(id); + }); + Camera.mode = "first person"; + Controller.disableMapping("Handheld-Cam-Space-Bar"); + MyAvatar.skeletonModelURL = originalAvatar; + } + Script.scriptEnding.connect(cleanup); +}()); // END LOCAL_SCOPE \ No newline at end of file From 97d75e654e22cf732d104334e66357bb99b43054 Mon Sep 17 00:00:00 2001 From: Faye Li Date: Wed, 5 Apr 2017 15:04:21 -0700 Subject: [PATCH 2/3] mannually bind avatar and entity --- script-archive/selfieStick.js | 68 +++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 30 deletions(-) diff --git a/script-archive/selfieStick.js b/script-archive/selfieStick.js index 767cf55144..c6fb9c5349 100644 --- a/script-archive/selfieStick.js +++ b/script-archive/selfieStick.js @@ -7,6 +7,15 @@ // For best result, turn off avatar collisions(Developer > Avatar > Uncheck Enable Avatar Collisions) // +// selfieStick.js +// +// Created by Faye Li on March 23, 2016 +// +// Usage instruction: Spacebar toggles camera control - WASD first person free movement or no movement but allowing others to grab the selfie stick +// and control your camera. +// For best result, turn off avatar collisions(Developer > Avatar > Uncheck Enable Avatar Collisions) +// + (function() { // BEGIN LOCAL_SCOPE var MODEL_URL = "https://hifi-content.s3.amazonaws.com/faye/twitch-stream/selfie_stick.json"; var AVATAR_URL = "https://hifi-content.s3.amazonaws.com/jimi/avatar/camera/fst/camera.fst"; @@ -19,8 +28,8 @@ changeAvatar(); importModel(); processImportedEntities(); - parentEntityToAvatar(); setupSpaceBarControl(); + Script.update.connect(update); function changeAvatar() { originalAvatar = MyAvatar.skeletonModelURL; @@ -46,28 +55,6 @@ }); } - function parentEntityToAvatar() { - var props = { - "parentID" : MyAvatar.sessionUUID - }; - Entities.editEntity(selfieStickEntityID, props); - } - - function unparentEntityFromAvatar() { - var props = { - "parentID" : 0 - }; - Entities.editEntity(selfieStickEntityID, props); - } - - function parentAvatarToEntity() { - MyAvatar.setParentID(selfieStickEntityID); - } - - function unparentAvatarFromEntity() { - MyAvatar.setParentID(0); - } - function setupSpaceBarControl() { var mappingName = "Handheld-Cam-Space-Bar"; var myMapping = Controller.newMapping(mappingName); @@ -77,20 +64,41 @@ } if (freeMovementMode) { freeMovementMode = false; - // Camera.mode = "entity"; - // Camera.cameraEntity = lensEntityID; - unparentEntityFromAvatar(); - parentAvatarToEntity(); + Camera.mode = "entity"; + Camera.cameraEntity = lensEntityID; } else { freeMovementMode = true; - // Camera.mode = "first person"; - unparentAvatarFromEntity(); - parentEntityToAvatar(); + Camera.mode = "first person"; } }); Controller.enableMapping(mappingName); } + function update(deltaTime) { + if (freeMovementMode) { + var upFactor = 0.1; + var upUnitVec = Vec3.normalize(Quat.getUp(MyAvatar.orientation)); + var upOffset = Vec3.multiply(upUnitVec, upFactor); + var forwardFactor = -0.1; + var forwardUnitVec = Vec3.normalize(Quat.getFront(MyAvatar.orientation)); + var forwardOffset = Vec3.multiply(forwardUnitVec, forwardFactor); + var newPos = Vec3.sum(Vec3.sum(MyAvatar.position, upOffset), forwardOffset); + var newRot = MyAvatar.orientation; + Entities.editEntity(selfieStickEntityID, {position: newPos, rotation: newRot}); + } else { + var props = Entities.getEntityProperties(selfieStickEntityID); + var upFactor = 0.1; + var upUnitVec = Vec3.normalize(Quat.getUp(props.rotation)); + var upOffset = Vec3.multiply(upUnitVec, -upFactor); + var forwardFactor = -0.1; + var forwardUnitVec = Vec3.normalize(Quat.getFront(props.rotation)); + var forwardOffset = Vec3.multiply(forwardUnitVec, -forwardFactor); + var newPos = Vec3.sum(Vec3.sum(props.position, upOffset), forwardOffset); + MyAvatar.position = newPos; + MyAvatar.orientation = props.rotation; + } + } + // Removes all entities we imported and reset settings we've changed function cleanup() { importedEntityIDs.forEach(function(id) { From 3caea886413f63e6835ece7c3f3858d4f05c3f0e Mon Sep 17 00:00:00 2001 From: Faye Li Date: Fri, 7 Apr 2017 10:02:30 -0700 Subject: [PATCH 3/3] use JS method to enable/disable avatar collisions --- script-archive/selfieStick.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/script-archive/selfieStick.js b/script-archive/selfieStick.js index c6fb9c5349..fd3bb82145 100644 --- a/script-archive/selfieStick.js +++ b/script-archive/selfieStick.js @@ -13,7 +13,6 @@ // // Usage instruction: Spacebar toggles camera control - WASD first person free movement or no movement but allowing others to grab the selfie stick // and control your camera. -// For best result, turn off avatar collisions(Developer > Avatar > Uncheck Enable Avatar Collisions) // (function() { // BEGIN LOCAL_SCOPE @@ -25,12 +24,21 @@ var lensEntityID = null; var freeMovementMode = true; + turnOffAvatarCollisions(); changeAvatar(); importModel(); processImportedEntities(); setupSpaceBarControl(); Script.update.connect(update); + function turnOffAvatarCollisions() { + Menu.setIsOptionChecked("Enable avatar collisions", 0); + } + + function turnOnAvatarCollisions() { + Menu.setIsOptionChecked("Enable avatar collisions", 1); + } + function changeAvatar() { originalAvatar = MyAvatar.skeletonModelURL; MyAvatar.skeletonModelURL = AVATAR_URL; @@ -107,6 +115,7 @@ Camera.mode = "first person"; Controller.disableMapping("Handheld-Cam-Space-Bar"); MyAvatar.skeletonModelURL = originalAvatar; + turnOnAvatarCollisions(); } Script.scriptEnding.connect(cleanup); }()); // END LOCAL_SCOPE \ No newline at end of file