[c] Fix 1-bone IK, see #1692.

This commit is contained in:
badlogic 2020-06-03 17:36:42 +02:00
parent dcc6925e90
commit 93d78523c4

View File

@ -72,7 +72,7 @@ void spIkConstraint_apply1 (spBone* bone, float targetX, float targetY, int /*bo
spBone* p = bone->parent;
float pa = p->a, pb = p->b, pc = p->c, pd = p->d;
float rotationIK = -bone->ashearX - bone->arotation;
float tx = 0, ty = 0, sx = 0, sy = 0, s = 0;
float tx = 0, ty = 0, sx = 0, sy = 0, s = 0, sa = 0, sc = 0;
if (!bone->appliedValid) spBone_updateAppliedTransform(bone);
switch(bone->data->transformMode) {
@ -81,11 +81,12 @@ void spIkConstraint_apply1 (spBone* bone, float targetX, float targetY, int /*bo
ty = targetY - bone->worldY;
break;
case SP_TRANSFORMMODE_NOROTATIONORREFLECTION: {
float ps;
rotationIK += ATAN2(pc, pa) * RAD_DEG;
ps = ABS(pa * pd - pb * pc) / (pa * pa + pc * pc);
pb = -pc * ps;
pd = pa * ps;
s = ABS(pa * pd - pb * pc) / (pa * pa + pc * pc);
sa = pa / bone->skeleton->scaleX;
sc = pc / bone->skeleton->scaleY;
pb = -sc * s * bone->skeleton->scaleX;
pd = sa * s * bone->skeleton->scaleY;
rotationIK += ATAN2(sc, sa) * RAD_DEG;
}
default: {
float x = targetX - p->worldX, y = targetY - p->worldY;