humanoid_math.cpp 924 B

12345678910111213141516171819202122232425262728
  1. #include "humanoid/humanoid_math.h"
  2. #include <algorithm>
  3. #include <qvectornd.h>
  4. namespace Render::GL {
  5. auto elbow_bend_torso(const QVector3D &shoulder, const QVector3D &hand,
  6. const QVector3D &outward_dir, float along_frac,
  7. float lateral_offset, float y_bias,
  8. float outward_sign) -> QVector3D {
  9. QVector3D dir = hand - shoulder;
  10. float const dist = std::max(dir.length(), 1e-5F);
  11. dir /= dist;
  12. QVector3D lateral = outward_dir - dir * QVector3D::dotProduct(outward_dir, dir);
  13. if (lateral.lengthSquared() < 1e-8F) {
  14. lateral = QVector3D::crossProduct(dir, QVector3D(0, 1, 0));
  15. }
  16. if (QVector3D::dotProduct(lateral, outward_dir) < 0.0F) {
  17. lateral = -lateral;
  18. }
  19. lateral.normalize();
  20. return shoulder + dir * (dist * along_frac) +
  21. lateral * (lateral_offset * outward_sign) + QVector3D(0, y_bias, 0);
  22. }
  23. } // namespace Render::GL