From cdae16e07bd2e8649d310b7c5e0e2a49e5075d20 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Tue, 29 Sep 2015 16:11:27 -0700 Subject: [PATCH 1/3] fix bug: IK attenuates fast underpose animations --- .../animation/src/AnimInverseKinematics.cpp | 61 ++++++++++++------- .../animation/src/AnimInverseKinematics.h | 2 +- 2 files changed, 39 insertions(+), 24 deletions(-) diff --git a/libraries/animation/src/AnimInverseKinematics.cpp b/libraries/animation/src/AnimInverseKinematics.cpp index de226092f1..ff5d2a6a3f 100644 --- a/libraries/animation/src/AnimInverseKinematics.cpp +++ b/libraries/animation/src/AnimInverseKinematics.cpp @@ -89,7 +89,7 @@ static int findRootJointInSkeleton(AnimSkeleton::ConstPointer skeleton, int inde return rootIndex; } -void AnimInverseKinematics::computeTargets(const AnimVariantMap& animVars, std::vector& targets) { +void AnimInverseKinematics::computeTargets(const AnimVariantMap& animVars, std::vector& targets, const AnimPoseVec& underPoses) { // build a list of valid targets from _targetVarVec and animVars _maxTargetIndex = -1; bool removeUnfoundJoints = false; @@ -107,7 +107,7 @@ void AnimInverseKinematics::computeTargets(const AnimVariantMap& animVars, std:: } } else { IKTarget target; - AnimPose defaultPose = _skeleton->getAbsolutePose(targetVar.jointIndex, _relativePoses); + AnimPose defaultPose = _skeleton->getAbsolutePose(targetVar.jointIndex, underPoses); target.pose.trans = animVars.lookup(targetVar.positionVar, defaultPose.trans); target.pose.rot = animVars.lookup(targetVar.rotationVar, defaultPose.rot); target.setType(animVars.lookup(targetVar.typeVar, QString(""))); @@ -154,7 +154,6 @@ void AnimInverseKinematics::solveWithCyclicCoordinateDescent(const std::vector& targets); + void computeTargets(const AnimVariantMap& animVars, std::vector& targets, const AnimPoseVec& underPoses); void solveWithCyclicCoordinateDescent(const std::vector& targets); virtual void setSkeletonInternal(AnimSkeleton::ConstPointer skeleton); From a052f5e125f7d75fb4d36929c05b2ba2cc6e28df Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Tue, 29 Sep 2015 16:21:08 -0700 Subject: [PATCH 2/3] remove commented out debug line --- libraries/animation/src/AnimInverseKinematics.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/animation/src/AnimInverseKinematics.cpp b/libraries/animation/src/AnimInverseKinematics.cpp index ff5d2a6a3f..c0adba0ad6 100644 --- a/libraries/animation/src/AnimInverseKinematics.cpp +++ b/libraries/animation/src/AnimInverseKinematics.cpp @@ -371,7 +371,6 @@ const AnimPoseVec& AnimInverseKinematics::overlay(const AnimVariantMap& animVars } } return _relativePoses; - //return underPoses; } RotationConstraint* AnimInverseKinematics::getConstraint(int index) { From b192d0a9cdfdada443fc3957804287cfff0d08ab Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Tue, 29 Sep 2015 17:39:17 -0700 Subject: [PATCH 3/3] make neck IK target type same as head --- .../meshes/defaultAvatar_full/avatar-animation.json | 5 +++-- libraries/animation/src/Rig.cpp | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/interface/resources/meshes/defaultAvatar_full/avatar-animation.json b/interface/resources/meshes/defaultAvatar_full/avatar-animation.json index 72eefaf7e8..dceecddfe0 100644 --- a/interface/resources/meshes/defaultAvatar_full/avatar-animation.json +++ b/interface/resources/meshes/defaultAvatar_full/avatar-animation.json @@ -26,13 +26,14 @@ { "jointName": "Neck", "positionVar": "neckPosition", - "rotationVar": "neckRotation" + "rotationVar": "neckRotation", + "typeVar": "headAndNeckType" }, { "jointName": "Head", "positionVar": "headPosition", "rotationVar": "headRotation", - "typeVar": "headType" + "typeVar": "headAndNeckType" } ] }, diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index 0022749d51..ceef68f85b 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -1079,7 +1079,7 @@ void Rig::updateNeckJoint(int index, const HeadParameters& params) { _animVars.set("headPosition", headPos); _animVars.set("headRotation", headRot); - _animVars.set("headType", QString("RotationAndPosition")); + _animVars.set("headAndNeckType", QString("RotationAndPosition")); _animVars.set("neckPosition", neckPos); _animVars.set("neckRotation", neckRot); @@ -1092,7 +1092,7 @@ void Rig::updateNeckJoint(int index, const HeadParameters& params) { _animVars.unset("headPosition"); _animVars.set("headRotation", realLocalHeadOrientation); - _animVars.set("headType", QString("RotationOnly")); + _animVars.set("headAndNeckType", QString("RotationOnly")); _animVars.unset("neckPosition"); _animVars.unset("neckRotation"); }