diff --git a/interface/resources/avatar/avatar-animation.json b/interface/resources/avatar/avatar-animation.json index 16523afba3..f68d7e61d4 100644 --- a/interface/resources/avatar/avatar-animation.json +++ b/interface/resources/avatar/avatar-animation.json @@ -159,24 +159,6 @@ "poleVectorEnabledVar": "leftHandPoleVectorEnabled", "poleReferenceVectorVar": "leftHandPoleReferenceVector", "poleVectorVar": "leftHandPoleVector" - }, - { - "jointName": "Spine2", - "positionVar": "spine2Position", - "rotationVar": "spine2Rotation", - "typeVar": "spine2Type", - "weightVar": "spine2Weight", - "weight": 2.0, - "flexCoefficients": [ 1.0, 0.5, 0.25 ] - }, - { - "jointName": "Head", - "positionVar": "headPosition", - "rotationVar": "headRotation", - "typeVar": "spine2Type", - "weightVar": "headWeight", - "weight": 4.0, - "flexCoefficients": [ 1, 0.5, 0.25, 0.2, 0.1 ] } ] }, diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 2816dbcb04..2401bf5315 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4679,7 +4679,7 @@ void setupCpuMonitorThread() { void Application::idle() { PerformanceTimer perfTimer("idle"); - + qCDebug(interfaceapp) << "idle called"; // Update the deadlock watchdog updateHeartbeat(); diff --git a/interface/src/avatar/MySkeletonModel.cpp b/interface/src/avatar/MySkeletonModel.cpp index 356b365f93..e0362ef548 100644 --- a/interface/src/avatar/MySkeletonModel.cpp +++ b/interface/src/avatar/MySkeletonModel.cpp @@ -199,7 +199,7 @@ void MySkeletonModel::updateRig(float deltaTime, glm::mat4 parentTransform) { // if hips are not under direct control, estimate the hips position. if (avatarHeadPose.isValid() && !(params.primaryControllerFlags[Rig::PrimaryControllerType_Hips] & (uint8_t)Rig::ControllerFlags::Enabled)) { bool isFlying = (myAvatar->getCharacterController()->getState() == CharacterController::State::Hover || myAvatar->getCharacterController()->computeCollisionGroup() == BULLET_COLLISION_GROUP_COLLISIONLESS); - + // timescale in seconds const float TRANS_HORIZ_TIMESCALE = 0.15f; const float TRANS_VERT_TIMESCALE = 0.01f; // We want the vertical component of the hips to follow quickly to prevent spine squash/stretch. @@ -255,6 +255,9 @@ void MySkeletonModel::updateRig(float deltaTime, glm::mat4 parentTransform) { AnimPose newSpinePose(glm::mat4(glm::vec4(w, 0.0f), glm::vec4(u, 0.0f), glm::vec4(v, 0.0f), glm::vec4(glm::vec3(0.0f, 0.0f, 0.0f), 1.0f))); currentSpine2Pose.rot() = safeLerp(currentSpine2Pose.rot(), newSpinePose.rot(), SPINE2_ROTATION_FILTER); params.primaryControllerPoses[Rig::PrimaryControllerType_Spine2] = currentSpine2Pose; + qCDebug(interfaceapp) << "finding the spine 2 azimuth"; + qCDebug(interfaceapp) << currentSpine2Pose; + params.primaryControllerFlags[Rig::PrimaryControllerType_Spine2] = (uint8_t)Rig::ControllerFlags::Enabled | (uint8_t)Rig::ControllerFlags::Estimated; } } diff --git a/libraries/animation/src/AnimSplineIK.cpp b/libraries/animation/src/AnimSplineIK.cpp index 442112e8f0..6f1c15d0f9 100644 --- a/libraries/animation/src/AnimSplineIK.cpp +++ b/libraries/animation/src/AnimSplineIK.cpp @@ -53,7 +53,21 @@ const AnimPoseVec& AnimSplineIK::evaluate(const AnimVariantMap& animVars, const AnimPoseVec absolutePoses; absolutePoses.resize(_poses.size()); computeAbsolutePoses(absolutePoses); + AnimPoseVec absolutePoses2; + absolutePoses2.resize(_poses.size()); + // do this later + computeAbsolutePoses(absolutePoses2); + int jointIndex2 = _skeleton->nameToJointIndex("Spine2"); + AnimPose origSpine2PoseAbs = _skeleton->getAbsolutePose(jointIndex2, _poses); + if ((jointIndex2 != -1) && (_poses.size() > 0)) { + AnimPose origSpine2 = _skeleton->getAbsolutePose(jointIndex2, _poses); + AnimPose origSpine1 = _skeleton->getAbsolutePose(_skeleton->nameToJointIndex("Spine1"),_poses); + //origSpine2PoseRel = origSpine1.inverse() * origSpine2; + //qCDebug(animation) << "origSpine2Pose: " << origSpine2Pose.rot(); + qCDebug(animation) << "original relative spine2 " << origSpine2PoseAbs; + } + IKTarget target; int jointIndex = _skeleton->nameToJointIndex("Head"); if (jointIndex != -1) { @@ -64,30 +78,92 @@ const AnimPoseVec& AnimSplineIK::evaluate(const AnimVariantMap& animVars, const glm::vec3 translation = animVars.lookupRigToGeometry("headPosition", absPose.trans()); float weight = animVars.lookup("headWeight", "4.0"); + //qCDebug(animation) << "target 1 rotation absolute" << rotation; target.setPose(rotation, translation); target.setWeight(weight); const float* flexCoefficients = new float[5]{ 1.0f, 0.5f, 0.25f, 0.2f, 0.1f }; - target.setFlexCoefficients(4, flexCoefficients); + target.setFlexCoefficients(5, flexCoefficients); // record the index of the hips ik target. if (target.getIndex() == _hipsIndex) { _hipsTargetIndex = 1; } } + + AnimPose origAbsAfterHeadSpline; + AnimPose finalSpine2; + AnimChain jointChain; if (_poses.size() > 0) { - AnimChain jointChain; + _snapshotChain.buildFromRelativePoses(_skeleton, _poses, target.getIndex()); jointChain.buildFromRelativePoses(_skeleton, _poses, target.getIndex()); + // jointChain2.buildFromRelativePoses(_skeleton, _poses, target2.getIndex()); // for each target solve target with spline + //qCDebug(animation) << "before head spline"; + //jointChain.dump(); solveTargetWithSpline(context, target, absolutePoses, false, jointChain); + AnimPose afterSolveSpine2 = jointChain.getAbsolutePoseFromJointIndex(jointIndex2); + AnimPose afterSolveSpine1 = jointChain.getAbsolutePoseFromJointIndex(_skeleton->nameToJointIndex("Spine1")); + AnimPose afterSolveSpine2Rel = afterSolveSpine1.inverse() * afterSolveSpine2; + AnimPose originalSpine2Relative = afterSolveSpine1.inverse() * origSpine2PoseAbs; + glm::quat rotation3 = animVars.lookupRigToGeometry("spine2Rotation", afterSolveSpine2.rot()); + glm::vec3 translation3 = animVars.lookupRigToGeometry("spine2Position", afterSolveSpine2.trans()); + AnimPose targetSpine2(rotation3, afterSolveSpine2.trans()); + finalSpine2 = afterSolveSpine1.inverse() * targetSpine2; - // qCDebug(animation) << "AnimSpline Joint chain length " << jointChain.size(); - // jointChain.dump(); + qCDebug(animation) << "relative spine2 after solve" << afterSolveSpine2Rel; + qCDebug(animation) << "relative spine2 orig" << originalSpine2Relative; + AnimPose latestSpine2Relative(originalSpine2Relative.rot(), afterSolveSpine2Rel.trans()); + //jointChain.setRelativePoseAtJointIndex(jointIndex2, finalSpine2); jointChain.outputRelativePoses(_poses); + //qCDebug(animation) << "after head spline"; + //jointChain.dump(); + + //computeAbsolutePoses(absolutePoses2); + origAbsAfterHeadSpline = _skeleton->getAbsolutePose(jointIndex2, _poses); + // qCDebug(animation) << "Spine2 trans after head spline: " << origAbsAfterHeadSpline.trans(); + + } + + IKTarget target2; + //int jointIndex2 = _skeleton->nameToJointIndex("Spine2"); + if (jointIndex2 != -1) { + target2.setType(animVars.lookup("spine2Type", (int)IKTarget::Type::RotationAndPosition)); + target2.setIndex(jointIndex2); + AnimPose absPose2 = _skeleton->getAbsolutePose(jointIndex2, _poses); + glm::quat rotation2 = animVars.lookupRigToGeometry("spine2Rotation", absPose2.rot()); + glm::vec3 translation2 = animVars.lookupRigToGeometry("spine2Position", absPose2.trans()); + float weight2 = animVars.lookup("spine2Weight", "2.0"); + qCDebug(animation) << "rig to geometry" << rotation2; + + target2.setPose(rotation2, translation2); + target2.setPose(finalSpine2.rot(), finalSpine2.trans()); + target2.setWeight(weight2); + const float* flexCoefficients2 = new float[3]{ 1.0f, 0.5f, 0.25f }; + target2.setFlexCoefficients(3, flexCoefficients2); + + + } + AnimChain jointChain2; + if (_poses.size() > 0) { + + // _snapshotChain.buildFromRelativePoses(_skeleton, _poses, target.getIndex()); + // jointChain.buildFromRelativePoses(_skeleton, _poses, target.getIndex()); + // jointChain2.buildFromRelativePoses(_skeleton, underPoses, target2.getIndex()); + jointChain2.buildFromRelativePoses(_skeleton, _poses, target2.getIndex()); + + // for each target solve target with spline + solveTargetWithSpline(context, target2, absolutePoses2, false, jointChain2); + + //jointChain.outputRelativePoses(_poses); + jointChain2.outputRelativePoses(_poses); + //qCDebug(animation) << "Spine2 spline"; + //jointChain2.dump(); + //qCDebug(animation) << "Spine2Pose trans after spine2 spline: " << _skeleton->getAbsolutePose(jointIndex2, _poses).trans(); } - + const float FRAMES_PER_SECOND = 30.0f; _interpAlphaVel = FRAMES_PER_SECOND / _interpDuration; _alpha = _interpAlphaVel * dt;