hkaFootPlacementIkSolver.h
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:14k
源码类别:

其他游戏

开发平台:

Visual C++

  1. /* 
  2.  * 
  3.  * Confidential Information of Telekinesys Research Limited (t/a Havok). Not for disclosure or distribution without Havok's
  4.  * prior written consent. This software contains code, techniques and know-how which is confidential and proprietary to Havok.
  5.  * Level 2 and Level 3 source code contains trade secrets of Havok. Havok Software (C) Copyright 1999-2009 Telekinesys Research Limited t/a Havok. All Rights Reserved. Use of this software is subject to the terms of an end user license agreement.
  6.  * 
  7.  */
  8. #ifndef INC_HKA_FOOTPLACEMENT_H
  9. #define INC_HKA_FOOTPLACEMENT_H
  10. class hkaSkeleton;
  11. class hkaPose;
  12. /// This interface class defines a single method, castRay(), and it's used by the hkaFootPlacementIkSolver object to cast rays
  13. /// into the application's world. If you are using Havok Physics, you can use the optimized ray cast functionality provided there,
  14. /// including the ability to filter objects, etc.. or otherwise you can wrap your custom ray casting functionality with this interface.
  15. class hkaRaycastInterface
  16. {
  17. public:
  18. virtual ~hkaRaycastInterface() { }
  19. /// Abstract method, should be implemented by the user in a derived class. Given two points, "from" and "to", specified in
  20. /// world space, it should return whether a ray between those two points intersects the scene or not. If it does (if it returns true), 
  21. /// the hitFractionOut parameter should return a value between (0..1) to specify the point of intersection with the ray (where 0 is the
  22. /// start ("from") of the ray and 1 the end ("to") of the ray). Also in that case the parameter normalWSOut should return the normal of
  23. /// the surface intersected, in world space.
  24. virtual hkBool castRay ( const hkVector4& fromWS, const hkVector4& toWS, hkReal& hitFractionOut, hkVector4& normalWSOut );
  25. /// This interface is used instead of the above if hkaFootPlacementIkSolver::Input::m_useCollisionFilterInfo is true.
  26. /// This interface provides a collision filter word that your implementation can use to filter collisions.
  27. virtual hkBool castRay ( const hkVector4& fromWS, const hkVector4& toWS, hkUint32 collisionFilterInfo, hkReal& hitFractionOut, hkVector4& normalWSOut );
  28. };
  29. /// The Foot Placement solver tracks changes on the height of the ground. It then modifies the extension of a leg according to the
  30. /// original (desired) distance to the ground. It also modifies the orientation of the foot over time
  31. /// according to the original (desired) orientation of the foot and the slope of the ground. This original (desired) height and orientation are taken
  32. /// from m_originalAnkleTransformMS, part of the Input structure. It also locks and unlocks the feet based on m_footPlantedAnkleHeightInMS. 
  33. /// This solver, in contrast with the other ik solvers, operates in a stateful manner, i.e., it keeps state between calls, and therefore must be instantiated for
  34. /// each leg/lower limb to be solved over time. Because of that, instead of a static solve() method, there is a non-static doFootPlacement() method.
  35. /// The solver operates with different sets of data. Setup data is passed on construction, and it contains information about the skeleton, joint/bone
  36. /// indices, axis and limits. Alongside a pose, an hkaFootPlacementIkSolver::Input struct is passed on every call to doFootPlacement(), and contains information about 
  37. /// gains and current location of the model in world, as well as an interface to raycast functionality. An hkaFootPlacementIkSolver::Output struct is 
  38. /// returned, containing information regarding the amount of fix-up done by the solver in the vertical direction, which can be used by the application 
  39. /// to update the location of the model (i.e., update the pelvis).
  40. class hkaFootPlacementIkSolver : public hkReferencedObject
  41. {
  42. public:
  43. HK_DECLARE_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIM_RUNTIME );
  44. /// This struct is passed on construction of an hkaFootPlacementIkSolver, and contains information about
  45. /// the structure of the character as well as axis and limits for the joints.
  46. struct Setup
  47. {
  48. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIM_RUNTIME, hkaFootPlacementIkSolver::Setup );
  49. /*
  50. ** Information about the skeleton
  51. */
  52. /// Skeleton of the character to which we are applying foot placement
  53. const hkaSkeleton* m_skeleton;
  54. /// Index of the joint representing the hip (== bone representing the thigh)
  55. hkInt16 m_hipIndex;
  56. /// Index of the joint representing the knee (== bone representing the calf)
  57. hkInt16 m_kneeIndex;
  58. /// Index of the joint representing the ankle (== bone representing the foot)
  59. hkInt16 m_ankleIndex;
  60. /// Axis of rotation of the knee, in local space of the knee
  61. hkVector4 m_kneeAxisLS;
  62. /// The end of the foot, in the local space of the ankle/foot. If this is 0,0,0 (default), the
  63. /// length of the foot won't be considered (only one raycast will be used)
  64. hkVector4 m_footEndLS;
  65. /*
  66. ** Information about the world and model spaces
  67. */
  68. /// The UP direction in the world (from ground to sky), in world space
  69. hkVector4 m_worldUpDirectionWS;
  70. /// The UP direction in the model (from feet to head), in model space
  71. hkVector4 m_modelUpDirectionMS;
  72. /// The height of the ground where the model was created/animated, in model space. For example, if the root bone of the skeleton
  73. /// is the pelvis, then this is the distance pelvis-ground (a negative value). If the root bone of the skeleton is located at the ground, this is 0.
  74. hkReal m_originalGroundHeightMS;
  75. /*
  76. ** Foot planted / raised heights
  77. */
  78. /// The height of the ankle below which the foot is considered planted. Used to calculate gains.
  79. hkReal m_footPlantedAnkleHeightMS;
  80. /// The height of the ankle above which the foot is considered fully raised. Used to calculate gains.
  81. hkReal m_footRaisedAnkleHeightMS;
  82. /*
  83. ** Foot Placement limits (used to clamp the IK results)
  84. */
  85. /// Maximum height the ankle can reach (in model space)
  86. hkReal m_maxAnkleHeightMS;
  87. /// Minimum height the ankle can reach (in model space)
  88. hkReal m_minAnkleHeightMS;
  89. /// Limit the knee angle (to avoid knee popping artifacts). Default is -1 (180 deg). 
  90. hkReal m_cosineMaxKneeAngle;
  91. /// Limit the hinge angle (to avoid knee artifacts). Default is 1 (0 deg). 
  92. hkReal m_cosineMinKneeAngle;
  93. /*
  94. ** Some other internal tweaking values
  95. */
  96. /// When ray casting from the foot towards the ground, the (positive) distance, from the foot and in the up direction, where the ray starts. Default is 0.5(m), you may
  97. /// want to change this according to the scale of your character
  98. hkReal m_raycastDistanceUp;
  99. /// When ray casting from the foot towards the ground, the (positive) distance, from the foot and in the down direction, where the ray ends. Default is 0.8(m), you may
  100. /// want to change this according to the scale of your character
  101. hkReal m_raycastDistanceDown;
  102. /// If true, the foot/ankle will be locked and unlocked.
  103. bool m_useFootLocking;
  104. /// Constructor, sets defaults (mostly to invalid values to enforce proper setup)
  105. Setup();
  106. };
  107. /// This structure, passed to each call to doFootPlacement(), alongside the pose, contains information about the
  108. /// location of the model in world, the original/desired position(height) and orientation of the foot, and 
  109. /// an interface to raycast functionality.
  110. struct Input
  111. {
  112. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIM_RUNTIME, hkaFootPlacementIkSolver::Input );
  113. /// The original position and orientation of the ankle (the one we base the foot placement on)
  114. hkQsTransform m_originalAnkleTransformMS;
  115. /// The transform that converts from model to world
  116. hkQsTransform m_worldFromModel;
  117. /// If false, foot placement will be eased out/kept off, otherwise it will be eased in/kept on
  118. bool m_footPlacementOn;
  119. /// An interface to ray cast functionality. The implementation should only hit objects that the user wants to
  120. /// do foot placement on. For example, it may ignore debris objects if the foot is not supposed to land on top of them.
  121. hkaRaycastInterface* m_raycastInterface;
  122. /*
  123. ** GAINS
  124. */
  125. /// Gain used when transitioning from foot placement on and off. Default value is 0.2f.
  126. hkReal m_onOffGain;
  127. /// Gain used when the ground height is increasing (going up). Default value is 1.0f.
  128. hkReal m_groundAscendingGain;
  129. /// Gain used when the ground height is decreasing (going down). Default value is 1.0f.
  130. hkReal m_groundDescendingGain;
  131. /// Gain used when the foot is fully planted (as defined in Setup::m_footPlantedAnkleHeightMS). 
  132. /// Depending on the height of the ankle, a value is interpolated between m_footPlantedGain 
  133. /// and m_footRaisedGain and then multiplied by the ascending/descending gain to give
  134. /// the final gain used. Default (and most common) value is 1.0f.
  135. hkReal m_footPlantedGain;
  136. /// Gain used when the foot is fully raise (as defined in Setup::m_footRaisedAnkleHeightMS). 
  137. /// Depending on the height of the ankle, a value is interpolated between m_footPlantedGain 
  138. /// and m_footRaisedGain and then multiplied by the ascending/descending gain to give
  139. /// the final gain used. Default value is 1.0f.
  140. hkReal m_footRaisedGain;
  141. /// Gain used when the foot becomes unlocked.  When the foot goes from being locked to unlocked,
  142. /// there can be a gap between the previously locked foot position and the desired position.
  143. /// This gain is used to smoothly transition to the new foot position.  This gain only affects 
  144. /// the horizontal component of the position, since the other gains take care of vertical 
  145. /// smoothing.  Default value is 1.0f.
  146. hkReal m_footUnlockGain;
  147. /// If m_useCollisionFilterInfo is true, this member is passed into hkaRaycastInterface::castRay() when performing
  148. /// raycasts.  You can use this if you want to use the same raycast interface for handling cases with
  149. /// different collision properties.
  150. hkUint32 m_collisionFilterInfo;
  151. /// Whether or not to pass m_collisionFilterInfo into hkaRaycastInterface::castRay().
  152. bool m_useCollisionFilterInfo;
  153. /// Constructor. It sets some defaults.
  154. Input();
  155. };
  156. /// This structure is filled by the foot placement solver, and contains information that can be used by the
  157. /// application logic
  158. struct Output
  159. {
  160. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIM_RUNTIME, hkaFootPlacementIkSolver::Output );
  161. /// A measure of how much displacement was required for the leg to reach its final location. It can
  162. /// be used to update the pelvis of the character
  163. hkReal m_verticalError;
  164. /// True if the foot placement detected ground under the foot
  165. bool m_hitSomething;
  166. };
  167. /// Constructor. You need an instance of hkaFootPlacementIkSolver for each leg to be solved. The Setup structure contains
  168. /// information about the character setup.
  169. hkaFootPlacementIkSolver(const Setup& setup);
  170. /// Call this method to perform the foot placement (usually every frame). It modifies the pose so the leg is placed at
  171. /// a reasonable location given the input and the environment.
  172. void doFootPlacement (const Input& input, Output& output, hkaPose& poseInOut);
  173. /// This is the same setup data passed on construction. It has been made public should you need to change any 
  174. /// of the setup values on the fly, although this is uncommon. 
  175. Setup m_setup;
  176. private:
  177. /*
  178. ** Internal State Data
  179. */
  180. // Current weight for the foot placement
  181. hkReal m_currentWeight;
  182. // Previous ground height, in world space
  183. hkReal m_previousGroundHeightWS;
  184. // Previous ground normal, in world space
  185. hkVector4 m_previousGroundNormalWS;
  186. // Previous vertical displacement applied to the foot
  187. hkReal m_previousVerticalDisplacement;
  188. // Whether the foot is currently locked to the ground or not
  189. hkBool m_isFootLocked;
  190. // The locked foot/ankle position.
  191. hkVector4 m_lockedFootPositionInWS;
  192. // The locked position of the end/toes of the foot.
  193. hkVector4 m_lockedFootEndPositionInWS;
  194. // When unlocking the foot the locked foot position and the new position could be different. The horizontal
  195. // component of this difference is stored in m_footUnlokcingOffset when the foot becomes unlocked. This is used 
  196. // to do blend smoothly from the locked position back to the position dictated by the animation.
  197. hkVector4 m_footUnlockingOffset;
  198. // Uses two rays to cast the foot into the ground
  199. bool castFoot( const Input& input, const hkVector4& footWS, const hkVector4& footEndWS, hkVector4& projectedFootWSOut, hkVector4& groundNormalWSOut ) const;
  200. // Cast a ray using the information in the Input.
  201. bool castRay( const Input& input, const hkVector4& fromWS, const hkVector4& toWS, hkReal& hitFractionOut, hkVector4& normalWSOut ) const;
  202. };
  203. #endif //INC_HKA_FOOTPLACEMENT_H
  204. /*
  205. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  206. * Confidential Information of Havok.  (C) Copyright 1999-2009
  207. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  208. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  209. * rights, and intellectual property rights in the Havok software remain in
  210. * Havok and/or its suppliers.
  211. * Use of this software for evaluation purposes is subject to and indicates
  212. * acceptance of the End User licence Agreement for this product. A copy of
  213. * the license is included with this software and is also available at www.havok.com/tryhavok.
  214. */