From 080f891c9fa49a9edd3e311c9072ff7bee5aa7a0 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Thu, 25 Apr 2019 14:54:40 -0700 Subject: [PATCH] Fix scale and refactor debug function --- interface/src/avatar/OtherAvatar.cpp | 49 +++++++++---------- .../src/avatars-renderer/Avatar.cpp | 4 +- 2 files changed, 25 insertions(+), 28 deletions(-) diff --git a/interface/src/avatar/OtherAvatar.cpp b/interface/src/avatar/OtherAvatar.cpp index 7bdc9cb0f9..d8cfe8f107 100755 --- a/interface/src/avatar/OtherAvatar.cpp +++ b/interface/src/avatar/OtherAvatar.cpp @@ -374,43 +374,40 @@ void OtherAvatar::debugJointData() const { const vec4 WHITE(1.0f, 1.0f, 1.0f, 1.0f); const float AXIS_LENGTH = 0.1f; - AnimPoseVec jointPoses; - std::vector jointNames; + AnimPoseVec absoluteJointPoses; AnimPose rigToAvatar = AnimPose(Quaternions::Y_180 * getWorldOrientation(), getWorldPosition()); + bool drawBones = false; for (int i = 0; i < jointData.size(); i++) { - float jointScale = skeletonData[i].defaultScale * getTargetScale(); - auto jointRotation = rigToAvatar.rot() * (jointData[i].rotationIsDefaultPose ? skeletonData[i].defaultRotation : jointData[i].rotation); - auto jointTranslation = jointScale * (jointData[i].translationIsDefaultPose ? skeletonData[i].defaultTranslation : jointData[i].translation); - if (skeletonData[i].jointName == "Hips") { - jointTranslation = glm::vec3(0.0f); + float jointScale = skeletonData[i].defaultScale * getTargetScale() * METERS_PER_CENTIMETER; + auto absoluteRotation = jointData[i].rotationIsDefaultPose ? skeletonData[i].defaultRotation : jointData[i].rotation; + auto localJointTranslation = jointScale * (jointData[i].translationIsDefaultPose ? skeletonData[i].defaultTranslation : jointData[i].translation); + bool isHips = skeletonData[i].jointName == "Hips"; + if (isHips) { + localJointTranslation = glm::vec3(0.0f); + drawBones = true; } - jointPoses.push_back(AnimPose(jointRotation, jointTranslation)); - jointNames.push_back(skeletonData[i].jointName); - } - QVector worldFramePoses; - for (int i = 0; i < (int)jointPoses.size(); i++) { - auto& jointPose = jointPoses[i]; + AnimPose absoluteParentPose; int parentIndex = skeletonData[i].parentIndex; - if (parentIndex < worldFramePoses.size()) { + if (parentIndex != -1 && parentIndex < (int)absoluteJointPoses.size()) { + absoluteParentPose = absoluteJointPoses[parentIndex]; + } + AnimPose absoluteJointPose = AnimPose(absoluteRotation, absoluteParentPose.trans() + absoluteParentPose.rot() * localJointTranslation); + auto jointPose = rigToAvatar * absoluteJointPose; + auto parentPose = rigToAvatar * absoluteParentPose; + if (drawBones) { glm::vec3 xAxis = jointPose.rot() * Vectors::UNIT_X; glm::vec3 yAxis = jointPose.rot() * Vectors::UNIT_Y; glm::vec3 zAxis = jointPose.rot() * Vectors::UNIT_Z; - auto parentRotation = parentIndex > -1 ? jointPoses[parentIndex].rot() : Quaternions::IDENTITY; - auto parentPosition = parentIndex > -1 ? worldFramePoses[parentIndex].trans() : rigToAvatar.trans(); - auto jointPosition = parentPosition + parentRotation * (jointPose.trans() * METERS_PER_CENTIMETER); - worldFramePoses.push_back(AnimPose(jointPose.rot(), jointPosition)); - - DebugDraw::getInstance().drawRay(jointPosition, jointPosition + AXIS_LENGTH * xAxis, jointData[i].rotationIsDefaultPose ? LIGHT_RED : RED); - DebugDraw::getInstance().drawRay(jointPosition, jointPosition + AXIS_LENGTH * yAxis, jointData[i].rotationIsDefaultPose ? LIGHT_GREEN : GREEN); - DebugDraw::getInstance().drawRay(jointPosition, jointPosition + AXIS_LENGTH * zAxis, jointData[i].rotationIsDefaultPose ? LIGHT_BLUE : BLUE); - // draw line to parent - if (parentIndex != -1) { - DebugDraw::getInstance().drawRay(jointPosition, parentPosition, jointData[i].translationIsDefaultPose ? WHITE : GREY); + DebugDraw::getInstance().drawRay(jointPose.trans(), jointPose.trans() + AXIS_LENGTH * xAxis, jointData[i].rotationIsDefaultPose ? LIGHT_RED : RED); + DebugDraw::getInstance().drawRay(jointPose.trans(), jointPose.trans() + AXIS_LENGTH * yAxis, jointData[i].rotationIsDefaultPose ? LIGHT_GREEN : GREEN); + DebugDraw::getInstance().drawRay(jointPose.trans(), jointPose.trans() + AXIS_LENGTH * zAxis, jointData[i].rotationIsDefaultPose ? LIGHT_BLUE : BLUE); + if (!isHips) { + DebugDraw::getInstance().drawRay(jointPose.trans(), parentPose.trans(), jointData[i].translationIsDefaultPose ? WHITE : GREY); } } + absoluteJointPoses.push_back(absoluteJointPose); } - } } diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 6961ba880d..49e527fd8e 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -1454,7 +1454,7 @@ std::vector Avatar::getSkeletonDefaultDa if (_skeletonModel->isLoaded()) { auto& model = _skeletonModel->getHFMModel(); auto& rig = _skeletonModel->getRig(); - float geometryToRigScale = glm::length(extractScale(rig.getGeometryToRigTransform())); + float geometryToRigScale = extractScale(rig.getGeometryToRigTransform())[0]; QStringList jointNames = getJointNames(); int sizeCount = 0; for (int i = 0; i < jointNames.size(); i++) { @@ -1468,7 +1468,7 @@ std::vector Avatar::getSkeletonDefaultDa } jointData.defaultRotation = rig.getAbsoluteDefaultPose(i).rot(); jointData.defaultTranslation = getDefaultJointTranslation(i); - float jointLocalScale = glm::length(extractScale(model.joints[i].transform)); + float jointLocalScale = extractScale(model.joints[i].transform)[0]; jointData.defaultScale = jointLocalScale / geometryToRigScale; jointData.jointName = jointNames[i]; jointData.stringLength = jointNames[i].size();