mirror of
https://github.com/lubosz/overte.git
synced 2025-04-24 11:43:16 +02:00
Switch additive animation deltas from a pre multiply to a post multiply.
This commit is contained in:
parent
92df5cccdc
commit
b6f28a6732
3 changed files with 11 additions and 18 deletions
|
@ -110,11 +110,9 @@ void AnimBlendLinear::evaluateAndBlendChildren(const AnimVariantMap& animVars, c
|
|||
// copy translation and scale from nextPoses
|
||||
AnimPose pose = nextPoses[i];
|
||||
|
||||
int parentIndex = _skeleton->getParentIndex((int)i);
|
||||
if (parentIndex >= 0) {
|
||||
// but transform nextPoses rot into absPrev parent frame.
|
||||
pose.rot() = glm::inverse(absPrev[parentIndex].rot()) * pose.rot() * absPrev[parentIndex].rot();
|
||||
}
|
||||
// convert from a rotation that happens in the absolute space of the joint
|
||||
// into a rotation that happens in the relative space of the joint.
|
||||
pose.rot() = glm::inverse(absPrev[i].rot()) * pose.rot() * absPrev[i].rot();
|
||||
|
||||
relOffsetPoses.push_back(pose);
|
||||
}
|
||||
|
|
|
@ -56,12 +56,12 @@ static void bakeRelativeDeltaAnim(std::vector<AnimPoseVec>& anim, const AnimPose
|
|||
// for each joint in animPoses
|
||||
for (size_t i = 0; i < animPoses.size(); ++i) {
|
||||
// convert this relative AnimPose into a delta animation.
|
||||
animPoses[i] = animPoses[i] * invBasePoses[i];
|
||||
animPoses[i] = invBasePoses[i] * animPoses[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void bakeAbsoluteDeltaAnim(std::vector<AnimPoseVec>& anim, const AnimPoseVec& basePoses, AnimSkeleton::ConstPointer skeleton, const QString& url, int baseFrame) {
|
||||
void bakeAbsoluteDeltaAnim(std::vector<AnimPoseVec>& anim, const AnimPoseVec& basePoses, AnimSkeleton::ConstPointer skeleton) {
|
||||
|
||||
// invert all the basePoses
|
||||
AnimPoseVec invBasePoses = basePoses;
|
||||
|
@ -73,7 +73,6 @@ void bakeAbsoluteDeltaAnim(std::vector<AnimPoseVec>& anim, const AnimPoseVec& ba
|
|||
skeleton->convertRelativePosesToAbsolute(absBasePoses);
|
||||
|
||||
// for each frame of the animation
|
||||
int frame = 0;
|
||||
for (auto&& animPoses : anim) {
|
||||
ASSERT(animPoses.size() == basePoses.size());
|
||||
|
||||
|
@ -81,15 +80,12 @@ void bakeAbsoluteDeltaAnim(std::vector<AnimPoseVec>& anim, const AnimPoseVec& ba
|
|||
for (size_t i = 0; i < animPoses.size(); ++i) {
|
||||
|
||||
// scale and translation are relative frame
|
||||
animPoses[i] = animPoses[i] * invBasePoses[i];
|
||||
animPoses[i] = invBasePoses[i] * animPoses[i];
|
||||
|
||||
// but transform the rotation delta into the absolute frame.
|
||||
int parentIndex = skeleton->getParentIndex((int)i);
|
||||
if (parentIndex >= 0) {
|
||||
animPoses[i].rot() = absBasePoses[parentIndex].rot() * animPoses[i].rot() * glm::inverse(absBasePoses[parentIndex].rot());
|
||||
}
|
||||
// convert from a rotation that happens in the relative space of the joint
|
||||
// into a rotation that happens in the absolute space of the joint.
|
||||
animPoses[i].rot() = absBasePoses[i].rot() * animPoses[i].rot() * glm::inverse(absBasePoses[i].rot());
|
||||
}
|
||||
frame++;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -297,7 +293,7 @@ const AnimPoseVec& AnimClip::evaluate(const AnimVariantMap& animVars, const Anim
|
|||
auto baseAnim = copyAndRetargetFromNetworkAnim(_baseNetworkAnim, _skeleton);
|
||||
|
||||
if (_blendType == AnimBlendType_AddAbsolute) {
|
||||
bakeAbsoluteDeltaAnim(_anim, baseAnim[(int)_baseFrame], _skeleton, _url, _baseFrame);
|
||||
bakeAbsoluteDeltaAnim(_anim, baseAnim[(int)_baseFrame], _skeleton);
|
||||
} else {
|
||||
// AnimBlendType_AddRelative
|
||||
bakeRelativeDeltaAnim(_anim, baseAnim[(int)_baseFrame]);
|
||||
|
|
|
@ -68,8 +68,7 @@ void blendAdd(size_t numPoses, const AnimPose* a, const AnimPose* b, float alpha
|
|||
delta = -delta;
|
||||
}
|
||||
delta = glm::lerp(identity, delta, alpha);
|
||||
result[i].rot() = glm::normalize(delta * aPose.rot());
|
||||
|
||||
result[i].rot() = glm::normalize(aPose.rot() * delta);
|
||||
result[i].trans() = aPose.trans() + (alpha * bPose.trans());
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue