From a1b54945d6d707d243291c91133bd9b235b597fa Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Fri, 2 Oct 2015 10:34:34 -0700 Subject: [PATCH] Compute the model offset in the rig, using the bind pose of the hips. --- interface/src/avatar/SkeletonModel.cpp | 3 +++ libraries/animation/src/Rig.cpp | 9 +++++++++ libraries/animation/src/Rig.h | 2 ++ 3 files changed, 14 insertions(+) diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index beb58e746c..16a6fa0531 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -246,6 +246,9 @@ void SkeletonModel::simulate(float deltaTime, bool fullUpdate) { Hand* hand = _owningAvatar->getHand(); hand->getLeftRightPalmIndices(leftPalmIndex, rightPalmIndex); + // let rig compute the model offset + setOffset(_rig->getModelOffset()); + // Don't Relax toward hand positions when in animGraph mode. if (!_rig->getEnableAnimGraph()) { const float HAND_RESTORATION_RATE = 0.25f; diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index e83a63e329..25c10d7a61 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -1263,3 +1263,12 @@ void Rig::initAnimGraph(const QUrl& url, const FBXGeometry& fbxGeometry) { qCCritical(animation) << "Error loading" << url.toDisplayString() << "code = " << error << "str =" << str; }); } + +glm::vec3 Rig::getModelOffset() const { + if (_animSkeleton && _rootJointIndex >= 0) { + return -_animSkeleton->getAbsoluteBindPose(_rootJointIndex).trans; + } else { + const glm::vec3 DEFAULT_MODEL_OFFSET(0.0f, 0.0f, 0.0f); + return DEFAULT_MODEL_OFFSET; + } +} diff --git a/libraries/animation/src/Rig.h b/libraries/animation/src/Rig.h index c99db65081..c57b4f629f 100644 --- a/libraries/animation/src/Rig.h +++ b/libraries/animation/src/Rig.h @@ -204,6 +204,8 @@ public: AnimSkeleton::ConstPointer getAnimSkeleton() const { return _animSkeleton; } bool disableHands {false}; // should go away with rig animation (and Rig::inverseKinematics) + glm::vec3 getModelOffset() const; + protected: void updateLeanJoint(int index, float leanSideways, float leanForward, float torsoTwist);