mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 23:36:44 +02:00
Added animVar support for IK solutionSource.
This commit is contained in:
parent
2166d8c159
commit
84aa86b464
5 changed files with 52 additions and 5 deletions
|
@ -49,6 +49,8 @@
|
||||||
"id": "ik",
|
"id": "ik",
|
||||||
"type": "inverseKinematics",
|
"type": "inverseKinematics",
|
||||||
"data": {
|
"data": {
|
||||||
|
"solutionSource": "relaxToUnderPoses",
|
||||||
|
"solutionSourceVar": "solutionSource",
|
||||||
"targets": [
|
"targets": [
|
||||||
{
|
{
|
||||||
"jointName": "Hips",
|
"jointName": "Hips",
|
||||||
|
|
|
@ -399,6 +399,9 @@ const AnimPoseVec& AnimInverseKinematics::evaluate(const AnimVariantMap& animVar
|
||||||
//virtual
|
//virtual
|
||||||
const AnimPoseVec& AnimInverseKinematics::overlay(const AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut, const AnimPoseVec& underPoses) {
|
const AnimPoseVec& AnimInverseKinematics::overlay(const AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut, const AnimPoseVec& underPoses) {
|
||||||
|
|
||||||
|
// allows solutionSource to be overridden by an animVar
|
||||||
|
auto solutionSource = animVars.lookup(_solutionSourceVar, (int)_solutionSource);
|
||||||
|
|
||||||
if (context.getEnableDebugDrawIKConstraints()) {
|
if (context.getEnableDebugDrawIKConstraints()) {
|
||||||
debugDrawConstraints(context);
|
debugDrawConstraints(context);
|
||||||
}
|
}
|
||||||
|
@ -414,7 +417,7 @@ const AnimPoseVec& AnimInverseKinematics::overlay(const AnimVariantMap& animVars
|
||||||
|
|
||||||
PROFILE_RANGE_EX(simulation_animation, "ik/relax", 0xffff00ff, 0);
|
PROFILE_RANGE_EX(simulation_animation, "ik/relax", 0xffff00ff, 0);
|
||||||
|
|
||||||
initRelativePosesFromSolutionSource(underPoses);
|
initRelativePosesFromSolutionSource((SolutionSource)solutionSource, underPoses);
|
||||||
|
|
||||||
if (!underPoses.empty()) {
|
if (!underPoses.empty()) {
|
||||||
// Sometimes the underpose itself can violate the constraints. Rather than
|
// Sometimes the underpose itself can violate the constraints. Rather than
|
||||||
|
@ -1135,8 +1138,8 @@ void AnimInverseKinematics::relaxToPoses(const AnimPoseVec& poses) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AnimInverseKinematics::initRelativePosesFromSolutionSource(const AnimPoseVec& underPoses) {
|
void AnimInverseKinematics::initRelativePosesFromSolutionSource(SolutionSource solutionSource, const AnimPoseVec& underPoses) {
|
||||||
switch (_solutionSource) {
|
switch (solutionSource) {
|
||||||
default:
|
default:
|
||||||
case SolutionSource::RelaxToUnderPoses:
|
case SolutionSource::RelaxToUnderPoses:
|
||||||
relaxToPoses(underPoses);
|
relaxToPoses(underPoses);
|
||||||
|
|
|
@ -48,10 +48,12 @@ public:
|
||||||
RelaxToLimitCenterPoses,
|
RelaxToLimitCenterPoses,
|
||||||
PreviousSolution,
|
PreviousSolution,
|
||||||
UnderPoses,
|
UnderPoses,
|
||||||
LimitCenterPoses
|
LimitCenterPoses,
|
||||||
|
NumSolutionSources,
|
||||||
};
|
};
|
||||||
|
|
||||||
void setSolutionSource(SolutionSource solutionSource) { _solutionSource = solutionSource; }
|
void setSolutionSource(SolutionSource solutionSource) { _solutionSource = solutionSource; }
|
||||||
|
void setSolutionSourceVar(const QString& solutionSourceVar) { _solutionSourceVar = solutionSourceVar; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void computeTargets(const AnimVariantMap& animVars, std::vector<IKTarget>& targets, const AnimPoseVec& underPoses);
|
void computeTargets(const AnimVariantMap& animVars, std::vector<IKTarget>& targets, const AnimPoseVec& underPoses);
|
||||||
|
@ -59,7 +61,7 @@ protected:
|
||||||
int solveTargetWithCCD(const IKTarget& target, AnimPoseVec& absolutePoses);
|
int solveTargetWithCCD(const IKTarget& target, AnimPoseVec& absolutePoses);
|
||||||
virtual void setSkeletonInternal(AnimSkeleton::ConstPointer skeleton) override;
|
virtual void setSkeletonInternal(AnimSkeleton::ConstPointer skeleton) override;
|
||||||
void debugDrawConstraints(const AnimContext& context) const;
|
void debugDrawConstraints(const AnimContext& context) const;
|
||||||
void initRelativePosesFromSolutionSource(const AnimPoseVec& underPose);
|
void initRelativePosesFromSolutionSource(SolutionSource solutionSource, const AnimPoseVec& underPose);
|
||||||
void relaxToPoses(const AnimPoseVec& poses);
|
void relaxToPoses(const AnimPoseVec& poses);
|
||||||
|
|
||||||
// for AnimDebugDraw rendering
|
// for AnimDebugDraw rendering
|
||||||
|
@ -116,6 +118,7 @@ protected:
|
||||||
float _maxErrorOnLastSolve { FLT_MAX };
|
float _maxErrorOnLastSolve { FLT_MAX };
|
||||||
bool _previousEnableDebugIKTargets { false };
|
bool _previousEnableDebugIKTargets { false };
|
||||||
SolutionSource _solutionSource { SolutionSource::RelaxToUnderPoses };
|
SolutionSource _solutionSource { SolutionSource::RelaxToUnderPoses };
|
||||||
|
QString _solutionSourceVar;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // hifi_AnimInverseKinematics_h
|
#endif // hifi_AnimInverseKinematics_h
|
||||||
|
|
|
@ -352,6 +352,23 @@ static AnimOverlay::BoneSet stringToBoneSetEnum(const QString& str) {
|
||||||
return AnimOverlay::NumBoneSets;
|
return AnimOverlay::NumBoneSets;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char* solutionSourceStrings[AnimInverseKinematics::SolutionSource::NumSolutionSources] = {
|
||||||
|
"relaxToUnderPoses",
|
||||||
|
"relaxToLimitCenterPoses",
|
||||||
|
"previousSolution",
|
||||||
|
"underPoses",
|
||||||
|
"limitCenterPoses"
|
||||||
|
};
|
||||||
|
|
||||||
|
static AnimInverseKinematics::SolutionSource stringToSolutionSourceEnum(const QString& str) {
|
||||||
|
for (int i = 0; i < (int)AnimInverseKinematics::SolutionSource::NumSolutionSources; i++) {
|
||||||
|
if (str == solutionSourceStrings[i]) {
|
||||||
|
return (AnimInverseKinematics::SolutionSource)i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return AnimInverseKinematics::SolutionSource::NumSolutionSources;
|
||||||
|
}
|
||||||
|
|
||||||
static AnimNode::Pointer loadOverlayNode(const QJsonObject& jsonObj, const QString& id, const QUrl& jsonUrl) {
|
static AnimNode::Pointer loadOverlayNode(const QJsonObject& jsonObj, const QString& id, const QUrl& jsonUrl) {
|
||||||
|
|
||||||
READ_STRING(boneSet, jsonObj, id, jsonUrl, nullptr);
|
READ_STRING(boneSet, jsonObj, id, jsonUrl, nullptr);
|
||||||
|
@ -457,6 +474,26 @@ AnimNode::Pointer loadInverseKinematicsNode(const QJsonObject& jsonObj, const QS
|
||||||
node->setTargetVars(jointName, positionVar, rotationVar, typeVar);
|
node->setTargetVars(jointName, positionVar, rotationVar, typeVar);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
READ_OPTIONAL_STRING(solutionSource, jsonObj);
|
||||||
|
|
||||||
|
if (!solutionSource.isEmpty()) {
|
||||||
|
qCDebug(animation) << "AJT: REMOVE solutionSource = " << solutionSource;
|
||||||
|
|
||||||
|
AnimInverseKinematics::SolutionSource solutionSourceType = stringToSolutionSourceEnum(solutionSource);
|
||||||
|
if (solutionSourceType != AnimInverseKinematics::SolutionSource::NumSolutionSources) {
|
||||||
|
node->setSolutionSource(solutionSourceType);
|
||||||
|
} else {
|
||||||
|
qCWarning(animation) << "AnimNodeLoader, bad solutionSourceType in \"solutionSource\", id = " << id << ", url = " << jsonUrl.toDisplayString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
READ_OPTIONAL_STRING(solutionSourceVar, jsonObj);
|
||||||
|
|
||||||
|
if (!solutionSourceVar.isEmpty()) {
|
||||||
|
qCDebug(animation) << "AJT: REMOVE solutionSourceVar = " << solutionSourceVar;
|
||||||
|
node->setSolutionSourceVar(solutionSourceVar);
|
||||||
|
}
|
||||||
|
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1031,10 +1031,12 @@ void Rig::updateFromHeadParameters(const HeadParameters& params, float dt) {
|
||||||
_animVars.set("notIsTalking", !params.isTalking);
|
_animVars.set("notIsTalking", !params.isTalking);
|
||||||
|
|
||||||
if (params.hipsEnabled) {
|
if (params.hipsEnabled) {
|
||||||
|
_animVars.set("solutionSource", (int)AnimInverseKinematics::SolutionSource::RelaxToCenterJointLimits);
|
||||||
_animVars.set("hipsType", (int)IKTarget::Type::RotationAndPosition);
|
_animVars.set("hipsType", (int)IKTarget::Type::RotationAndPosition);
|
||||||
_animVars.set("hipsPosition", extractTranslation(params.hipsMatrix));
|
_animVars.set("hipsPosition", extractTranslation(params.hipsMatrix));
|
||||||
_animVars.set("hipsRotation", glmExtractRotation(params.hipsMatrix));
|
_animVars.set("hipsRotation", glmExtractRotation(params.hipsMatrix));
|
||||||
} else {
|
} else {
|
||||||
|
_animVars.set("solutionSource", (int)AnimInverseKinematics::SolutionSource::RelaxToUnderPoses);
|
||||||
_animVars.set("hipsType", (int)IKTarget::Type::Unknown);
|
_animVars.set("hipsType", (int)IKTarget::Type::Unknown);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue