i was trying to make a 2d stickman that moves with physics
my main problem is with leg placement in the idle state
i tried to use inverse kinematics
my question is basically
is this a correct way todo it
it feels too mathematical
it works but i cant rewrite the code and i will prob forget how it worked after a few days
and i used alot of chatgpt
the red dot is basically the place that the foot’s supposed to be
i can change it’s position now and the upper/lower leg will position it self accordingly
it feels very over engineered
maybe im just dumb
Vector2 leftHip = leftHipJoint.transform.TransformPoint(leftHipJoint.anchor);
Vector2 leftTarget = leftFootTarget.position;
float leftDistance = Vector2.Distance(leftHip, leftTarget);
float leftKneeForward = (leftUpperLength * leftUpperLength + leftDistance * leftDistance - leftLowerLength * leftLowerLength) / (2f * leftDistance);
float leftKneeSide = Mathf.Sqrt(leftUpperLength * leftUpperLength - leftKneeForward * leftKneeForward);
Vector2 leftDirection = (leftTarget - leftHip).normalized;
Vector2 leftPerpendicular = new Vector2(-leftDirection.y, leftDirection.x);
Vector2 leftKneeTarget = leftHip + leftDirection * leftKneeForward + leftPerpendicular * leftKneeSide;
// Right leg
Vector2 rightHip = rightHipJoint.transform.TransformPoint(rightHipJoint.anchor);
Vector2 rightTarget = rightFootTarget.position;
float rightDistance = Vector2.Distance(rightHip, rightTarget);
float rightKneeForward = (rightUpperLength * rightUpperLength + rightDistance * rightDistance - rightLowerLength * rightLowerLength) / (2f * rightDistance);
float rightKneeSide = Mathf.Sqrt(rightUpperLength * rightUpperLength - rightKneeForward * rightKneeForward);
Vector2 rightDirection = (rightTarget - rightHip).normalized;
Vector2 rightPerpendicular = new Vector2(-rightDirection.y, rightDirection.x);
Vector2 rightKneeTarget = rightHip + rightDirection * rightKneeForward + rightPerpendicular * rightKneeSide;
// Upper leg desired rotation
float leftUpperLegAngle = Mathf.Atan2(leftKneeTarget.y - leftHip.y, leftKneeTarget.x - leftHip.x) * Mathf.Rad2Deg;
float rightUpperLegAngle = Mathf.Atan2(rightKneeTarget.y - rightHip.y, rightKneeTarget.x - rightHip.x) * Mathf.Rad2Deg;
// Lower leg desired rotation
float leftLowerLegAngle = Mathf.Atan2(leftTarget.y - leftKneeTarget.y, leftTarget.x - leftKneeTarget.x) * Mathf.Rad2Deg;
float rightLowerLegAngle = Mathf.Atan2(rightTarget.y - rightKneeTarget.y, rightTarget.x - rightKneeTarget.x) * Mathf.Rad2Deg;
Debug.DrawLine(leftHip, leftKneeTarget, Color.red, 0.1f);
Debug.DrawLine(leftKneeTarget, leftTarget, Color.blue, 0.1f);
Debug.DrawLine(rightHip, rightKneeTarget, Color.red, 0.1f);
Debug.DrawLine(rightKneeTarget, rightTarget, Color.blue, 0.1f);```
