mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2025-12-22 18:26:12 +08:00
[csharp] Use native Math lib for IK accuracy.
This commit is contained in:
parent
a8f1159934
commit
8cde9cffd1
@ -87,7 +87,7 @@ namespace Spine {
|
||||
float id = 1 / (p.a * p.d - p.b * p.c);
|
||||
float x = targetX - p.worldX, y = targetY - p.worldY;
|
||||
float tx = (x * p.d - y * p.b) * id - bone.ax, ty = (y * p.a - x * p.c) * id - bone.ay;
|
||||
float rotationIK = MathUtils.Atan2(ty, tx) * MathUtils.RadDeg - bone.ashearX - bone.arotation;
|
||||
float rotationIK = (float)Math.Atan2(ty, tx) * MathUtils.RadDeg - bone.ashearX - bone.arotation;
|
||||
if (bone.ascaleX < 0) rotationIK += 180;
|
||||
if (rotationIK > 180)
|
||||
rotationIK -= 360;
|
||||
@ -156,12 +156,12 @@ namespace Spine {
|
||||
else if (cos > 1) cos = 1;
|
||||
a2 = (float)Math.Acos(cos) * bendDir;
|
||||
a = l1 + l2 * cos;
|
||||
b = l2 * MathUtils.Sin(a2);
|
||||
a1 = MathUtils.Atan2(ty * a - tx * b, tx * a + ty * b);
|
||||
b = l2 * (float)Math.Sin(a2);
|
||||
a1 = (float)Math.Atan2(ty * a - tx * b, tx * a + ty * b);
|
||||
} else {
|
||||
a = psx * l2;
|
||||
b = psy * l2;
|
||||
float aa = a * a, bb = b * b, dd = tx * tx + ty * ty, ta = MathUtils.Atan2(ty, tx);
|
||||
float aa = a * a, bb = b * b, dd = tx * tx + ty * ty, ta = (float)Math.Atan2(ty, tx);
|
||||
c = bb * l1 * l1 + aa * dd - aa * bb;
|
||||
float c1 = -2 * bb * l1, c2 = bb - aa;
|
||||
d = c1 * c1 - 4 * c2 * c;
|
||||
@ -173,8 +173,8 @@ namespace Spine {
|
||||
float r = Math.Abs(r0) < Math.Abs(r1) ? r0 : r1;
|
||||
if (r * r <= dd) {
|
||||
y = (float)Math.Sqrt(dd - r * r) * bendDir;
|
||||
a1 = ta - MathUtils.Atan2(y, r);
|
||||
a2 = MathUtils.Atan2(y / psy, (r - l1) / psx);
|
||||
a1 = ta - (float)Math.Atan2(y, r);
|
||||
a2 = (float)Math.Atan2(y / psy, (r - l1) / psx);
|
||||
goto outer;
|
||||
}
|
||||
}
|
||||
@ -190,13 +190,13 @@ namespace Spine {
|
||||
x = l1 - a;
|
||||
d = x * x;
|
||||
if (d < minDist) {
|
||||
minAngle = MathUtils.PI;
|
||||
minAngle = (float)Math.PI;
|
||||
minDist = d;
|
||||
minX = x;
|
||||
}
|
||||
float angle = (float)Math.Acos(-a * l1 / (aa - bb));
|
||||
x = a * MathUtils.Cos(angle) + l1;
|
||||
y = b * MathUtils.Sin(angle);
|
||||
x = a * (float)Math.Cos(angle) + l1;
|
||||
y = b * (float)Math.Sin(angle);
|
||||
d = x * x + y * y;
|
||||
if (d < minDist) {
|
||||
minAngle = angle;
|
||||
@ -211,15 +211,15 @@ namespace Spine {
|
||||
maxY = y;
|
||||
}
|
||||
if (dd <= (minDist + maxDist) / 2) {
|
||||
a1 = ta - MathUtils.Atan2(minY * bendDir, minX);
|
||||
a1 = ta - (float)Math.Atan2(minY * bendDir, minX);
|
||||
a2 = minAngle * bendDir;
|
||||
} else {
|
||||
a1 = ta - MathUtils.Atan2(maxY * bendDir, maxX);
|
||||
a1 = ta - (float)Math.Atan2(maxY * bendDir, maxX);
|
||||
a2 = maxAngle * bendDir;
|
||||
}
|
||||
}
|
||||
outer:
|
||||
float os = MathUtils.Atan2(cy, cx) * s2;
|
||||
float os = (float)Math.Atan2(cy, cx) * s2;
|
||||
float rotation = parent.arotation;
|
||||
a1 = (a1 - os) * MathUtils.RadDeg + os1 - rotation;
|
||||
if (a1 > 180)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user