got the spine2 rotationa and the head spline working

This commit is contained in:
amantley 2019-01-18 15:28:41 -08:00
parent e5b16ef174
commit 7777162351
4 changed files with 86 additions and 25 deletions

View file

@ -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 ]
}
]
},

View file

@ -4679,7 +4679,7 @@ void setupCpuMonitorThread() {
void Application::idle() {
PerformanceTimer perfTimer("idle");
qCDebug(interfaceapp) << "idle called";
// Update the deadlock watchdog
updateHeartbeat();

View file

@ -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;
}
}

View file

@ -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;