lljointsolverrp3.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:6k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lljointsolverrp3.h
  3.  * @brief Implementation of LLJointSolverRP3 class
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, 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. //-----------------------------------------------------------------------------
  35. // Header Files
  36. //-----------------------------------------------------------------------------
  37. #include "lljoint.h"
  38. /* -some compilers don't like line continuation chars-
  39. //-----------------------------------------------------------------------------
  40. // class LLJointSolverRP3
  41. //
  42. // This class is a "poor man's" IK for simple 3 joint kinematic chains.
  43. // It is modeled after the 'ikRPSolver' in Maya.
  44. // This class takes 4 LLJoints:
  45. //   jointA
  46. //   jointB
  47. //   jointC
  48. //   jointGoal
  49. //
  50. // Such that jointA is the parent of jointB, jointB is the parent of jointC.
  51. // When invoked, this class modifies the rotations of jointA and jointB such
  52. // that the position of the jointC attempts to reach the position of jointGoal.
  53. //
  54. // At object initialization time, the distances between jointA - jointB and
  55. // jointB - jointC are cached.  During evaluation these bone lengths are
  56. // preserved.
  57. //
  58. //  A          A 
  59. //  |          |
  60. //  |          |
  61. //  B          B---CG     A---B---C...G
  62. //   
  63. //    
  64. //     CG
  65. //
  66. //
  67. // In addition a "poleVector" is specified that does two things:
  68. //
  69. // a) defines the plane in which the solution occurs, thus
  70. //    reducing an infinite number of solutions, down to 2.
  71. //
  72. // b) disambiguates the resulting two solutions as follows:
  73. //
  74. //  A             A            A--->poleVector
  75. //  |                          
  76. //  |                           
  77. //  B       vs.      B   ==>      B
  78. //                  |            |
  79. //                  |            |
  80. //     CG            CG           CG
  81. //
  82. // A "twist" setting allows the solution plane to be rotated about the
  83. // line between A and C.  A handy animation feature.
  84. //
  85. // For "smarter" results for non-coplanar limbs, specify the joints axis
  86. // of bend in the B's local frame (see setBAxis())
  87. //-----------------------------------------------------------------------------
  88. */
  89. class LLJointSolverRP3
  90. {
  91. protected:
  92. LLJoint *mJointA;
  93. LLJoint *mJointB;
  94. LLJoint *mJointC;
  95. LLJoint *mJointGoal;
  96. F32 mLengthAB;
  97. F32 mLengthBC;
  98. LLVector3 mPoleVector;
  99. LLVector3 mBAxis;
  100. BOOL mbUseBAxis;
  101. F32 mTwist;
  102. BOOL mFirstTime;
  103. LLMatrix4 mSavedJointAMat;
  104. LLMatrix4 mSavedInvPlaneMat;
  105. LLQuaternion mJointABaseRotation;
  106. LLQuaternion mJointBBaseRotation;
  107. public:
  108. //-------------------------------------------------------------------------
  109. // Constructor/Destructor
  110. //-------------------------------------------------------------------------
  111. LLJointSolverRP3();
  112. virtual ~LLJointSolverRP3();
  113. //-------------------------------------------------------------------------
  114. // setupJoints()
  115. // This must be called one time to setup the solver.
  116. // This must be called AFTER the skeleton has been created, all parent/child
  117. // relationships are established, and after the joints are placed in
  118. // a valid configuration (as distances between them will be cached).
  119. //-------------------------------------------------------------------------
  120. void setupJoints( LLJoint* jointA,
  121. LLJoint* jointB,
  122. LLJoint* jointC,
  123. LLJoint* jointGoal );
  124. //-------------------------------------------------------------------------
  125. // getPoleVector()
  126. // Returns the current pole vector.
  127. //-------------------------------------------------------------------------
  128. const LLVector3& getPoleVector();
  129. //-------------------------------------------------------------------------
  130. // setPoleVector()
  131. // Sets the pole vector.
  132. // The pole vector is defined relative to (in the space of) jointA's parent.
  133. // The default pole vector is (1,0,0), and this is used if this function
  134. // is never called.
  135. // This vector is normalized when set.
  136. //-------------------------------------------------------------------------
  137. void setPoleVector( const LLVector3& poleVector );
  138. //-------------------------------------------------------------------------
  139. // setBAxis()
  140. // Sets the joint's axis in B's local frame, and enable "smarter" solve(). 
  141. // This allows for smarter IK when for twisted limbs.
  142. //-------------------------------------------------------------------------
  143. void setBAxis( const LLVector3& bAxis );
  144. //-------------------------------------------------------------------------
  145. // getTwist()
  146. // Returns the current twist in radians.
  147. //-------------------------------------------------------------------------
  148. F32 getTwist();
  149. //-------------------------------------------------------------------------
  150. // setTwist()
  151. // Sets the twist value.
  152. // The default is 0.0.
  153. //-------------------------------------------------------------------------
  154. void setTwist( F32 twist );
  155. //-------------------------------------------------------------------------
  156. // solve()
  157. // This is the "work" function.
  158. // When called, the rotations of jointA and jointB will be modified
  159. // such that jointC attempts to reach jointGoal.
  160. //-------------------------------------------------------------------------
  161. void solve();
  162. };
  163. #endif // LL_LLJOINTSOLVERRP3_H