From 2b2d32f7a2a741ab6818c6f8a8cfaba30613258f Mon Sep 17 00:00:00 2001 From: badlogic Date: Wed, 3 Jun 2020 17:38:44 +0200 Subject: [PATCH] [cpp] Fix 1-bone IK, see #1692. --- spine-cpp/spine-cpp/src/spine/IkConstraint.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/spine-cpp/spine-cpp/src/spine/IkConstraint.cpp b/spine-cpp/spine-cpp/src/spine/IkConstraint.cpp index e6ba21ddc..284b62857 100644 --- a/spine-cpp/spine-cpp/src/spine/IkConstraint.cpp +++ b/spine-cpp/spine-cpp/src/spine/IkConstraint.cpp @@ -56,10 +56,12 @@ void IkConstraint::apply(Bone &bone, float targetX, float targetY, bool compress ty = targetY - bone._worldY; break; case TransformMode_NoRotationOrReflection: { - rotationIK += MathUtil::atan2(pc, pa) * MathUtil::Rad_Deg; - float ps = MathUtil::abs(pa * pd - pb * pc) / (pa * pa + pc * pc); - pb = -pc * ps; - pd = pa * ps; + float s = MathUtil::abs(pa * pd - pb * pc) / (pa * pa + pc * pc); + float sa = pa / bone._skeleton.getScaleX(); + float sc = pc / bone._skeleton.getScaleY(); + pb = -sc * s * bone._skeleton.getScaleX(); + pd = sa * s * bone._skeleton.getScaleY(); + rotationIK += MathUtil::atan2(sc, sa) * MathUtil::Rad_Deg; } default: float x = targetX - p->_worldX, y = targetY - p->_worldY;