From 914491ae27e27ee0998a49967352bc3a776aa3c1 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Wed, 31 Oct 2018 11:48:55 -0700 Subject: [PATCH 1/5] fix YX coord swamp --- libraries/fbx/src/FSTReader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/fbx/src/FSTReader.cpp b/libraries/fbx/src/FSTReader.cpp index 10ea9dc964..05690f5740 100644 --- a/libraries/fbx/src/FSTReader.cpp +++ b/libraries/fbx/src/FSTReader.cpp @@ -220,8 +220,8 @@ QMap FSTReader::getJointRotationOffsets(const QVariantHash& float eulerY = eulerAngles[1].toFloat(); float eulerZ = eulerAngles[2].mid(0, eulerAngles[2].size() - 1).toFloat(); if (!isNaN(eulerX) && !isNaN(eulerY) && !isNaN(eulerZ)) { - glm::quat rotationOffset = (glm::angleAxis(eulerX * RADIANS_PER_DEGREE, Vectors::UNIT_Y) * - glm::angleAxis(eulerY * RADIANS_PER_DEGREE, Vectors::UNIT_X) * + glm::quat rotationOffset = (glm::angleAxis(eulerX * RADIANS_PER_DEGREE, Vectors::UNIT_X) * + glm::angleAxis(eulerY * RADIANS_PER_DEGREE, Vectors::UNIT_Y) * glm::angleAxis(eulerZ * RADIANS_PER_DEGREE, Vectors::UNIT_Z)); jointRotationOffsets.insert(jointName, rotationOffset); } From bcde01621d13417baab6a2a173c8977a5b1aef6d Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Mon, 5 Nov 2018 14:25:52 -0700 Subject: [PATCH 2/5] set offsets on FBXGeometry --- libraries/animation/src/Rig.cpp | 13 ------- libraries/animation/src/Rig.h | 4 -- .../src/avatars-renderer/SkeletonModel.cpp | 1 - libraries/fbx/src/FBX.h | 2 + libraries/fbx/src/FBXReader.cpp | 38 +++++++++++++++++++ libraries/fbx/src/FSTReader.cpp | 24 ------------ libraries/fbx/src/FSTReader.h | 2 - 7 files changed, 40 insertions(+), 44 deletions(-) diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index c58a96aa84..33b9569758 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -2062,16 +2062,3 @@ void Rig::computeAvatarBoundingCapsule( glm::vec3 capsuleCenter = transformPoint(_geometryToRigTransform, (0.5f * (totalExtents.maximum + totalExtents.minimum))); localOffsetOut = capsuleCenter - hipsPosition; } - -void Rig::setJointRotationOffsets(const QMap& offsets) { - _jointRotationOffsets.clear(); - for (auto itr = offsets.begin(); itr != offsets.end(); itr++) { - QString jointName = itr.key(); - glm::quat rotationOffset = itr.value(); - int jointIndex = indexOfJoint(jointName); - if (jointIndex != -1) { - _jointRotationOffsets.insert(jointIndex, rotationOffset); - } - qDebug() << "Joint Rotation Offset added to Rig._jointRotationOffsets : " << " jointName: " << jointName << " jointIndex: " << jointIndex << " rotation offset: " << rotationOffset; - } -} \ No newline at end of file diff --git a/libraries/animation/src/Rig.h b/libraries/animation/src/Rig.h index 9928810026..7a090bd7bd 100644 --- a/libraries/animation/src/Rig.h +++ b/libraries/animation/src/Rig.h @@ -231,8 +231,6 @@ public: const AnimContext::DebugAlphaMap& getDebugAlphaMap() const { return _lastContext.getDebugAlphaMap(); } const AnimVariantMap& getAnimVars() const { return _lastAnimVars; } const AnimContext::DebugStateMachineMap& getStateMachineMap() const { return _lastContext.getStateMachineMap(); } - - void setJointRotationOffsets(const QMap& offsets); signals: void onLoadComplete(); @@ -302,8 +300,6 @@ protected: int _rightElbowJointIndex { -1 }; int _rightShoulderJointIndex { -1 }; - QMap _jointRotationOffsets; - glm::vec3 _lastForward; glm::vec3 _lastPosition; glm::vec3 _lastVelocity; diff --git a/libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.cpp b/libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.cpp index 816e078886..bf6af763a3 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.cpp @@ -83,7 +83,6 @@ void SkeletonModel::initJointStates() { // Skeleton may have already been scaled so unscale it _defaultEyeModelPosition = _defaultEyeModelPosition / _scale; - _rig.setJointRotationOffsets(FSTReader::getJointRotationOffsets(getGeometry()->getMapping())); computeBoundingShape(); Extents meshExtents = getMeshExtents(); diff --git a/libraries/fbx/src/FBX.h b/libraries/fbx/src/FBX.h index fdebb16bc8..ec3a29e7f5 100644 --- a/libraries/fbx/src/FBX.h +++ b/libraries/fbx/src/FBX.h @@ -366,6 +366,8 @@ public: QString getModelNameOfMesh(int meshIndex) const; QList blendshapeChannelNames; + + QMap jointRotationOffsets; }; Q_DECLARE_METATYPE(FBXGeometry) diff --git a/libraries/fbx/src/FBXReader.cpp b/libraries/fbx/src/FBXReader.cpp index dd766f002c..44976adfa8 100644 --- a/libraries/fbx/src/FBXReader.cpp +++ b/libraries/fbx/src/FBXReader.cpp @@ -615,6 +615,31 @@ QByteArray fileOnUrl(const QByteArray& filepath, const QString& url) { return filepath.mid(filepath.lastIndexOf('/') + 1); } +QMap getJointRotationOffsets(const QVariantHash& mapping) { + QMap jointRotationOffsets; + static const QString JOINT_ROTATION_OFFSET_FIELD = "jointRotationOffset"; + if (!mapping.isEmpty() && mapping.contains(JOINT_ROTATION_OFFSET_FIELD) && mapping[JOINT_ROTATION_OFFSET_FIELD].type() == QVariant::Hash) { + auto offsets = mapping[JOINT_ROTATION_OFFSET_FIELD].toHash(); + for (auto itr = offsets.begin(); itr != offsets.end(); itr++) { + QString jointName = itr.key(); + QString line = itr.value().toString(); + auto eulerAngles = line.split(','); + if (eulerAngles.size() == 3) { + float eulerX = eulerAngles[0].mid(1).toFloat(); + float eulerY = eulerAngles[1].toFloat(); + float eulerZ = eulerAngles[2].mid(0, eulerAngles[2].size() - 1).toFloat(); + if (!isNaN(eulerX) && !isNaN(eulerY) && !isNaN(eulerZ)) { + glm::quat rotationOffset = (glm::angleAxis(eulerX * RADIANS_PER_DEGREE, Vectors::UNIT_X) * + glm::angleAxis(eulerY * RADIANS_PER_DEGREE, Vectors::UNIT_Y) * + glm::angleAxis(eulerZ * RADIANS_PER_DEGREE, Vectors::UNIT_Z)); + jointRotationOffsets.insert(jointName, rotationOffset); + } + } + } + } + return jointRotationOffsets; +} + FBXGeometry* FBXReader::extractFBXGeometry(const QVariantHash& mapping, const QString& url) { const FBXNode& node = _rootNode; QMap meshes; @@ -1991,6 +2016,19 @@ FBXGeometry* FBXReader::extractFBXGeometry(const QVariantHash& mapping, const QS } } } + + auto offsets = getJointRotationOffsets(mapping); + geometry.jointRotationOffsets.clear(); + for (auto itr = offsets.begin(); itr != offsets.end(); itr++) { + QString jointName = itr.key(); + glm::quat rotationOffset = itr.value(); + int jointIndex = geometry.getJointIndex(jointName); + if (jointIndex != -1) { + geometry.jointRotationOffsets.insert(jointIndex, rotationOffset); + } + qCDebug(modelformat) << "Joint Rotation Offset added to Rig._jointRotationOffsets : " << " jointName: " << jointName << " jointIndex: " << jointIndex << " rotation offset: " << rotationOffset; + } + return geometryPtr; } diff --git a/libraries/fbx/src/FSTReader.cpp b/libraries/fbx/src/FSTReader.cpp index 05690f5740..75596862d2 100644 --- a/libraries/fbx/src/FSTReader.cpp +++ b/libraries/fbx/src/FSTReader.cpp @@ -207,30 +207,6 @@ QVector FSTReader::getScripts(const QUrl& url, const QVariantHash& mapp return scriptPaths; } -QMap FSTReader::getJointRotationOffsets(const QVariantHash& mapping) { - QMap jointRotationOffsets; - if (!mapping.isEmpty() && mapping.contains(JOINT_ROTATION_OFFSET_FIELD) && mapping[JOINT_ROTATION_OFFSET_FIELD].type() == QVariant::Hash) { - auto offsets = mapping[JOINT_ROTATION_OFFSET_FIELD].toHash(); - for (auto itr = offsets.begin(); itr != offsets.end(); itr++) { - QString jointName = itr.key(); - QString line = itr.value().toString(); - auto eulerAngles = line.split(','); - if (eulerAngles.size() == 3) { - float eulerX = eulerAngles[0].mid(1).toFloat(); - float eulerY = eulerAngles[1].toFloat(); - float eulerZ = eulerAngles[2].mid(0, eulerAngles[2].size() - 1).toFloat(); - if (!isNaN(eulerX) && !isNaN(eulerY) && !isNaN(eulerZ)) { - glm::quat rotationOffset = (glm::angleAxis(eulerX * RADIANS_PER_DEGREE, Vectors::UNIT_X) * - glm::angleAxis(eulerY * RADIANS_PER_DEGREE, Vectors::UNIT_Y) * - glm::angleAxis(eulerZ * RADIANS_PER_DEGREE, Vectors::UNIT_Z)); - jointRotationOffsets.insert(jointName, rotationOffset); - } - } - } - } - return jointRotationOffsets; -} - QVariantHash FSTReader::downloadMapping(const QString& url) { QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest networkRequest = QNetworkRequest(url); diff --git a/libraries/fbx/src/FSTReader.h b/libraries/fbx/src/FSTReader.h index ef649eb4d8..3729cbaf16 100644 --- a/libraries/fbx/src/FSTReader.h +++ b/libraries/fbx/src/FSTReader.h @@ -30,7 +30,6 @@ static const QString JOINT_FIELD = "joint"; static const QString FREE_JOINT_FIELD = "freeJoint"; static const QString BLENDSHAPE_FIELD = "bs"; static const QString SCRIPT_FIELD = "script"; -static const QString JOINT_ROTATION_OFFSET_FIELD = "jointRotationOffset"; class FSTReader { public: @@ -53,7 +52,6 @@ public: static ModelType predictModelType(const QVariantHash& mapping); static QVector getScripts(const QUrl& fstUrl, const QVariantHash& mapping = QVariantHash()); - static QMap getJointRotationOffsets(const QVariantHash& mapping); static QString getNameFromType(ModelType modelType); static FSTReader::ModelType getTypeFromName(const QString& name); From 8310dd0cbac7203e15e39af8888b3dcc3f03fb0c Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Mon, 5 Nov 2018 15:10:09 -0700 Subject: [PATCH 3/5] Delete leftovers --- .../avatars-renderer/src/avatars-renderer/SkeletonModel.cpp | 2 +- libraries/fbx/src/FSTReader.h | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.cpp b/libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.cpp index bf6af763a3..fce33d38c1 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.cpp @@ -18,7 +18,6 @@ #include #include #include -#include #include "Avatar.h" #include "Logging.h" @@ -83,6 +82,7 @@ void SkeletonModel::initJointStates() { // Skeleton may have already been scaled so unscale it _defaultEyeModelPosition = _defaultEyeModelPosition / _scale; + computeBoundingShape(); Extents meshExtents = getMeshExtents(); diff --git a/libraries/fbx/src/FSTReader.h b/libraries/fbx/src/FSTReader.h index 3729cbaf16..4a8574f0cf 100644 --- a/libraries/fbx/src/FSTReader.h +++ b/libraries/fbx/src/FSTReader.h @@ -14,7 +14,6 @@ #include #include -#include static const QString NAME_FIELD = "name"; static const QString TYPE_FIELD = "type"; From 599b7761b2a7d44b848215a0bb001ac4d21e08bd Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Tue, 6 Nov 2018 11:09:56 -0700 Subject: [PATCH 4/5] Read quats from fst --- libraries/fbx/src/FBXReader.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/libraries/fbx/src/FBXReader.cpp b/libraries/fbx/src/FBXReader.cpp index 44976adfa8..c8dc78bd91 100644 --- a/libraries/fbx/src/FBXReader.cpp +++ b/libraries/fbx/src/FBXReader.cpp @@ -623,15 +623,14 @@ QMap getJointRotationOffsets(const QVariantHash& mapping) { for (auto itr = offsets.begin(); itr != offsets.end(); itr++) { QString jointName = itr.key(); QString line = itr.value().toString(); - auto eulerAngles = line.split(','); - if (eulerAngles.size() == 3) { - float eulerX = eulerAngles[0].mid(1).toFloat(); - float eulerY = eulerAngles[1].toFloat(); - float eulerZ = eulerAngles[2].mid(0, eulerAngles[2].size() - 1).toFloat(); - if (!isNaN(eulerX) && !isNaN(eulerY) && !isNaN(eulerZ)) { - glm::quat rotationOffset = (glm::angleAxis(eulerX * RADIANS_PER_DEGREE, Vectors::UNIT_X) * - glm::angleAxis(eulerY * RADIANS_PER_DEGREE, Vectors::UNIT_Y) * - glm::angleAxis(eulerZ * RADIANS_PER_DEGREE, Vectors::UNIT_Z)); + auto quatCoords = line.split(','); + if (quatCoords.size() == 4) { + float quatX = quatCoords[0].mid(1).toFloat(); + float quatY = quatCoords[1].toFloat(); + float quatZ = quatCoords[2].toFloat(); + float quatW = quatCoords[3].mid(0, quatCoords[3].size() - 1).toFloat(); + if (!isNaN(quatX) && !isNaN(quatY) && !isNaN(quatZ) && !isNaN(quatW)) { + glm::quat rotationOffset = glm::quat(quatW, quatX, quatY, quatZ); jointRotationOffsets.insert(jointName, rotationOffset); } } @@ -2026,7 +2025,7 @@ FBXGeometry* FBXReader::extractFBXGeometry(const QVariantHash& mapping, const QS if (jointIndex != -1) { geometry.jointRotationOffsets.insert(jointIndex, rotationOffset); } - qCDebug(modelformat) << "Joint Rotation Offset added to Rig._jointRotationOffsets : " << " jointName: " << jointName << " jointIndex: " << jointIndex << " rotation offset: " << rotationOffset; + qDebug() << "Joint Rotation Offset added to Rig._jointRotationOffsets : " << " jointName: " << jointName << " jointIndex: " << jointIndex << " rotation offset: " << rotationOffset; } return geometryPtr; From e0d1ef3be3128a9433787bb76bc27881c5f4d07f Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Tue, 6 Nov 2018 11:11:16 -0700 Subject: [PATCH 5/5] Fix debug output --- libraries/fbx/src/FBXReader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/fbx/src/FBXReader.cpp b/libraries/fbx/src/FBXReader.cpp index c8dc78bd91..c357d0f430 100644 --- a/libraries/fbx/src/FBXReader.cpp +++ b/libraries/fbx/src/FBXReader.cpp @@ -2025,7 +2025,7 @@ FBXGeometry* FBXReader::extractFBXGeometry(const QVariantHash& mapping, const QS if (jointIndex != -1) { geometry.jointRotationOffsets.insert(jointIndex, rotationOffset); } - qDebug() << "Joint Rotation Offset added to Rig._jointRotationOffsets : " << " jointName: " << jointName << " jointIndex: " << jointIndex << " rotation offset: " << rotationOffset; + qCDebug(modelformat) << "Joint Rotation Offset added to Rig._jointRotationOffsets : " << " jointName: " << jointName << " jointIndex: " << jointIndex << " rotation offset: " << rotationOffset; } return geometryPtr;