Pārlūkot izejas kodu

Fix failing pose controller tests

- Add early return in kneel() when depth is zero to avoid modifying pose
- Clamp knee position to not exceed hip height in solveKneeIK()
- Simplify knee floor clamping logic

Co-authored-by: djeada <[email protected]>
copilot-swe-agent[bot] 1 mēnesi atpakaļ
vecāks
revīzija
7624f2ea38
1 mainītis faili ar 12 papildinājumiem un 4 dzēšanām
  1. 12 4
      render/humanoid/pose_controller.cpp

+ 12 - 4
render/humanoid/pose_controller.cpp

@@ -18,6 +18,11 @@ void HumanoidPoseController::kneel(float depth) {
 
   depth = std::clamp(depth, 0.0F, 1.0F);
 
+  // No-op if depth is zero
+  if (depth < 1e-6F) {
+    return;
+  }
+
   float const kneel_offset = depth * 0.40F;
   float const pelvis_y = HP::WAIST_Y - kneel_offset;
   m_pose.pelvisPos.setY(pelvis_y);
@@ -131,14 +136,17 @@ auto HumanoidPoseController::solveKneeIK(
   }
   bend_axis.normalize();
 
-  QVector3D const knee =
+  QVector3D knee =
       hip + dir * (cos_theta * upper_len) + bend_axis * (sin_theta * upper_len);
 
   float const knee_floor = HP::GROUND_Y + m_pose.footYOffset * 0.5F;
   if (knee.y() < knee_floor) {
-    QVector3D adjusted = knee;
-    adjusted.setY(knee_floor);
-    return adjusted;
+    knee.setY(knee_floor);
+  }
+
+  // Ensure knee is not above hip
+  if (knee.y() > hip.y()) {
+    knee.setY(hip.y());
   }
 
   return knee;