mirror of
https://github.com/overte-org/overte.git
synced 2025-08-06 19:59:28 +02:00
AnimInverseKinematics: fix for extra twist in lowerSpine joints.
* When computing tipPosition, for the next iteration of the CCD, use the leverArm before it's projected onto the lowerSpine twist axis. * fix for acos() that was going outside of valid domain. (-1.0, 1.0)
This commit is contained in:
parent
f932999b2c
commit
df21fffa4a
1 changed files with 3 additions and 3 deletions
|
@ -278,8 +278,8 @@ int AnimInverseKinematics::solveTargetWithCCD(const IKTarget& target, AnimPoseVe
|
||||||
if (axisLength > MIN_AXIS_LENGTH) {
|
if (axisLength > MIN_AXIS_LENGTH) {
|
||||||
// compute angle of rotation that brings tip closer to target
|
// compute angle of rotation that brings tip closer to target
|
||||||
axis /= axisLength;
|
axis /= axisLength;
|
||||||
float angle = acosf(glm::dot(leverArm, targetLine) / (glm::length(leverArm) * glm::length(targetLine)));
|
float cos_angle = std::min(std::max(glm::dot(leverArm, targetLine) / (glm::length(leverArm) * glm::length(targetLine)), -1.0f), 1.0f);
|
||||||
|
float angle = acosf(cos_angle);
|
||||||
const float MIN_ADJUSTMENT_ANGLE = 1.0e-4f;
|
const float MIN_ADJUSTMENT_ANGLE = 1.0e-4f;
|
||||||
if (angle > MIN_ADJUSTMENT_ANGLE) {
|
if (angle > MIN_ADJUSTMENT_ANGLE) {
|
||||||
// reduce angle by a fraction (for stability)
|
// reduce angle by a fraction (for stability)
|
||||||
|
@ -348,7 +348,7 @@ int AnimInverseKinematics::solveTargetWithCCD(const IKTarget& target, AnimPoseVe
|
||||||
}
|
}
|
||||||
|
|
||||||
// keep track of tip's new transform as we descend towards root
|
// keep track of tip's new transform as we descend towards root
|
||||||
tipPosition = jointPosition + deltaRotation * leverArm;
|
tipPosition = jointPosition + deltaRotation * (tipPosition - jointPosition);
|
||||||
tipOrientation = glm::normalize(deltaRotation * tipOrientation);
|
tipOrientation = glm::normalize(deltaRotation * tipOrientation);
|
||||||
tipParentOrientation = glm::normalize(deltaRotation * tipParentOrientation);
|
tipParentOrientation = glm::normalize(deltaRotation * tipParentOrientation);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue