From 3e6ff0eb68a92666b6df91b63908ffbca3756294 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Tue, 5 Jan 2016 19:56:56 -0800 Subject: [PATCH 1/9] Moved hand animation control into grab script. --- examples/controllers/handControllerGrab.js | 85 ++++++++++++++++++- .../defaultAvatar_full/avatar-animation.json | 6 +- libraries/animation/src/Rig.cpp | 2 + 3 files changed, 88 insertions(+), 5 deletions(-) diff --git a/examples/controllers/handControllerGrab.js b/examples/controllers/handControllerGrab.js index 5ba0ccd0ef..8095ebc81b 100644 --- a/examples/controllers/handControllerGrab.js +++ b/examples/controllers/handControllerGrab.js @@ -18,6 +18,7 @@ Script.include("../libraries/utils.js"); // add lines where the hand ray picking is happening // var WANT_DEBUG = false; +var WANT_DEBUG_STATE = true; // // these tune time-averaging and "on" value for analog trigger @@ -302,9 +303,84 @@ function MyController(hand) { this.ignoreIK = false; this.offsetPosition = Vec3.ZERO; this.offsetRotation = Quat.IDENTITY; + this.handIdleAlpha = 0; + + var HAND_IDLE_RAMP_ON_RATE = 0.1; + var HAND_IDLE_RAMP_OFF_RATE = 0.02; var _this = this; + var farGrabStates = [STATE_DISTANCE_HOLDING, STATE_CONTINUE_DISTANCE_HOLDING]; + var pointStates = [STATE_SEARCHING, STATE_EQUIP_SEARCHING, + STATE_NEAR_TRIGGER, STATE_CONTINUE_NEAR_TRIGGER, + STATE_FAR_TRIGGER, STATE_CONTINUE_FAR_TRIGGER]; + var idleStates = [STATE_OFF]; + + var propList = ["isLeftHandFarGrab", "isLeftHandPoint", "isLeftHandIdle", "isLeftHandGrab", + "isRightHandFarGrab", "isRightHandPoint", "isRightHandIdle", "isRightHandGrab"]; + + // hook up anim var handler + this.animHandlerId = MyAvatar.addAnimationStateHandler(function (props) { + var foundState = false; + var result = {}; + + var isHandPrefix = (_this.hand === RIGHT_HAND) ? "isRight" : "isLeft"; + var handPrefix = (_this.hand === RIGHT_HAND) ? "right" : "left"; + + /* + // far grab check + if (farGrabStates.indexOf(_this.state) != -1) { + result[isHandPrefix + "HandFarGrab"] = true; + foundState = true; + } else { + result[isHandPrefix + "HandFarGrab"] = false; + } + */ + + result[handPrefix + "HandGrabBlend"] = _this.triggerValue; + + // point check + if (pointStates.indexOf(_this.state) != -1) { + result[isHandPrefix + "HandPoint"] = true; + foundState = true; + } else { + result[isHandPrefix + "HandPoint"] = false; + } + + // idle check + if (idleStates.indexOf(_this.state) != -1) { + + // ramp down handIdleAlpha + if (_this.handIdleAlpha > HAND_IDLE_RAMP_OFF_RATE) { + _this.handIdleAlpha -= HAND_IDLE_RAMP_OFF_RATE; + } else { + _this.handIdleAlpha = 0; + } + result[isHandPrefix + "HandIdle"] = true; + foundState = true; + } else { + + // ramp up handIdleAlpha + if (_this.handIdleAlpha < 1 - HAND_IDLE_RAMP_ON_RATE) { + _this.handIdleAlpha += HAND_IDLE_RAMP_ON_RATE; + } else { + _this.handIdleAlpha = 1; + } + result[isHandPrefix + "HandIdle"] = false; + } + + result[handPrefix + "HandOverlayAlpha"] = _this.handIdleAlpha; + + // grab check + if (!foundState) { + result[isHandPrefix + "HandGrab"] = true; + } else { + result[isHandPrefix + "HandGrab"] = false; + } + + return result; + }, propList); + this.update = function() { this.updateSmoothedTrigger(); @@ -360,7 +436,7 @@ function MyController(hand) { }; this.setState = function(newState) { - if (WANT_DEBUG) { + if (WANT_DEBUG || WANT_DEBUG_STATE) { print("STATE: " + stateToName(this.state) + " --> " + stateToName(newState) + ", hand: " + this.hand); } this.state = newState; @@ -1686,7 +1762,7 @@ function MyController(hand) { }, angularVelocity: { x: 0, - y: 0, + y: 0, z: 0 } }) @@ -1713,6 +1789,11 @@ function MyController(hand) { Entities.deleteEntity(this.particleBeam); Entities.deleteEntity(this.spotLight); Entities.deleteEntity(this.pointLight); + + if (this.animHandlerId) { + MyAvatar.removeAnimationStateHandler(this.animHandlerId); + this.animHandlerId = undefined; + } }; this.activateEntity = function(entityID, grabbedProperties) { diff --git a/interface/resources/meshes/defaultAvatar_full/avatar-animation.json b/interface/resources/meshes/defaultAvatar_full/avatar-animation.json index d63942c510..39e8dbb84a 100644 --- a/interface/resources/meshes/defaultAvatar_full/avatar-animation.json +++ b/interface/resources/meshes/defaultAvatar_full/avatar-animation.json @@ -168,7 +168,7 @@ "interpDuration": 3, "transitions": [ { "var": "isRightHandIdle", "state": "rightHandIdle" }, - { "var": "isRightHandPoint_DISABLED", "state": "rightHandPointHold" } + { "var": "isRightHandPoint", "state": "rightHandPointHold" } ] } ] @@ -264,7 +264,7 @@ "data": { "alpha": 1.0, "boneSet": "leftHand", - "alphaVar" : "leftHandOverlay" + "alphaVar" : "leftHandOverlayAlpha" }, "children": [ { @@ -317,7 +317,7 @@ "interpDuration": 3, "transitions": [ { "var": "isLeftHandIdle", "state": "leftHandIdle" }, - { "var": "isLeftHandPoint_DISABLED", "state": "leftHandPointHold" } + { "var": "isLeftHandPoint", "state": "leftHandPointHold" } ] } ] diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index c6060d791a..8567945a87 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -981,6 +981,7 @@ void Rig::updateFromHandParameters(const HandParameters& params, float dt) { _animVars.set("rightHandType", (int)IKTarget::Type::HipsRelativeRotationAndPosition); } + /* // set leftHand grab vars _animVars.set("isLeftHandIdle", false); _animVars.set("isLeftHandPoint", false); @@ -1019,6 +1020,7 @@ void Rig::updateFromHandParameters(const HandParameters& params, float dt) { _rightHandOverlayAlpha = glm::clamp(_rightHandOverlayAlpha + (rampOut ? -1.0f : 1.0f) * OVERLAY_RAMP_OUT_SPEED * dt, 0.0f, 1.0f); _animVars.set("rightHandOverlayAlpha", _rightHandOverlayAlpha); _animVars.set("rightHandGrabBlend", params.rightTrigger); + */ } } From b42fe22e038b9630bcf1f975db3a22c93a398fc7 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Wed, 6 Jan 2016 16:26:16 -0800 Subject: [PATCH 2/9] Fixing bad line ending. --- examples/controllers/handControllerGrab.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/controllers/handControllerGrab.js b/examples/controllers/handControllerGrab.js index 8095ebc81b..7b1dac8b64 100644 --- a/examples/controllers/handControllerGrab.js +++ b/examples/controllers/handControllerGrab.js @@ -1762,7 +1762,7 @@ function MyController(hand) { }, angularVelocity: { x: 0, - y: 0, + y: 0, z: 0 } }) From dfc3f02db301bf97540fc0de483794522b040e53 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Wed, 6 Jan 2016 18:15:32 -0800 Subject: [PATCH 3/9] avatar-animation.json: Removed point outro state. Also replaced right hand point with force grab animation. --- .../defaultAvatar_full/avatar-animation.json | 62 +++---------------- 1 file changed, 9 insertions(+), 53 deletions(-) diff --git a/interface/resources/meshes/defaultAvatar_full/avatar-animation.json b/interface/resources/meshes/defaultAvatar_full/avatar-animation.json index 39e8dbb84a..38cbbaa867 100644 --- a/interface/resources/meshes/defaultAvatar_full/avatar-animation.json +++ b/interface/resources/meshes/defaultAvatar_full/avatar-animation.json @@ -139,8 +139,8 @@ "interpDuration": 3, "transitions": [ { "var": "isRightHandIdle", "state": "rightHandIdle" }, - { "var": "isRightHandPointIntroOnDone", "state": "rightHandPointHold" }, - { "var": "isRightHandGrab", "state": "rightHandGrab" } + { "var": "isRightHandGrab", "state": "rightHandGrab" }, + { "var": "isRightHandPointIntroOnDone", "state": "rightHandPointHold" } ] }, { @@ -148,20 +148,10 @@ "interpTarget": 3, "interpDuration": 3, "transitions": [ - { "var": "isRightHandIdle", "state": "rightHandPointOutro" }, + { "var": "isRightHandIdle", "state": "rightHandIdle" }, { "var": "isRightHandGrab", "state": "rightHandGrab" } ] }, - { - "id": "rightHandPointOutro", - "interpTarget": 3, - "interpDuration": 3, - "transitions": [ - { "var": "isRightHandPointOutroOnDone", "state": "rightHandIdle" }, - { "var": "isRightHandGrab", "state": "rightHandGrab" }, - { "var": "isRightHandPoint", "state": "rightHandPointHold" } - ] - }, { "id": "rightHandGrab", "interpTarget": 3, @@ -190,9 +180,9 @@ "id": "rightHandPointHold", "type": "clip", "data": { - "url": "http://hifi-public.s3.amazonaws.com/ozan/anim/hand_anims/point_right_hand.fbx", + "url": "https://hifi-public.s3.amazonaws.com/ozan/anim/grab/force_grab_right.fbx", "startFrame": 12.0, - "endFrame": 12.0, + "endFrame": 35.0, "timeScale": 1.0, "loopFlag": true }, @@ -202,7 +192,7 @@ "id": "rightHandPointIntro", "type": "clip", "data": { - "url": "http://hifi-public.s3.amazonaws.com/ozan/anim/hand_anims/point_right_hand.fbx", + "url": "https://hifi-public.s3.amazonaws.com/ozan/anim/grab/force_grab_right.fbx", "startFrame": 0.0, "endFrame": 12.0, "timeScale": 1.0, @@ -210,18 +200,6 @@ }, "children": [] }, - { - "id": "rightHandPointOutro", - "type": "clip", - "data": { - "url": "http://hifi-public.s3.amazonaws.com/ozan/anim/hand_anims/point_right_hand.fbx", - "startFrame": 12.0, - "endFrame": 65.0, - "timeScale": 1.0, - "loopFlag": false - }, - "children": [] - }, { "id": "rightHandGrab", "type": "blendLinear", @@ -288,8 +266,8 @@ "interpDuration": 3, "transitions": [ { "var": "isLeftHandIdle", "state": "leftHandIdle" }, - { "var": "isLeftHandPointIntroOnDone", "state": "leftHandPointHold" }, - { "var": "isLeftHandGrab", "state": "leftHandGrab" } + { "var": "isLeftHandGrab", "state": "leftHandGrab" }, + { "var": "isLeftHandPointIntroOnDone", "state": "leftHandPointHold" } ] }, { @@ -297,20 +275,10 @@ "interpTarget": 3, "interpDuration": 3, "transitions": [ - { "var": "isLeftHandIdle", "state": "leftHandPointOutro" }, + { "var": "isLeftHandIdle", "state": "leftHandIdle" }, { "var": "isLeftHandGrab", "state": "leftHandGrab" } ] }, - { - "id": "leftHandPointOutro", - "interpTarget": 3, - "interpDuration": 3, - "transitions": [ - { "var": "isLeftHandPointOutroOnDone", "state": "leftHandIdle" }, - { "var": "isLeftHandGrab", "state": "leftHandGrab" }, - { "var": "isLeftHandPoint", "state": "leftHandPointHold" } - ] - }, { "id": "leftHandGrab", "interpTarget": 3, @@ -359,18 +327,6 @@ }, "children": [] }, - { - "id": "leftHandPointOutro", - "type": "clip", - "data": { - "url": "http://hifi-public.s3.amazonaws.com/ozan/anim/hand_anims/point_left_hand.fbx", - "startFrame": 12.0, - "endFrame": 65.0, - "timeScale": 1.0, - "loopFlag": false - }, - "children": [] - }, { "id": "leftHandGrab", "type": "blendLinear", From cac19b8579f6b10a00fa8e917be7963be956db0e Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Thu, 7 Jan 2016 19:34:44 -0800 Subject: [PATCH 4/9] grab animation work Hand animations now have 5 states: * idle * open * grasp * point * farGrasp The handControllerGrab.js script now chooses one of these five animations, based on the state of the HandController object. Also, removed hand trigger AnimVar setting from C++ Rig class. --- examples/controllers/handControllerGrab.js | 178 +++++++------ .../defaultAvatar_full/avatar-animation.json | 239 ++++++++++-------- interface/src/avatar/SkeletonModel.cpp | 2 - libraries/animation/src/Rig.cpp | 42 --- libraries/animation/src/Rig.h | 2 - 5 files changed, 226 insertions(+), 237 deletions(-) diff --git a/examples/controllers/handControllerGrab.js b/examples/controllers/handControllerGrab.js index 419f2b78d4..432b2d46fc 100644 --- a/examples/controllers/handControllerGrab.js +++ b/examples/controllers/handControllerGrab.js @@ -157,7 +157,12 @@ var STATE_CONTINUE_EQUIP = 14; var STATE_WAITING_FOR_BUMPER_RELEASE = 15; var STATE_EQUIP_SPRING = 16; - +// Used by the HandAnimaitonBuddy to play hand animations +var IDLE_HAND_STATES = [STATE_OFF, STATE_RELEASE]; +var OPEN_HAND_STATES = [STATE_SEARCHING, STATE_EQUIP_SEARCHING]; +var POINT_HAND_STATES = [STATE_NEAR_TRIGGER, STATE_CONTINUE_NEAR_TRIGGER, STATE_FAR_TRIGGER, STATE_CONTINUE_FAR_TRIGGER]; +var FAR_GRASP_HAND_STATES = [STATE_DISTANCE_HOLDING, STATE_CONTINUE_DISTANCE_HOLDING]; +// otherwise grasp function stateToName(state) { switch (state) { @@ -265,6 +270,94 @@ function getSpatialOffsetRotation(hand, spatialKey) { return rotation; } +var HAND_IDLE_RAMP_ON_RATE = 0.1; +var HAND_IDLE_RAMP_OFF_RATE = 0.02; + +// ctor +function HandAnimationBuddy(handController) { + + this.handController = handController; + this.hand = handController.hand; + this.handIdleAlpha = 0; + + var handPrefix = (this.hand === RIGHT_HAND) ? "right" : "left"; + this.animVarKeys = { + idle: handPrefix + "HandIdle", + overlayAlpha: handPrefix + "HandOverlayAlpha", + open: handPrefix + "HandOpen", + point: handPrefix + "HandPoint", + farGrasp: handPrefix + "HandFarGrasp", + grasp: handPrefix + "HandGrasp" + }; + + // hook up anim var handler + var self = this; + this.animHandlerId = MyAvatar.addAnimationStateHandler(function (props) { + return self.animStateHandler(props); + }, []); +} + +HandAnimationBuddy.prototype.animStateHandler = function (props) { + var foundState = false; + var result = {}; + + var state = this.handController.state; + var keys = this.animVarKeys; + + // idle check & process + if (IDLE_HAND_STATES.indexOf(state) != -1) { + // ramp down handIdleAlpha + this.handIdleAlpha = Math.max(0, this.handIdleAlpha - HAND_IDLE_RAMP_OFF_RATE); + result[keys.idle] = true; + foundState = true; + } else { + // ramp up handIdleAlpha + this.handIdleAlpha = Math.min(1, this.handIdleAlpha + HAND_IDLE_RAMP_ON_RATE); + result[keys.idle] = false; + } + result[keys.overlayAlpha] = this.handIdleAlpha; + + // open check + if (OPEN_HAND_STATES.indexOf(state) != -1) { + result[keys.open] = true; + foundState = true; + } else { + result[keys.open] = false; + } + + // point check + if (POINT_HAND_STATES.indexOf(state) != -1) { + result[keys.point] = true; + foundState = true; + } else { + result[keys.point] = false; + } + + // far grasp check + if (FAR_GRASP_HAND_STATES.indexOf(state) != -1) { + result[keys.farGrasp] = true; + foundState = true; + } else { + result[keys.farGrasp] = false; + } + + // grasp check + if (!foundState) { + result[keys.grasp] = true; + } else { + result[keys.grasp] = false; + } + + return result; +}; + +HandAnimationBuddy.prototype.cleanup = function () { + if (this.animHandlerId) { + MyAvatar.removeAnimationStateHandler(this.animHandlerId); + this.animHandlerId = undefined; + } +}; + function MyController(hand) { this.hand = hand; if (this.hand === RIGHT_HAND) { @@ -304,84 +397,11 @@ function MyController(hand) { this.ignoreIK = false; this.offsetPosition = Vec3.ZERO; this.offsetRotation = Quat.IDENTITY; - this.handIdleAlpha = 0; - var HAND_IDLE_RAMP_ON_RATE = 0.1; - var HAND_IDLE_RAMP_OFF_RATE = 0.02; + this.handAnimationBuddy = new HandAnimationBuddy(this); var _this = this; - var farGrabStates = [STATE_DISTANCE_HOLDING, STATE_CONTINUE_DISTANCE_HOLDING]; - var pointStates = [STATE_SEARCHING, STATE_EQUIP_SEARCHING, - STATE_NEAR_TRIGGER, STATE_CONTINUE_NEAR_TRIGGER, - STATE_FAR_TRIGGER, STATE_CONTINUE_FAR_TRIGGER]; - var idleStates = [STATE_OFF]; - - var propList = ["isLeftHandFarGrab", "isLeftHandPoint", "isLeftHandIdle", "isLeftHandGrab", - "isRightHandFarGrab", "isRightHandPoint", "isRightHandIdle", "isRightHandGrab"]; - - // hook up anim var handler - this.animHandlerId = MyAvatar.addAnimationStateHandler(function (props) { - var foundState = false; - var result = {}; - - var isHandPrefix = (_this.hand === RIGHT_HAND) ? "isRight" : "isLeft"; - var handPrefix = (_this.hand === RIGHT_HAND) ? "right" : "left"; - - /* - // far grab check - if (farGrabStates.indexOf(_this.state) != -1) { - result[isHandPrefix + "HandFarGrab"] = true; - foundState = true; - } else { - result[isHandPrefix + "HandFarGrab"] = false; - } - */ - - result[handPrefix + "HandGrabBlend"] = _this.triggerValue; - - // point check - if (pointStates.indexOf(_this.state) != -1) { - result[isHandPrefix + "HandPoint"] = true; - foundState = true; - } else { - result[isHandPrefix + "HandPoint"] = false; - } - - // idle check - if (idleStates.indexOf(_this.state) != -1) { - - // ramp down handIdleAlpha - if (_this.handIdleAlpha > HAND_IDLE_RAMP_OFF_RATE) { - _this.handIdleAlpha -= HAND_IDLE_RAMP_OFF_RATE; - } else { - _this.handIdleAlpha = 0; - } - result[isHandPrefix + "HandIdle"] = true; - foundState = true; - } else { - - // ramp up handIdleAlpha - if (_this.handIdleAlpha < 1 - HAND_IDLE_RAMP_ON_RATE) { - _this.handIdleAlpha += HAND_IDLE_RAMP_ON_RATE; - } else { - _this.handIdleAlpha = 1; - } - result[isHandPrefix + "HandIdle"] = false; - } - - result[handPrefix + "HandOverlayAlpha"] = _this.handIdleAlpha; - - // grab check - if (!foundState) { - result[isHandPrefix + "HandGrab"] = true; - } else { - result[isHandPrefix + "HandGrab"] = false; - } - - return result; - }, propList); - this.update = function() { this.updateSmoothedTrigger(); @@ -1802,11 +1822,7 @@ function MyController(hand) { Entities.deleteEntity(this.particleBeam); Entities.deleteEntity(this.spotLight); Entities.deleteEntity(this.pointLight); - - if (this.animHandlerId) { - MyAvatar.removeAnimationStateHandler(this.animHandlerId); - this.animHandlerId = undefined; - } + this.handAnimationBuddy.cleanup(); }; this.activateEntity = function(entityID, grabbedProperties) { @@ -2008,4 +2024,4 @@ function renewParticleBeamLifetimes(deltaTime) { } rightController.renewParticleBeamLifetime(); leftController.renewParticleBeamLifetime(); -} \ No newline at end of file +} diff --git a/interface/resources/meshes/defaultAvatar_full/avatar-animation.json b/interface/resources/meshes/defaultAvatar_full/avatar-animation.json index 38cbbaa867..3f9708cdb3 100644 --- a/interface/resources/meshes/defaultAvatar_full/avatar-animation.json +++ b/interface/resources/meshes/defaultAvatar_full/avatar-animation.json @@ -129,36 +129,54 @@ "interpTarget": 3, "interpDuration": 3, "transitions": [ - { "var": "isRightHandPoint", "state": "rightHandPointIntro" }, - { "var": "isRightHandGrab", "state": "rightHandGrab" } + { "var": "rightHandOpen", "state": "rightHandOpen" }, + { "var": "rightHandGrasp", "state": "rightHandGrasp" }, + { "var": "rightHandPoint", "state": "rightHandPoint" }, + { "var": "rightHandFarGrasp", "state": "rightHandFarGrasp" } ] }, { - "id": "rightHandPointIntro", + "id": "rightHandOpen", "interpTarget": 3, "interpDuration": 3, "transitions": [ - { "var": "isRightHandIdle", "state": "rightHandIdle" }, - { "var": "isRightHandGrab", "state": "rightHandGrab" }, - { "var": "isRightHandPointIntroOnDone", "state": "rightHandPointHold" } + { "var": "rightHandIdle", "state": "rightHandIdle" }, + { "var": "rightHandGrasp", "state": "rightHandGrasp" }, + { "var": "rightHandPoint", "state": "rightHandPoint" }, + { "var": "rightHandFarGrasp", "state": "rightHandFarGrasp" } ] }, { - "id": "rightHandPointHold", + "id": "rightHandGrasp", "interpTarget": 3, "interpDuration": 3, "transitions": [ - { "var": "isRightHandIdle", "state": "rightHandIdle" }, - { "var": "isRightHandGrab", "state": "rightHandGrab" } + { "var": "rightHandOpen", "state": "rightHandOpen" }, + { "var": "rightHandIdle", "state": "rightHandIdle" }, + { "var": "rightHandPoint", "state": "rightHandPoint" }, + { "var": "rightHandFarGrasp", "state": "rightHandFarGrasp" } ] }, { - "id": "rightHandGrab", + "id": "rightHandPoint", "interpTarget": 3, "interpDuration": 3, "transitions": [ - { "var": "isRightHandIdle", "state": "rightHandIdle" }, - { "var": "isRightHandPoint", "state": "rightHandPointHold" } + { "var": "rightHandOpen", "state": "rightHandOpen" }, + { "var": "rightHandIdle", "state": "rightHandIdle" }, + { "var": "rightHandGrasp", "state": "rightHandGrasp" }, + { "var": "rightHandFarGrasp", "state": "rightHandFarGrasp" } + ] + }, + { + "id": "rightHandFarGrasp", + "interpTarget": 3, + "interpDuration": 3, + "transitions": [ + { "var": "rightHandOpen", "state": "rightHandOpen" }, + { "var": "rightHandIdle", "state": "rightHandIdle" }, + { "var": "rightHandGrasp", "state": "rightHandGrasp" }, + { "var": "rightHandPoint", "state": "rightHandPoint" } ] } ] @@ -177,7 +195,43 @@ "children": [] }, { - "id": "rightHandPointHold", + "id": "rightHandOpen", + "type": "clip", + "data": { + "url": "https://hifi-public.s3.amazonaws.com/ozan/anim/grab/force_grab_right.fbx", + "startFrame": 0.0, + "endFrame": 0.0, + "timeScale": 1.0, + "loopFlag": true + }, + "children": [] + }, + { + "id": "rightHandGrasp", + "type": "clip", + "data": { + "url": "https://hifi-public.s3.amazonaws.com/ozan/anim/grab/grab_right.fbx", + "startFrame": 10.0, + "endFrame": 10.0, + "timeScale": 1.0, + "loopFlag": true + }, + "children": [] + }, + { + "id": "rightHandPoint", + "type": "clip", + "data": { + "url": "http://hifi-public.s3.amazonaws.com/ozan/anim/hand_anims/point_right_hand.fbx", + "startFrame": 20.0, + "endFrame": 20.0, + "timeScale": 1.0, + "loopFlag": true + }, + "children": [] + }, + { + "id": "rightHandFarGrasp", "type": "clip", "data": { "url": "https://hifi-public.s3.amazonaws.com/ozan/anim/grab/force_grab_right.fbx", @@ -187,52 +241,6 @@ "loopFlag": true }, "children": [] - }, - { - "id": "rightHandPointIntro", - "type": "clip", - "data": { - "url": "https://hifi-public.s3.amazonaws.com/ozan/anim/grab/force_grab_right.fbx", - "startFrame": 0.0, - "endFrame": 12.0, - "timeScale": 1.0, - "loopFlag": false - }, - "children": [] - }, - { - "id": "rightHandGrab", - "type": "blendLinear", - "data": { - "alpha": 0.0, - "alphaVar": "rightHandGrabBlend" - }, - "children": [ - { - "id": "rightHandOpen", - "type": "clip", - "data": { - "url": "https://hifi-public.s3.amazonaws.com/ozan/anim/grab/grab_right.fbx", - "startFrame": 0.0, - "endFrame": 0.0, - "timeScale": 1.0, - "loopFlag": true - }, - "children": [] - }, - { - "id": "rightHandClose", - "type": "clip", - "data": { - "url": "https://hifi-public.s3.amazonaws.com/ozan/anim/grab/grab_right.fbx", - "startFrame": 10.0, - "endFrame": 10.0, - "timeScale": 1.0, - "loopFlag": true - }, - "children": [] - } - ] } ] }, @@ -256,36 +264,54 @@ "interpTarget": 3, "interpDuration": 3, "transitions": [ - { "var": "isLeftHandPoint", "state": "leftHandPointIntro" }, - { "var": "isLeftHandGrab", "state": "leftHandGrab" } + { "var": "leftHandOpen", "state": "leftHandOpen" }, + { "var": "leftHandGrasp", "state": "leftHandGrasp" }, + { "var": "leftHandPoint", "state": "leftHandPoint" }, + { "var": "leftHandFarGrasp", "state": "leftHandFarGrasp" } ] }, { - "id": "leftHandPointIntro", + "id": "leftHandOpen", "interpTarget": 3, "interpDuration": 3, "transitions": [ - { "var": "isLeftHandIdle", "state": "leftHandIdle" }, - { "var": "isLeftHandGrab", "state": "leftHandGrab" }, - { "var": "isLeftHandPointIntroOnDone", "state": "leftHandPointHold" } + { "var": "leftHandIdle", "state": "leftHandIdle" }, + { "var": "leftHandGrasp", "state": "leftHandGrasp" }, + { "var": "leftHandPoint", "state": "leftHandPoint" }, + { "var": "leftHandFarGrasp", "state": "leftHandFarGrasp" } ] }, { - "id": "leftHandPointHold", + "id": "leftHandGrasp", "interpTarget": 3, "interpDuration": 3, "transitions": [ - { "var": "isLeftHandIdle", "state": "leftHandIdle" }, - { "var": "isLeftHandGrab", "state": "leftHandGrab" } + { "var": "leftHandOpen", "state": "leftHandOpen" }, + { "var": "leftHandIdle", "state": "leftHandIdle" }, + { "var": "leftHandPoint", "state": "leftHandPoint" }, + { "var": "leftHandFarGrasp", "state": "leftHandFarGrasp" } ] }, { - "id": "leftHandGrab", + "id": "leftHandPoint", "interpTarget": 3, "interpDuration": 3, "transitions": [ - { "var": "isLeftHandIdle", "state": "leftHandIdle" }, - { "var": "isLeftHandPoint", "state": "leftHandPointHold" } + { "var": "leftHandOpen", "state": "leftHandOpen" }, + { "var": "leftHandIdle", "state": "leftHandIdle" }, + { "var": "leftHandGrasp", "state": "leftHandGrasp" }, + { "var": "leftHandFarGrasp", "state": "leftHandFarGrasp" } + ] + }, + { + "id": "leftHandFarGrasp", + "interpTarget": 3, + "interpDuration": 3, + "transitions": [ + { "var": "leftHandOpen", "state": "leftHandOpen" }, + { "var": "leftHandIdle", "state": "leftHandIdle" }, + { "var": "leftHandGrasp", "state": "leftHandGrasp" }, + { "var": "leftHandPoint", "state": "leftHandPoint" } ] } ] @@ -304,7 +330,33 @@ "children": [] }, { - "id": "leftHandPointHold", + "id": "leftHandOpen", + "type": "clip", + "data": { + + "url": "https://hifi-public.s3.amazonaws.com/ozan/anim/grab/grab_left.fbx", + "startFrame": 0.0, + "endFrame": 0.0, + "timeScale": 1.0, + "loopFlag": true + }, + "children": [] + }, + { + "id": "leftHandGrasp", + "type": "clip", + "data": { + + "url": "https://hifi-public.s3.amazonaws.com/ozan/anim/grab/grab_left.fbx", + "startFrame": 10.0, + "endFrame": 10.0, + "timeScale": 1.0, + "loopFlag": true + }, + "children": [] + }, + { + "id": "leftHandPoint", "type": "clip", "data": { "url": "http://hifi-public.s3.amazonaws.com/ozan/anim/hand_anims/point_left_hand.fbx", @@ -316,50 +368,17 @@ "children": [] }, { - "id": "leftHandPointIntro", + "id": "leftHandFarGrasp", "type": "clip", "data": { - "url": "http://hifi-public.s3.amazonaws.com/ozan/anim/hand_anims/point_left_hand.fbx", + + "url": "https://hifi-public.s3.amazonaws.com/ozan/anim/grab/grab_left.fbx", "startFrame": 0.0, - "endFrame": 12.0, + "endFrame": 0.0, "timeScale": 1.0, - "loopFlag": false + "loopFlag": true }, "children": [] - }, - { - "id": "leftHandGrab", - "type": "blendLinear", - "data": { - "alpha": 0.0, - "alphaVar": "leftHandGrabBlend" - }, - "children": [ - { - "id": "leftHandOpen", - "type": "clip", - "data": { - "url": "https://hifi-public.s3.amazonaws.com/ozan/anim/grab/grab_left.fbx", - "startFrame": 0.0, - "endFrame": 0.0, - "timeScale": 1.0, - "loopFlag": true - }, - "children": [] - }, - { - "id": "leftHandClose", - "type": "clip", - "data": { - "url": "https://hifi-public.s3.amazonaws.com/ozan/anim/grab/grab_left.fbx", - "startFrame": 10.0, - "endFrame": 10.0, - "timeScale": 1.0, - "loopFlag": true - }, - "children": [] - } - ] } ] }, diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index e8d952973b..3cd74afb81 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -119,7 +119,6 @@ void SkeletonModel::updateRig(float deltaTime, glm::mat4 parentTransform) { handParams.isLeftEnabled = true; handParams.leftPosition = Quaternions::Y_180 * leftPalm.getRawPosition(); handParams.leftOrientation = Quaternions::Y_180 * leftPalm.getRawRotation(); - handParams.leftTrigger = leftPalm.getTrigger(); } else { handParams.isLeftEnabled = false; } @@ -129,7 +128,6 @@ void SkeletonModel::updateRig(float deltaTime, glm::mat4 parentTransform) { handParams.isRightEnabled = true; handParams.rightPosition = Quaternions::Y_180 * rightPalm.getRawPosition(); handParams.rightOrientation = Quaternions::Y_180 * rightPalm.getRawRotation(); - handParams.rightTrigger = rightPalm.getTrigger(); } else { handParams.isRightEnabled = false; } diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index 8567945a87..bcda3e8f5c 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -960,7 +960,6 @@ void Rig::updateEyeJoint(int index, const glm::vec3& modelTranslation, const glm } void Rig::updateFromHandParameters(const HandParameters& params, float dt) { - if (_animSkeleton && _animNode) { if (params.isLeftEnabled) { _animVars.set("leftHandPosition", params.leftPosition); @@ -980,47 +979,6 @@ void Rig::updateFromHandParameters(const HandParameters& params, float dt) { _animVars.unset("rightHandRotation"); _animVars.set("rightHandType", (int)IKTarget::Type::HipsRelativeRotationAndPosition); } - - /* - // set leftHand grab vars - _animVars.set("isLeftHandIdle", false); - _animVars.set("isLeftHandPoint", false); - _animVars.set("isLeftHandGrab", false); - - // Split the trigger range into three zones. - bool rampOut = false; - if (params.leftTrigger > 0.6666f) { - _animVars.set("isLeftHandGrab", true); - } else if (params.leftTrigger > 0.3333f) { - _animVars.set("isLeftHandPoint", true); - } else { - _animVars.set("isLeftHandIdle", true); - rampOut = true; - } - const float OVERLAY_RAMP_OUT_SPEED = 6.0f; // ramp in and out over 1/6th of a sec - _leftHandOverlayAlpha = glm::clamp(_leftHandOverlayAlpha + (rampOut ? -1.0f : 1.0f) * OVERLAY_RAMP_OUT_SPEED * dt, 0.0f, 1.0f); - _animVars.set("leftHandOverlayAlpha", _leftHandOverlayAlpha); - _animVars.set("leftHandGrabBlend", params.leftTrigger); - - // set leftHand grab vars - _animVars.set("isRightHandIdle", false); - _animVars.set("isRightHandPoint", false); - _animVars.set("isRightHandGrab", false); - - // Split the trigger range into three zones - rampOut = false; - if (params.rightTrigger > 0.6666f) { - _animVars.set("isRightHandGrab", true); - } else if (params.rightTrigger > 0.3333f) { - _animVars.set("isRightHandPoint", true); - } else { - _animVars.set("isRightHandIdle", true); - rampOut = true; - } - _rightHandOverlayAlpha = glm::clamp(_rightHandOverlayAlpha + (rampOut ? -1.0f : 1.0f) * OVERLAY_RAMP_OUT_SPEED * dt, 0.0f, 1.0f); - _animVars.set("rightHandOverlayAlpha", _rightHandOverlayAlpha); - _animVars.set("rightHandGrabBlend", params.rightTrigger); - */ } } diff --git a/libraries/animation/src/Rig.h b/libraries/animation/src/Rig.h index 669af2ea64..0636230678 100644 --- a/libraries/animation/src/Rig.h +++ b/libraries/animation/src/Rig.h @@ -71,8 +71,6 @@ public: glm::quat leftOrientation = glm::quat(); // rig space (z forward) glm::vec3 rightPosition = glm::vec3(); // rig space glm::quat rightOrientation = glm::quat(); // rig space (z forward) - float leftTrigger = 0.0f; - float rightTrigger = 0.0f; }; virtual ~Rig() {} From 4c1ad6900d6970823490d5103781124c68d3e168 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Fri, 8 Jan 2016 11:28:02 -0800 Subject: [PATCH 5/9] handControllerGrab.js: removed previous animationStateHandler Which was conflicting with the new HandAnimationBuddy animationStateHandler --- examples/controllers/handControllerGrab.js | 43 ---------------------- 1 file changed, 43 deletions(-) diff --git a/examples/controllers/handControllerGrab.js b/examples/controllers/handControllerGrab.js index 432b2d46fc..8c2b6e76dd 100644 --- a/examples/controllers/handControllerGrab.js +++ b/examples/controllers/handControllerGrab.js @@ -1481,8 +1481,6 @@ function MyController(hand) { } else { // equipping Entities.callEntityMethod(this.grabbedEntity, "startEquip", [JSON.stringify(this.hand)]); - this.startHandGrasp(); - this.setState(STATE_CONTINUE_EQUIP_BD); } @@ -1569,7 +1567,6 @@ function MyController(hand) { this.setState(STATE_RELEASE); Entities.callEntityMethod(this.grabbedEntity, "releaseGrab"); Entities.callEntityMethod(this.grabbedEntity, "unequip"); - this.endHandGrasp(); } }; @@ -1818,7 +1815,6 @@ function MyController(hand) { this.cleanup = function() { this.release(); - this.endHandGrasp(); Entities.deleteEntity(this.particleBeam); Entities.deleteEntity(this.spotLight); Entities.deleteEntity(this.pointLight); @@ -1871,45 +1867,6 @@ function MyController(hand) { } setEntityCustomData(GRAB_USER_DATA_KEY, entityID, data); }; - - - //this is our handler, where we do the actual work of changing animation settings - this.graspHand = function(animationProperties) { - var result = {}; - //full alpha on overlay for this hand - //set grab to true - //set idle to false - //full alpha on the blend btw open and grab - if (_this.hand === RIGHT_HAND) { - result['rightHandOverlayAlpha'] = 1.0; - result['isRightHandGrab'] = true; - result['isRightHandIdle'] = false; - result['rightHandGrabBlend'] = 1.0; - } else if (_this.hand === LEFT_HAND) { - result['leftHandOverlayAlpha'] = 1.0; - result['isLeftHandGrab'] = true; - result['isLeftHandIdle'] = false; - result['leftHandGrabBlend'] = 1.0; - } - //return an object with our updated settings - return result; - }; - - this.graspHandler = null - - this.startHandGrasp = function() { - if (this.hand === RIGHT_HAND) { - this.graspHandler = MyAvatar.addAnimationStateHandler(this.graspHand, ['isRightHandGrab']); - } else if (this.hand === LEFT_HAND) { - this.graspHandler = MyAvatar.addAnimationStateHandler(this.graspHand, ['isLeftHandGrab']); - } - }; - - this.endHandGrasp = function() { - // Tell the animation system we don't need any more callbacks. - MyAvatar.removeAnimationStateHandler(this.graspHandler); - }; - }; var rightController = new MyController(RIGHT_HAND); From 8e915733f0b71b1b82803569f2adc999a89321cf Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Fri, 8 Jan 2016 17:15:18 -0800 Subject: [PATCH 6/9] added place holder right hand open/searching animation --- .../meshes/defaultAvatar_full/avatar-animation.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/interface/resources/meshes/defaultAvatar_full/avatar-animation.json b/interface/resources/meshes/defaultAvatar_full/avatar-animation.json index 3f9708cdb3..19066e0ee8 100644 --- a/interface/resources/meshes/defaultAvatar_full/avatar-animation.json +++ b/interface/resources/meshes/defaultAvatar_full/avatar-animation.json @@ -198,9 +198,9 @@ "id": "rightHandOpen", "type": "clip", "data": { - "url": "https://hifi-public.s3.amazonaws.com/ozan/anim/grab/force_grab_right.fbx", - "startFrame": 0.0, - "endFrame": 0.0, + "url": "https://hifi-content.s3.amazonaws.com/ozan/dev/anim/hand_anims/open_variations.fbx", + "startFrame": 95.0, + "endFrame": 95.0, "timeScale": 1.0, "loopFlag": true }, From 3d8f8e56182bfe42c9875c0cf0c536e09a2d4b70 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Mon, 11 Jan 2016 10:39:27 -0800 Subject: [PATCH 7/9] Set WANT_DEBUG_STATE to false --- examples/controllers/handControllerGrab.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/controllers/handControllerGrab.js b/examples/controllers/handControllerGrab.js index 8c2b6e76dd..0e1a42863e 100644 --- a/examples/controllers/handControllerGrab.js +++ b/examples/controllers/handControllerGrab.js @@ -18,7 +18,7 @@ Script.include("../libraries/utils.js"); // add lines where the hand ray picking is happening // var WANT_DEBUG = false; -var WANT_DEBUG_STATE = true; +var WANT_DEBUG_STATE = false; // // these tune time-averaging and "on" value for analog trigger From b44ae3a19798b07f057c406cb9ffebf83fcbee2f Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Mon, 11 Jan 2016 16:55:45 -0800 Subject: [PATCH 8/9] avatar-animation.json: Updated right hand grasp animations --- .../defaultAvatar_full/avatar-animation.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/interface/resources/meshes/defaultAvatar_full/avatar-animation.json b/interface/resources/meshes/defaultAvatar_full/avatar-animation.json index 19066e0ee8..4b12008bc3 100644 --- a/interface/resources/meshes/defaultAvatar_full/avatar-animation.json +++ b/interface/resources/meshes/defaultAvatar_full/avatar-animation.json @@ -198,9 +198,9 @@ "id": "rightHandOpen", "type": "clip", "data": { - "url": "https://hifi-content.s3.amazonaws.com/ozan/dev/anim/hand_anims/open_variations.fbx", - "startFrame": 95.0, - "endFrame": 95.0, + "url": "https://hifi-content.s3.amazonaws.com/ozan/dev/anim/hand_anims/hand_variations.fbx", + "startFrame": 17.0, + "endFrame": 17.0, "timeScale": 1.0, "loopFlag": true }, @@ -210,9 +210,9 @@ "id": "rightHandGrasp", "type": "clip", "data": { - "url": "https://hifi-public.s3.amazonaws.com/ozan/anim/grab/grab_right.fbx", - "startFrame": 10.0, - "endFrame": 10.0, + "url": "https://hifi-content.s3.amazonaws.com/ozan/dev/anim/hand_anims/hand_variations.fbx", + "startFrame": 59.0, + "endFrame": 59.0, "timeScale": 1.0, "loopFlag": true }, @@ -234,9 +234,9 @@ "id": "rightHandFarGrasp", "type": "clip", "data": { - "url": "https://hifi-public.s3.amazonaws.com/ozan/anim/grab/force_grab_right.fbx", - "startFrame": 12.0, - "endFrame": 35.0, + "url": "https://hifi-content.s3.amazonaws.com/ozan/dev/anim/hand_anims/hand_variations.fbx", + "startFrame": 49.0, + "endFrame": 49.0, "timeScale": 1.0, "loopFlag": true }, From fee6bda7217a88b3d89cccc9b41b3df5c00a5d99 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Tue, 12 Jan 2016 12:18:26 -0800 Subject: [PATCH 9/9] Updated hand animation references. --- .../defaultAvatar_full/avatar-animation.json | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/interface/resources/meshes/defaultAvatar_full/avatar-animation.json b/interface/resources/meshes/defaultAvatar_full/avatar-animation.json index 4b12008bc3..efd16576ee 100644 --- a/interface/resources/meshes/defaultAvatar_full/avatar-animation.json +++ b/interface/resources/meshes/defaultAvatar_full/avatar-animation.json @@ -198,9 +198,9 @@ "id": "rightHandOpen", "type": "clip", "data": { - "url": "https://hifi-content.s3.amazonaws.com/ozan/dev/anim/hand_anims/hand_variations.fbx", - "startFrame": 17.0, - "endFrame": 17.0, + "url": "https://hifi-content.s3.amazonaws.com/ozan/dev/anim/hand_anims/search_right.fbx", + "startFrame": 0.0, + "endFrame": 0.0, "timeScale": 1.0, "loopFlag": true }, @@ -210,9 +210,9 @@ "id": "rightHandGrasp", "type": "clip", "data": { - "url": "https://hifi-content.s3.amazonaws.com/ozan/dev/anim/hand_anims/hand_variations.fbx", - "startFrame": 59.0, - "endFrame": 59.0, + "url": "https://hifi-content.s3.amazonaws.com/ozan/dev/anim/hand_anims/grasp_right.fbx", + "startFrame": 0.0, + "endFrame": 0.0, "timeScale": 1.0, "loopFlag": true }, @@ -234,9 +234,9 @@ "id": "rightHandFarGrasp", "type": "clip", "data": { - "url": "https://hifi-content.s3.amazonaws.com/ozan/dev/anim/hand_anims/hand_variations.fbx", - "startFrame": 49.0, - "endFrame": 49.0, + "url": "https://hifi-content.s3.amazonaws.com/ozan/dev/anim/hand_anims/far_grasp_right.fbx", + "startFrame": 0.0, + "endFrame": 0.0, "timeScale": 1.0, "loopFlag": true }, @@ -334,7 +334,7 @@ "type": "clip", "data": { - "url": "https://hifi-public.s3.amazonaws.com/ozan/anim/grab/grab_left.fbx", + "url": "https://hifi-content.s3.amazonaws.com/ozan/dev/anim/hand_anims/search_left.fbx", "startFrame": 0.0, "endFrame": 0.0, "timeScale": 1.0, @@ -346,10 +346,9 @@ "id": "leftHandGrasp", "type": "clip", "data": { - - "url": "https://hifi-public.s3.amazonaws.com/ozan/anim/grab/grab_left.fbx", - "startFrame": 10.0, - "endFrame": 10.0, + "url": "https://hifi-content.s3.amazonaws.com/ozan/dev/anim/hand_anims/grasp_left.fbx", + "startFrame": 0.0, + "endFrame": 0.0, "timeScale": 1.0, "loopFlag": true }, @@ -372,7 +371,7 @@ "type": "clip", "data": { - "url": "https://hifi-public.s3.amazonaws.com/ozan/anim/grab/grab_left.fbx", + "url": "https://hifi-content.s3.amazonaws.com/ozan/dev/anim/hand_anims/far_grasp_left.fbx", "startFrame": 0.0, "endFrame": 0.0, "timeScale": 1.0,