Browse Source

[csharp] port of bugfix commit 5cab7e9: Fixed 1-bone IK for transform mode noRotationOrReflection when skeleton scale is applied.

Harald Csaszar 5 years ago
parent
commit
85dd60bf57
1 changed files with 9 additions and 11 deletions
  1. 9 11
      spine-csharp/src/IkConstraint.cs

+ 9 - 11
spine-csharp/src/IkConstraint.cs

@@ -170,18 +170,16 @@ namespace Spine {
 					ty = targetY - bone.worldY;
 					ty = targetY - bone.worldY;
 					break;
 					break;
 				case TransformMode.NoRotationOrReflection: {
 				case TransformMode.NoRotationOrReflection: {
-                        rotationIK += (float)Math.Atan2(pc, pa) * MathUtils.RadDeg;
-                        float ps = Math.Abs(pa * pd - pb * pc) / (pa * pa + pc * pc);
-                        pb = -pc * ps;
-                        pd = pa * ps;
-                        float x = targetX - p.worldX, y = targetY - p.worldY;
-                        float d = pa * pd - pb * pc;
-                        tx = (x * pd - y * pb) / d - bone.ax;
-                        ty = (y * pa - x * pc) / d - bone.ay;
-                        break;
-                }                    
+					float s = Math.Abs(pa * pd - pb * pc) / (pa * pa + pc * pc);
+					float sa = pa / bone.skeleton.ScaleX;
+					float sc = pc / bone.skeleton.ScaleY;
+					pb = -sc * s * bone.skeleton.ScaleX;
+					pd = sa * s * bone.skeleton.ScaleY;
+					rotationIK += (float)Math.Atan2(pc, pa) * MathUtils.RadDeg;
+					goto default; // Fall through.
+                }
                 default: {
                 default: {
-                    float x = targetX - p.worldX, y = targetY - p.worldY;
+					float x = targetX - p.worldX, y = targetY - p.worldY;
                     float d = pa * pd - pb * pc;
                     float d = pa * pd - pb * pc;
                     tx = (x * pd - y * pb) / d - bone.ax;
                     tx = (x * pd - y * pb) / d - bone.ax;
                     ty = (y * pa - x * pc) / d - bone.ay;
                     ty = (y * pa - x * pc) / d - bone.ay;