From 8c87d6f8351e5a645dbe29bf8082b353abfd6e15 Mon Sep 17 00:00:00 2001 From: ksuprynowicz Date: Sun, 27 Aug 2023 20:41:48 +0200 Subject: [PATCH] Fixed flow bone scaling issue --- libraries/animation/src/Flow.cpp | 16 +++++++++------- libraries/animation/src/Flow.h | 9 +++++++-- libraries/animation/src/Rig.cpp | 2 +- libraries/animation/src/Rig.h | 6 +++--- 4 files changed, 20 insertions(+), 13 deletions(-) diff --git a/libraries/animation/src/Flow.cpp b/libraries/animation/src/Flow.cpp index 41db9d5606..e68b86af21 100644 --- a/libraries/animation/src/Flow.cpp +++ b/libraries/animation/src/Flow.cpp @@ -320,7 +320,8 @@ void FlowJoint::toHelperJoint(const glm::vec3& initialPosition, float length) { _length = length; } -FlowThread::FlowThread(int rootIndex, std::map* joints) { +FlowThread::FlowThread(int rootIndex, std::map* joints, float rigScale) { + _rigScale = rigScale; _jointsPointer = joints; computeFlowThread(rootIndex); } @@ -365,7 +366,7 @@ void FlowThread::computeRecovery() { glm::quat parentRotation = parentJoint._parentWorldRotation * parentJoint._initialRotation; for (size_t i = 1; i < _joints.size(); i++) { auto joint = _jointsPointer->at(_joints[i]); - _jointsPointer->at(_joints[i])._recoveryPosition = joint._recoveryPosition = parentJoint._recoveryPosition + (parentRotation * (joint._initialTranslation * 0.01f)); + _jointsPointer->at(_joints[i])._recoveryPosition = joint._recoveryPosition = parentJoint._recoveryPosition + (parentRotation * (joint._initialTranslation * _rigScale)); parentJoint = joint; } }; @@ -405,7 +406,7 @@ void FlowThread::computeJointRotations() { auto joint0 = _jointsPointer->at(_joints[0]); auto joint1 = _jointsPointer->at(_joints[1]); - auto initial_pos1 = pos0 + (joint0._initialRotation * (joint1._initialTranslation * 0.01f)); + auto initial_pos1 = pos0 + (joint0._initialRotation * (joint1._initialTranslation * _rigScale)); auto vec0 = initial_pos1 - pos0; auto vec1 = pos1 - pos0; @@ -417,11 +418,11 @@ void FlowThread::computeJointRotations() { for (size_t i = 1; i < _joints.size() - 1; i++) { auto nextJoint = _jointsPointer->at(_joints[i + 1]); for (size_t j = i; j < _joints.size(); j++) { - _rootFramePositions[j] = glm::inverse(joint0._currentRotation) * _rootFramePositions[j] - (joint0._initialTranslation * 0.01f); + _rootFramePositions[j] = glm::inverse(joint0._currentRotation) * _rootFramePositions[j] - (joint0._initialTranslation * _rigScale); } pos0 = _rootFramePositions[i]; pos1 = _rootFramePositions[i + 1]; - initial_pos1 = pos0 + joint1._initialRotation * (nextJoint._initialTranslation * 0.01f); + initial_pos1 = pos0 + joint1._initialRotation * (nextJoint._initialTranslation * _rigScale); vec0 = initial_pos1 - pos0; vec1 = pos1 - pos0; @@ -554,8 +555,9 @@ void Flow::calculateConstraints(const std::shared_ptr& skeleton, } } int extraIndex = -1; + qDebug() << "GetScaleFactorGeometryToUnscaledRig() " << _rig->GetScaleFactorGeometryToUnscaledRig(); for (size_t i = 0; i < roots.size(); i++) { - FlowThread thread = FlowThread(roots[i], &_flowJointData); + FlowThread thread = FlowThread(roots[i], &_flowJointData, _rig->GetScaleFactorGeometryToUnscaledRig()); // add threads with at least 2 joints if (thread._joints.size() > 0) { if (thread._joints.size() == 1) { @@ -570,7 +572,7 @@ void Flow::calculateConstraints(const std::shared_ptr& skeleton, glm::vec3 translation = glm::vec3(0.0f, HELPER_JOINT_LENGTH, 0.0f); newJoint.setInitialData(jointPosition + translation, 100.0f * translation , Quaternions::IDENTITY, jointPosition); _flowJointData.insert(std::pair(extraIndex, newJoint)); - FlowThread newThread = FlowThread(jointIndex, &_flowJointData); + FlowThread newThread = FlowThread(jointIndex, &_flowJointData, _rig->GetScaleFactorGeometryToUnscaledRig()); if (newThread._joints.size() > 1) { _jointThreads.push_back(newThread); } diff --git a/libraries/animation/src/Flow.h b/libraries/animation/src/Flow.h index 5dc1a3ba3e..363db33736 100644 --- a/libraries/animation/src/Flow.h +++ b/libraries/animation/src/Flow.h @@ -263,7 +263,7 @@ public: FlowThread() {}; FlowThread& operator=(const FlowThread& otherFlowThread); - FlowThread(int rootIndex, std::map* joints); + FlowThread(int rootIndex, std::map* joints, float rigScale); void resetLength(); void computeFlowThread(int rootIndex); @@ -278,6 +278,7 @@ public: std::vector _positions; float _radius{ 0.0f }; float _length{ 0.0f }; + float _rigScale { 100.0f }; std::map* _jointsPointer; std::vector _rootFramePositions; }; @@ -285,7 +286,7 @@ public: class Flow : public QObject{ Q_OBJECT public: - Flow() { } + Flow(Rig *rig) : _rig (rig) {}; Flow& operator=(const Flow& otherFlow); bool getActive() const { return _active; } void setActive(bool active) { _active = active; } @@ -323,6 +324,10 @@ private: float _scale { 1.0f }; float _lastScale{ 1.0f }; + // 100.0f was default rig scale when it was hardcoded but it caused issues with most avatars + //float _rigScale{ 100.0f }; + // Rig to which flow system belongs, it's used for getting rig scale + Rig *_rig { nullptr }; glm::vec3 _entityPosition; glm::quat _entityRotation; std::map _flowJointData; diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index 85d008d4da..9e0d5ed132 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -305,7 +305,7 @@ static const QString MAIN_STATE_MACHINE_RIGHT_HAND_POSITION("mainStateMachineRig // - isLeftThumbRaise // - isLeftIndexPointAndThumbRaise // - isLeftHandGrasp -Rig::Rig() { +Rig::Rig() : _internalFlow(this), _networkFlow(this) { // Ensure thread-safe access to the rigRegistry. std::lock_guard guard(rigRegistryMutex); diff --git a/libraries/animation/src/Rig.h b/libraries/animation/src/Rig.h index 69748ad0ba..6c0ab3870b 100644 --- a/libraries/animation/src/Rig.h +++ b/libraries/animation/src/Rig.h @@ -261,6 +261,9 @@ public: bool getNetworkGraphActive() const; void setDirectionalBlending(const QString& targetName, const glm::vec3& blendingTarget, const QString& alphaName, float alpha); + // Get the scale factor to convert distances in the geometry frame into the unscaled rig frame. + float GetScaleFactorGeometryToUnscaledRig() const; + signals: void onLoadComplete(); void onLoadFailed(); @@ -290,9 +293,6 @@ protected: glm::vec3 deflectHandFromTorso(const glm::vec3& handPosition, const HFMJointShapeInfo& hipsShapeInfo, const HFMJointShapeInfo& spineShapeInfo, const HFMJointShapeInfo& spine1ShapeInfo, const HFMJointShapeInfo& spine2ShapeInfo) const; - // Get the scale factor to convert distances in the geometry frame into the unscaled rig frame. - float GetScaleFactorGeometryToUnscaledRig() const; - // The ground plane Y position in geometry space. static constexpr float GEOMETRY_GROUND_Y = 0.0f;