mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-16 10:48:58 +02:00
working on the two bone ik for the hands
This commit is contained in:
parent
7115796fc4
commit
3a2697fa8c
2 changed files with 2262 additions and 45 deletions
2213
interface/resources/avatar/avatar-animation_twoboneIK.json
Normal file
2213
interface/resources/avatar/avatar-animation_twoboneIK.json
Normal file
File diff suppressed because it is too large
Load diff
|
@ -52,11 +52,11 @@ const AnimPoseVec& AnimSplineIK::evaluate(const AnimVariantMap& animVars, const
|
|||
// check to see if we actually need absolute poses.
|
||||
AnimPoseVec absolutePoses;
|
||||
absolutePoses.resize(_poses.size());
|
||||
//computeAbsolutePoses(absolutePoses);
|
||||
computeAbsolutePoses(absolutePoses);
|
||||
AnimPoseVec absolutePoses2;
|
||||
absolutePoses2.resize(_poses.size());
|
||||
// do this later
|
||||
computeAbsolutePoses(absolutePoses2);
|
||||
//computeAbsolutePoses(absolutePoses2);
|
||||
|
||||
int jointIndex2 = _skeleton->nameToJointIndex("Spine2");
|
||||
AnimPose origSpine2PoseAbs = _skeleton->getAbsolutePose(jointIndex2, _poses);
|
||||
|
@ -68,44 +68,7 @@ const AnimPoseVec& AnimSplineIK::evaluate(const AnimVariantMap& animVars, const
|
|||
qCDebug(animation) << "original relative spine2 " << origSpine2PoseAbs;
|
||||
}
|
||||
|
||||
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(targetSpine2.rot(), targetSpine2.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);
|
||||
computeAbsolutePoses(absolutePoses);
|
||||
//qCDebug(animation) << "Spine2 spline";
|
||||
//jointChain2.dump();
|
||||
//qCDebug(animation) << "Spine2Pose trans after spine2 spline: " << _skeleton->getAbsolutePose(jointIndex2, _poses).trans();
|
||||
|
||||
}
|
||||
|
||||
|
||||
IKTarget target;
|
||||
int jointIndex = _skeleton->nameToJointIndex("Head");
|
||||
|
@ -158,9 +121,9 @@ const AnimPoseVec& AnimSplineIK::evaluate(const AnimVariantMap& animVars, const
|
|||
AnimPose latestSpine2Relative(originalSpine2Relative.rot(), afterSolveSpine2Rel.trans());
|
||||
//jointChain.setRelativePoseAtJointIndex(jointIndex2, finalSpine2);
|
||||
jointChain.outputRelativePoses(_poses);
|
||||
_poses[_headIndex] = jointChain.getRelativePoseAtJointIndex(_headIndex);
|
||||
_poses[_skeleton->nameToJointIndex("Neck")] = jointChain.getRelativePoseAtJointIndex(_skeleton->nameToJointIndex("Neck"));
|
||||
_poses[_spine2Index] = jointChain.getRelativePoseAtJointIndex(_spine2Index);
|
||||
//_poses[_headIndex] = jointChain.getRelativePoseAtJointIndex(_headIndex);
|
||||
//_poses[_skeleton->nameToJointIndex("Neck")] = jointChain.getRelativePoseAtJointIndex(_skeleton->nameToJointIndex("Neck"));
|
||||
//_poses[_spine2Index] = jointChain.getRelativePoseAtJointIndex(_spine2Index);
|
||||
|
||||
//custom output code for the head. just do the head neck and spine2
|
||||
|
||||
|
@ -168,11 +131,50 @@ const AnimPoseVec& AnimSplineIK::evaluate(const AnimVariantMap& animVars, const
|
|||
//qCDebug(animation) << "after head spline";
|
||||
//jointChain.dump();
|
||||
|
||||
//computeAbsolutePoses(absolutePoses2);
|
||||
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(targetSpine2.rot(), targetSpine2.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);
|
||||
//computeAbsolutePoses(absolutePoses);
|
||||
//qCDebug(animation) << "Spine2 spline";
|
||||
//jointChain2.dump();
|
||||
//qCDebug(animation) << "Spine2Pose trans after spine2 spline: " << _skeleton->getAbsolutePose(jointIndex2, _poses).trans();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -246,7 +248,7 @@ static CubicHermiteSplineFunctorWithArcLength computeSplineFromTipAndBase(const
|
|||
void AnimSplineIK::solveTargetWithSpline(const AnimContext& context, const IKTarget& target, const AnimPoseVec& absolutePoses, bool debug, AnimChain& chainInfoOut) const {
|
||||
|
||||
const int baseIndex = _hipsIndex;
|
||||
const int headBaseIndex = _spine2Index;
|
||||
const int headBaseIndex = _spine2Index;
|
||||
|
||||
// build spline from tip to base
|
||||
AnimPose tipPose = AnimPose(glm::vec3(1.0f), target.getRotation(), target.getTranslation());
|
||||
|
@ -369,6 +371,7 @@ void AnimSplineIK::computeAndCacheSplineJointInfosForIKTarget(const AnimContext&
|
|||
AnimPose tipPose = _skeleton->getAbsoluteDefaultPose(target.getIndex());
|
||||
AnimPose basePose;
|
||||
if (target.getIndex() == _headIndex) {
|
||||
//basePose = _skeleton->getAbsoluteDefaultPose(_hipsIndex);
|
||||
basePose = _skeleton->getAbsoluteDefaultPose(_spine2Index);
|
||||
} else {
|
||||
basePose = _skeleton->getAbsoluteDefaultPose(_hipsIndex);
|
||||
|
@ -396,6 +399,7 @@ void AnimSplineIK::computeAndCacheSplineJointInfosForIKTarget(const AnimContext&
|
|||
int endIndex;
|
||||
if (target.getIndex() == _headIndex) {
|
||||
endIndex = _skeleton->getParentIndex(_spine2Index);
|
||||
// endIndex = _skeleton->getParentIndex(_hipsIndex);
|
||||
} else {
|
||||
endIndex = _skeleton->getParentIndex(_hipsIndex);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue