# Inverse Kinematics problem

**URL:** <https://discussions.unity.com/t/inverse-kinematics-problem/1735805>\
**Category:** Physics\
**Tags:** Question, 6.0\
**Created:** [September 5, 2026, 8:56pm UTC](https://discussions.unity.com/t/inverse-kinematics-problem/1735805 "2026-09-05T20:56:52Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![mostafamhazem](https://avatars.discourse-cdn.com/v4/letter/m/f0a364/32.png) [@mostafamhazem](https://discussions.unity.com/u/mostafamhazem)\
**Post date:** [September 5, 2026, 8:56pm UTC](https://discussions.unity.com/t/inverse-kinematics-problem/1735805/1 "2026-09-05T20:56:52Z")

</div>

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

 ![image](https://europe1.discourse-cdn.com/unity/original/4X/4/a/6/4a610fbb01f038f17d59d1cbdfe0907e04dcc8d3.png)

````auto
 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);```
````
