lljointsolverrp3.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. /**
  2. * @file lljointsolverrp3.h
  3. * @brief Implementation of LLJointSolverRP3 class
  4. *
  5. * $LicenseInfo:firstyear=2001&license=viewergpl$
  6. *
  7. * Copyright (c) 2001-2009, Linden Research, Inc.
  8. *
  9. * Second Life Viewer Source Code
  10. * The source code in this file ("Source Code") is provided by Linden Lab
  11. * to you under the terms of the GNU General Public License, version 2.0
  12. * ("GPL"), unless you have obtained a separate licensing agreement
  13. * ("Other License"), formally executed by you and Linden Lab. Terms of
  14. * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15. * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16. *
  17. * There are special exceptions to the terms and conditions of the GPL as
  18. * it is applied to this Source Code. View the full text of the exception
  19. * in the file doc/FLOSS-exception.txt in this software distribution, or
  20. * online at
  21. * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22. *
  23. * By copying, modifying or distributing this software, you acknowledge
  24. * that you have read and understood your obligations described above,
  25. * and agree to abide by those obligations.
  26. *
  27. * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28. * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29. * COMPLETENESS OR PERFORMANCE.
  30. * $/LicenseInfo$
  31. */
  32. #ifndef LL_LLJOINTSOLVERRP3_H
  33. #define LL_LLJOINTSOLVERRP3_H
  34. #include "lljoint.h"
  35. /* ----------------------------------------------------------------------------
  36. // class LLJointSolverRP3
  37. //
  38. // This class is a "poor man's" IK for simple 3 joint kinematic chains.
  39. // It is modeled after the 'ikRPSolver' in Maya.
  40. // This class takes 4 LLJoints:
  41. // joint_a
  42. // joint_b
  43. // joint_c
  44. // joint_goal
  45. //
  46. // Such that joint_a is the parent of joint_b, joint_b is the parent of joint_c.
  47. // When invoked, this class modifies the rotations of joint_a and joint_b such
  48. // that the position of the joint_c attempts to reach the position of joint_goal.
  49. //
  50. // At object initialization time, the distances between joint_a - joint_b and
  51. // joint_b - joint_c are cached. During evaluation these bone lengths are
  52. // preserved.
  53. //
  54. // A A
  55. // | |
  56. // | |
  57. // B B---CG A---B---C...G
  58. // \
  59. // \
  60. // CG
  61. //
  62. //
  63. // In addition a "pole_vec" is specified that does two things:
  64. //
  65. // a) defines the plane in which the solution occurs, thus
  66. // reducing an infinite number of solutions, down to 2.
  67. //
  68. // b) disambiguates the resulting two solutions as follows:
  69. //
  70. // A A A--->pole_vec
  71. // | \ \
  72. // | \ \
  73. // B vs. B ==> B
  74. // \ | |
  75. // \ | |
  76. // CG CG CG
  77. //
  78. // A "twist" setting allows the solution plane to be rotated about the
  79. // line between A and C. A handy animation feature.
  80. //
  81. // For "smarter" results for non-coplanar limbs, specify the joints axis
  82. // of bend in the B's local frame (see setBAxis())
  83. // ------------------------------------------------------------------------- */
  84. class LLJointSolverRP3
  85. {
  86. public:
  87. LLJointSolverRP3();
  88. virtual ~LLJointSolverRP3() = default;
  89. // This must be called one time to setup the solver. This must be called
  90. // AFTER the skeleton has been created, all parent/child relationships are
  91. // established, and after the joints are placed in a valid configuration
  92. // (as distances between them will be cached).
  93. void setupJoints(LLJoint* joint_a, LLJoint* joint_b, LLJoint* joint_c,
  94. LLJoint* joint_goal);
  95. // Returns the current pole vector.
  96. LL_INLINE const LLVector3& getPoleVector() { return mPoleVector; }
  97. // Sets the pole vector. The pole vector is defined relative to (in the
  98. // space of) joint_a's parent. The default pole vector is (1,0,0), and this
  99. // is used if this function/ is never called. This vector is normalized
  100. // when set.
  101. LL_INLINE void setPoleVector(const LLVector3& pole_vec)
  102. {
  103. mPoleVector = pole_vec;
  104. mPoleVector.normalize();
  105. }
  106. // Sets the joint axis in B's local frame, and enable "smarter" solve().
  107. // This allows for smarter IK when for twisted limbs.
  108. LL_INLINE void setBAxis(const LLVector3& b_axis)
  109. {
  110. mBAxis = b_axis;
  111. mBAxis.normalize();
  112. mUseBAxis = true;
  113. }
  114. // Returns the current twist in radians.
  115. LL_INLINE F32 getTwist() { return mTwist; }
  116. // Sets the twist value. The default is 0.f.
  117. LL_INLINE void setTwist(F32 twist) { mTwist = twist; }
  118. // This is the "work" function. When called, the rotations of joint_a and
  119. // joint_b will be modified such that joint_c attempts to reach joint_goal.
  120. void solve();
  121. protected:
  122. LLJoint* mJointA;
  123. LLJoint* mJointB;
  124. LLJoint* mJointC;
  125. LLJoint* mJointGoal;
  126. F32 mLengthAB;
  127. F32 mLengthBC;
  128. F32 mTwist;
  129. LLVector3 mPoleVector;
  130. LLVector3 mBAxis;
  131. LLMatrix4 mSavedJointAMat;
  132. LLMatrix4 mSavedInvPlaneMat;
  133. LLQuaternion mJointABaseRotation;
  134. LLQuaternion mJointBBaseRotation;
  135. bool mUseBAxis;
  136. };
  137. #endif // LL_LLJOINTSOLVERRP3_H