228 lines
3.9 KiB
Plaintext
228 lines
3.9 KiB
Plaintext
class Foot
|
|||
|
|
{
|
||
|
|
float TranslateX, TranslateY, TranslateZ;
|
||
|
|
boolean leftLegorRight=false;
|
||
|
|
|
||
|
|
void SetFootCoordinates(PVector P)
|
||
|
|
{
|
||
|
|
Xi = P.x;
|
||
|
|
Yi = P.y;
|
||
|
|
Zi = P.z;
|
||
|
|
}
|
||
|
|
|
||
|
|
void Translate(int x, int y, int z)
|
||
|
|
{
|
||
|
|
TranslateX = x;
|
||
|
|
TranslateY = y;
|
||
|
|
TranslateZ = z;
|
||
|
|
}
|
||
|
|
|
||
|
|
void Translate(PVector i)
|
||
|
|
{
|
||
|
|
TranslateX = i.x;
|
||
|
|
TranslateY = i.y;
|
||
|
|
TranslateZ = i.z;
|
||
|
|
}
|
||
|
|
|
||
|
|
void DrawFoot()
|
||
|
|
{
|
||
|
|
setleg(leftLegorRight);
|
||
|
|
|
||
|
|
pushMatrix();
|
||
|
|
|
||
|
|
translate(TranslateX, TranslateY, TranslateZ);
|
||
|
|
|
||
|
|
stroke(!error?255:0, !error?0:255, 0);
|
||
|
|
noFill();
|
||
|
|
beginShape();
|
||
|
|
|
||
|
|
Vertex(0, 0, 0);
|
||
|
|
Vertex(0, 0, 0);
|
||
|
|
if (leftLegorRight)
|
||
|
|
Vertex(-1*X2, -1*Y2, Z2);
|
||
|
|
else
|
||
|
|
Vertex(X2, -1*Y2, Z2);
|
||
|
|
|
||
|
|
endShape();
|
||
|
|
|
||
|
|
beginShape();
|
||
|
|
|
||
|
|
if (leftLegorRight)
|
||
|
|
{
|
||
|
|
Vertex(-1*X2, -1*Y2, Z2);
|
||
|
|
Vertex(-1*X2, -1*Y2, Z2);
|
||
|
|
Vertex(-1*X, Y, -1*Z);
|
||
|
|
} else
|
||
|
|
{
|
||
|
|
Vertex(X2, -1*Y2, Z2);
|
||
|
|
Vertex(X2, -1*Y2, Z2);
|
||
|
|
Vertex(X, Y, -1*Z);
|
||
|
|
}
|
||
|
|
|
||
|
|
endShape();
|
||
|
|
|
||
|
|
popMatrix();
|
||
|
|
}
|
||
|
|
|
||
|
|
// Inverse Kinemetics Region
|
||
|
|
double l3, s, O1, O2, O3, X2, Y2, Z2;
|
||
|
|
double l1=10, l2=15;
|
||
|
|
double Xi, Yi, Zi;
|
||
|
|
double X, Y, Z;
|
||
|
|
boolean error=false;
|
||
|
|
|
||
|
|
void RotateX()
|
||
|
|
{
|
||
|
|
Y = Y * cos(radians(rotationX)) - Z * sin(radians(rotationX));
|
||
|
|
Z = Y * sin(radians(rotationX)) + Z * cos(radians(rotationX));
|
||
|
|
}
|
||
|
|
|
||
|
|
void RotateY()
|
||
|
|
{
|
||
|
|
Z = Z * cos(radians(rotationY)) - X * sin(radians(rotationY));
|
||
|
|
X = Z * sin(radians(rotationY)) + X * cos(radians(rotationY));
|
||
|
|
}
|
||
|
|
|
||
|
|
void RotateZ()
|
||
|
|
{
|
||
|
|
X = X * cos(radians(rotationZ)) - Y * sin(radians(rotationZ));
|
||
|
|
Y = X * sin(radians(rotationZ)) + Y * cos(radians(rotationZ));
|
||
|
|
}
|
||
|
|
|
||
|
|
void RL3 ()
|
||
|
|
{
|
||
|
|
double x = X;
|
||
|
|
double z = Z;
|
||
|
|
|
||
|
|
if ((x == 0) && (z == 0))
|
||
|
|
l3 = 0;
|
||
|
|
else l3 = sqrt((float)(x*x + z*z));
|
||
|
|
|
||
|
|
if (x < 0)
|
||
|
|
l3 = l3 * -1;
|
||
|
|
}
|
||
|
|
|
||
|
|
float O1 ()
|
||
|
|
{
|
||
|
|
RL3();
|
||
|
|
|
||
|
|
double x = X;
|
||
|
|
double z = Z;
|
||
|
|
double r;
|
||
|
|
|
||
|
|
if ((x != 0) & (z != 0)) {
|
||
|
|
double a = (z / x);
|
||
|
|
return atan((float)(a));
|
||
|
|
} else
|
||
|
|
return atan(0.0); // Math Error Protection.
|
||
|
|
}
|
||
|
|
|
||
|
|
double T1 ()
|
||
|
|
{
|
||
|
|
double x = X;
|
||
|
|
double y = Y;
|
||
|
|
double z = Z;
|
||
|
|
double x2 = x * x;
|
||
|
|
double y2 = y * y;
|
||
|
|
double z2 = z * z;
|
||
|
|
double l32 = l3 * l3;
|
||
|
|
|
||
|
|
s = sqrt((float)(x2 + y2 + z2));
|
||
|
|
|
||
|
|
double t1 = 0;
|
||
|
|
|
||
|
|
double s2 = s * s;
|
||
|
|
|
||
|
|
if ((y == 0) && (l3 == 0))
|
||
|
|
t1 = 0; // Math Error Protection.
|
||
|
|
else
|
||
|
|
t1 = (atan2((float)(l3), (float)(y)));
|
||
|
|
|
||
|
|
double a = (l1 * l1) - (l2*l2) + s2;
|
||
|
|
double b = 2 * l1 * s;
|
||
|
|
double t2 = acos((float)(a / b));
|
||
|
|
|
||
|
|
double ret = 0;
|
||
|
|
|
||
|
|
ret = t1 + abs((float)(t2));
|
||
|
|
|
||
|
|
return ret;
|
||
|
|
}
|
||
|
|
|
||
|
|
double T3 ()
|
||
|
|
{
|
||
|
|
return (acos((float)(((l1*l1) + (l2*l2) - (s*s)) / (2 * l1 * l2))));
|
||
|
|
}
|
||
|
|
|
||
|
|
double PI = 3.14159265;
|
||
|
|
|
||
|
|
void setleg (boolean Side)
|
||
|
|
{
|
||
|
|
X = Xi;
|
||
|
|
Y = Yi;
|
||
|
|
Z = Zi;
|
||
|
|
|
||
|
|
// Gaits
|
||
|
|
if (leftLegorRight)
|
||
|
|
{ // Right
|
||
|
|
X = (-1*X) + TranslateX;
|
||
|
|
Z = (-1*Z) + TranslateZ;
|
||
|
|
} else
|
||
|
|
{
|
||
|
|
X = Xi + TranslateX;
|
||
|
|
Z = (-1*Z) + TranslateZ;
|
||
|
|
}
|
||
|
|
|
||
|
|
RotateY();
|
||
|
|
RotateX();
|
||
|
|
RotateZ();
|
||
|
|
|
||
|
|
// Remove gaits
|
||
|
|
if (leftLegorRight)
|
||
|
|
{ // Right
|
||
|
|
X = -1 * (X - TranslateX);
|
||
|
|
Z = -1 * (Z - TranslateZ);
|
||
|
|
} else
|
||
|
|
{
|
||
|
|
X -= TranslateX;
|
||
|
|
Z = -1 * (Z - TranslateZ);
|
||
|
|
}
|
||
|
|
|
||
|
|
double a = (90 - degrees((float)(O1())));
|
||
|
|
double b = (180 - degrees((float)(T1())));
|
||
|
|
double c = degrees((float)(T3()));
|
||
|
|
|
||
|
|
if ((a >= 15) & (a <= 165)
|
||
|
|
& (b >= 15) & (b <= 165)
|
||
|
|
& (c >= 15) & (c <= 165))
|
||
|
|
{
|
||
|
|
error = false;
|
||
|
|
|
||
|
|
O1 = a;
|
||
|
|
O2 = b;
|
||
|
|
O3 = c;
|
||
|
|
|
||
|
|
double d = sin((float)(b*(PI/180)));
|
||
|
|
if ( d != 0 )
|
||
|
|
X2 = d * l1;
|
||
|
|
else
|
||
|
|
X2 = 0;
|
||
|
|
|
||
|
|
d = cos((float)(b*(PI/180)));
|
||
|
|
if ( d != 0 )
|
||
|
|
Y2 = d * l1;
|
||
|
|
else
|
||
|
|
Y2 = 0;
|
||
|
|
|
||
|
|
d = sin((float)((a-90)*(PI/180)));
|
||
|
|
if ( d != 0 )
|
||
|
|
Z2 = d * abs((float)(X2));
|
||
|
|
else
|
||
|
|
Z2 = 0;
|
||
|
|
} else
|
||
|
|
{
|
||
|
|
error = true;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|