From dbf6daf80c5475b1bcd87b223192a30b84cdac55 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 27 Sep 2014 11:25:37 -0700 Subject: [PATCH] Fix default eye model calculation to be reliable --- interface/src/avatar/SkeletonModel.cpp | 40 ++++++++++++++++---------- interface/src/avatar/SkeletonModel.h | 2 +- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index 1af5cfc893..a1fccf1a10 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -36,9 +36,30 @@ SkeletonModel::~SkeletonModel() { _ragdoll = NULL; } +const float MODEL_SCALE = 0.0006f; + void SkeletonModel::setJointStates(QVector states) { Model::setJointStates(states); + // Determine the default eye position for avatar scale = 1.0 + int headJointIndex = _geometry->getFBXGeometry().headJointIndex; + if (0 <= headJointIndex && headJointIndex < _jointStates.size()) { + + glm::vec3 leftEyePosition, rightEyePosition; + getEyeModelPositions(leftEyePosition, rightEyePosition); + glm::vec3 midEyePosition = (leftEyePosition + rightEyePosition) / 2.f; + + int rootJointIndex = _geometry->getFBXGeometry().rootJointIndex; + glm::vec3 rootModelPosition; + getJointPosition(rootJointIndex, rootModelPosition); + + _defaultEyeModelPosition = midEyePosition - rootModelPosition; + _defaultEyeModelPosition.z = -_defaultEyeModelPosition.z; + + // Skeleton may have already been scaled so unscale it + _defaultEyeModelPosition = MODEL_SCALE * _defaultEyeModelPosition / _scale; + } + // the SkeletonModel override of updateJointState() will clear the translation part // of its root joint and we need that done before we try to build shapes hence we // recompute all joint transforms at this time. @@ -59,7 +80,6 @@ void SkeletonModel::simulate(float deltaTime, bool fullUpdate) { setTranslation(_owningAvatar->getPosition()); static const glm::quat refOrientation = glm::angleAxis(PI, glm::vec3(0.0f, 1.0f, 0.0f)); setRotation(_owningAvatar->getOrientation() * refOrientation); - const float MODEL_SCALE = 0.0006f; setScale(glm::vec3(1.0f, 1.0f, 1.0f) * _owningAvatar->getScale() * MODEL_SCALE); setBlendshapeCoefficients(_owningAvatar->getHead()->getBlendshapeCoefficients()); @@ -507,6 +527,10 @@ bool SkeletonModel::getEyePositions(glm::vec3& firstEyePosition, glm::vec3& seco return false; } +glm::vec3 SkeletonModel::getDefaultEyeModelPosition() const { + return _owningAvatar->getScale() * _defaultEyeModelPosition; +} + void SkeletonModel::renderRagdoll() { if (!_ragdoll) { return; @@ -666,20 +690,6 @@ void SkeletonModel::buildShapes() { // This method moves the shapes to their default positions in Model frame. computeBoundingShape(geometry); - int headJointIndex = _geometry->getFBXGeometry().headJointIndex; - if (0 <= headJointIndex && headJointIndex < _jointStates.size()) { - glm::vec3 leftEyePosition, rightEyePosition; - getEyeModelPositions(leftEyePosition, rightEyePosition); - glm::vec3 midEyePosition = (leftEyePosition + rightEyePosition) / 2.f; - - int rootJointIndex = _geometry->getFBXGeometry().rootJointIndex; - glm::vec3 rootModelPosition; - getJointPosition(rootJointIndex, rootModelPosition); - - _defaultEyeModelPosition = midEyePosition - rootModelPosition; - _defaultEyeModelPosition.z = -_defaultEyeModelPosition.z; - } - // While the shapes are in their default position we disable collisions between // joints that are currently colliding. disableCurrentSelfCollisions(); diff --git a/interface/src/avatar/SkeletonModel.h b/interface/src/avatar/SkeletonModel.h index 35122d5e18..81e3fcb3b6 100644 --- a/interface/src/avatar/SkeletonModel.h +++ b/interface/src/avatar/SkeletonModel.h @@ -99,7 +99,7 @@ public: /// Gets the default position of the mid eye point in model frame coordinates. /// \return whether or not the head was found. - glm::vec3 getDefaultEyeModelPosition() const { return _defaultEyeModelPosition; } + glm::vec3 getDefaultEyeModelPosition() const; virtual void updateVisibleJointStates();