diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PhysicsConstraint.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PhysicsConstraint.java index d6229d374..a21a32085 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PhysicsConstraint.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PhysicsConstraint.java @@ -39,10 +39,10 @@ public class PhysicsConstraint extends Constraint 0, y = data.y > 0, rotateOrShearX = data.rotate > 0 || data.shearX > 0, scaleX = data.scaleX > 0; BonePose bone = this.bone; - float l = bone.bone.data.length; + float l = bone.bone.data.length, t = data.step, z = 0; switch (physics) { case none: @@ -116,8 +120,8 @@ public class PhysicsConstraint extends Constraint= t) { d = (float)Math.pow(pose.damping, 60 * t); float m = pose.massInverse * t, e = pose.strength, w = pose.wind * f * skeleton.scaleX, - g = pose.gravity * f * skeleton.scaleY; + g = pose.gravity * f * skeleton.scaleY, xs = xOffset, ys = yOffset; do { if (x) { xVelocity += (w - xOffset * e) * m; @@ -147,13 +151,16 @@ public class PhysicsConstraint extends Constraint= t); + xLag = xOffset - xs; + yLag = yOffset - ys; } - if (x) bone.worldX += xOffset * mix * data.x; - if (y) bone.worldY += yOffset * mix * data.y; - } + z = Math.max(0, 1 - a / t); + if (x) bone.worldX += (xOffset - xLag * z) * mix * data.x; + if (y) bone.worldY += (yOffset - yLag * z) * mix * data.y; + } else + z = Math.max(0, 1 - a / t); if (rotateOrShearX || scaleX) { - float ca = atan2(bone.c, bone.a), c, s, mr = 0; - float dx = cx - bone.worldX, dy = cy - bone.worldY; + float ca = atan2(bone.c, bone.a), c, s, mr = 0, dx = cx - bone.worldX, dy = cy - bone.worldY; if (dx > qx) dx = qx; else if (dx < -qx) // @@ -162,11 +169,12 @@ public class PhysicsConstraint extends Constraint 0) scaleOffset += (dx * c + dy * s) * i / r; } - a = remaining; if (a >= t) { if (d == -1) d = (float)Math.pow(pose.damping, 60 * t); - float m = pose.massInverse * t, e = pose.strength, w = pose.wind, g = pose.gravity, h = l / f; + float m = pose.massInverse * t, e = pose.strength, w = pose.wind, g = pose.gravity, h = l / f, + rs = rotateOffset, ss = scaleOffset; while (true) { a -= t; if (scaleX) { @@ -201,6 +209,8 @@ public class PhysicsConstraint extends Constraint 0) { float r = 0; if (data.rotate > 0) { @@ -244,7 +255,7 @@ public class PhysicsConstraint extends Constraint