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

其他游戏

开发平台:

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 HK_KEYFRAME_HIERARCHY_UTILITY_H
  9. #define HK_KEYFRAME_HIERARCHY_UTILITY_H
  10. #include <Common/Base/hkBase.h>
  11. #include <Common/Base/Reflection/Attributes/hkAttributes.h>
  12. class hkpRigidBody;
  13. /// The hkaKeyFrameHierarchyUtility implements a controller that applies linear and angular velocities to the 
  14. /// rigid bodies in a constraint hierarchy e.g. a rag doll.
  15. /// This controller is useful when you are attempting to drive the system to a desired pose / configuration.
  16. class hkaKeyFrameHierarchyUtility 
  17. {
  18. public:
  19. HK_DECLARE_REFLECTION();
  20. /// A structure containing the control data for the utility
  21. /// The controller works by first matching acceleration, then velocity and finally position.
  22. /// At each stage the controller examines the difference between the keyframe and the body.
  23. /// This difference is scaled by the gain and applied it to the body by changing its velocity.
  24. /// Differences in position are clamped before being applied.
  25. /// When choosing values for the gains it is common to have higher values in the higher order controllers
  26. /// e.g. acceleration gain > velocity gain > position gain
  27. ///
  28. /// Once the three controllers have been applied we perform a final pass which 
  29. /// snaps the bodies to the keyframes when they are very close. This controller called the snap controller
  30. /// works similarly to the position controller. It usually has a higher gain than the position controller.
  31. /// It differs slightly in that its strength is proportional to the error and only uses its full strength
  32. /// if the current error is smaller than m_snapMaxLinearDistance/m_snapMaxAngularDistance.
  33. struct ControlData
  34. {
  35. HK_DECLARE_REFLECTION();
  36. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_RIGID_BODY, hkaKeyFrameHierarchyUtility::ControlData );
  37. /// This parameter blends the desired target for a bone between model space (0.0) or local space(1.0)
  38. /// Usually the controller will be much stiffer and more stable when driving to model space.
  39. /// However local space targeting can look more natural. 
  40. /// It is similar to the deprecated bone controller hierarchyGain parameter
  41. hkReal m_hierarchyGain; //+default(0.17f)
  42. //+hk.RangeReal(absmin=0.0,absmax=1.0)
  43. //+hk.Description("This parameter blends the desired target for a bone between model space: zero, or local space: one. Usually the controller will be much stiffer and more stable when driving to model space. However local space targeting can look more natural.")
  44. /// This gain dampens the velocities of the bodies. The current velocity of the body is 
  45. /// scaled by this parameter on every frame before the controller is applied. It is
  46. /// applied every step and is generally more aggressive than standard linear or angular damping.
  47. /// A value of 0 means no damping.
  48. hkReal m_velocityDamping; //+default(0.0f)
  49. //+hk.RangeReal(absmin=0.0,absmax=1.0)
  50. //+hk.Description("This gain dampens the velocities of the bodies. The current velocity of the body is scaled by this parameter on every frame before the controller is applied. It is applied every step and is generally more aggressive than standard linear or angular damping. A value of 0 means no damping.")
  51. /// This gain controls the proportion of the difference in acceleration that is 
  52. /// applied to the bodies. It dampens the effects of the velocity control.
  53. hkReal m_accelerationGain; //+default(1.0f)
  54. //+hk.RangeReal(absmin=0.0,absmax=1.0)
  55. //+hk.Description("This gain controls the proportion of the difference in acceleration that is applied to the bodies. It dampens the effects of the velocity control.")
  56. /// This gain controls the proportion of the difference in velocity that is 
  57. /// applied to the bodies. It dampens the effects of the position control.
  58. hkReal m_velocityGain; //+default(0.6f)
  59. //+hk.RangeReal(absmin=0.0,absmax=1.0)
  60. //+hk.Description("This gain controls the proportion of the difference in velocity that is applied to the bodies. It dampens the effects of the position control.")
  61. /// This gain controls the proportion of the difference in position that is 
  62. /// applied to the bodies. It has the most immediate effect. High gain 
  63. /// values make the controller very stiff. Once the controller is too stiff
  64. /// it will tend to overshoot. The velocity gain can help control this.
  65. hkReal m_positionGain; //+default(0.05f)
  66. //+hk.RangeReal(absmin=0.0,absmax=1.0)
  67. //+hk.Description("This gain controls the proportion of the difference in position that is applied to the bodies. It has the most immediate effect. High gain values make the controller very stiff. Once the controller is too stiff it will tend to overshoot. The velocity gain can help control this.")
  68. /// The position difference is scaled by the inverse delta time to compute a 
  69. /// velocity to be applied to the rigid body. The velocity is first clamped to this 
  70. /// limit before it is applied.
  71. hkReal m_positionMaxLinearVelocity; //+default(1.4f)
  72. //+hk.RangeReal(absmin=0.0,absmax=100.0,softmax=10.0)
  73. //+hk.Description("The position difference is scaled by the inverse delta time to compute a velocity to be applied to the rigid body. The velocity is first clamped to this limit before it is applied.")
  74. /// The orientation difference is scaled by the inverse delta time to compute an angular 
  75. /// velocity to be applied to the rigid body. The velocity is first clamped to this 
  76. /// limit before it is applied.
  77. hkReal m_positionMaxAngularVelocity; //+default(1.8f)
  78. //+hk.RangeReal(absmin=0.0,absmax=100.0,softmax=10.0)
  79. //+hk.Description("The orientation difference is scaled by the inverse delta time to compute an angular velocity to be applied to the rigid body. The velocity is first clamped to this limit before it is applied.")
  80. /// This gain allows for precise matching between keyframes and the current position. 
  81. /// It works like the m_positionGain: it calculates an optimal 
  82. ///     deltaVelocity = (keyFramePosition - currentPosition) / deltaTime
  83. /// scales it by m_snapGain, clips it against m_snapMaxXXXVelocity and scales it down
  84. /// if (keyFramePosition - currentPosition) > m_snapMaxXXXXDistance
  85. hkReal m_snapGain; //+default(0.1f)
  86. //+hk.RangeReal(absmin=0.0,absmax=1.0) 
  87. //+hk.Description("This gain allows for precise matching between keyframes and the current position. It works like the m_positionGain: it calculates an optimal deltaVelocity, scales it by m_snapGain, clips it against m_snapMaxXXXVelocity and scales it down if the implied positional difference is larger than m_snapMaxXXXXDistance.")
  88. /// See m_snapGain. The linear velocity calculated from the snapGain is clamped to this 
  89. /// limit before being applied.
  90. hkReal m_snapMaxLinearVelocity; //+default(0.3f)
  91. //+hk.RangeReal(absmin=0.0,absmax=100.0,softmax=10.0)
  92. //+hk.Description("See m_snapGain. The linear velocity calculated from the snapGain is clamped to this limit before being applied.")
  93. /// See m_snapGain. The angular velocity calculated from the snapGain is clamped to this 
  94. /// limit before being applied.
  95. hkReal m_snapMaxAngularVelocity; //+default(0.3f)
  96. //+hk.RangeReal(absmin=0.0,absmax=100.0,softmax=10.0)
  97. //+hk.Description("See m_snapGain. The angular velocity calculated from the snapGain is clamped to this limit before being applied.")
  98. /// This sets the max linear distance for the snap gain to work at full strength.
  99. /// The strength of the controller peaks at this distance.
  100. /// If the current distance is bigger than m_snapMaxLinearDistance, the snap velocity will be scaled
  101. /// by sqrt( maxDistane/currentDistance ).
  102. hkReal m_snapMaxLinearDistance; //+default(0.03f)
  103. //+hk.RangeReal(absmin=0.0,absmax=10.0,softmax=1.0)
  104. //+hk.Description("This sets the max linear distance for the snap gain to work at full strength. The strength of the controller peaks at this distance.")
  105. /// This sets the max angular distance for the snap gain to work at full strength.
  106. /// The strength of the controller peaks at this distance.
  107. /// If the current distance is bigger than m_snapMaxAngularDistance, the snap velocity will be scaled
  108. /// by sqrt( maxDistane/currentDistance ).
  109. hkReal m_snapMaxAngularDistance; //+default(0.1f)
  110. //+hk.RangeReal(absmin=0.0,absmax=10.0,softmax=1.0)
  111. //+hk.Description("This sets the max angular distance for the snap gain to work at full strength. The strength of the controller peaks at this distance.")
  112. // These useful defaults are appropriate in most circumstances
  113. ControlData() :
  114. m_hierarchyGain(0.17f),
  115. m_velocityDamping(0.0f),
  116. m_accelerationGain(1.0f),
  117. m_velocityGain(0.6f),
  118. m_positionGain(0.05f),
  119. m_positionMaxLinearVelocity(1.4f),
  120. m_positionMaxAngularVelocity(1.8f),
  121. m_snapGain(0.1f),
  122. m_snapMaxLinearVelocity(0.3f),
  123. m_snapMaxAngularVelocity(0.3f),
  124. m_snapMaxLinearDistance(0.03f),
  125. m_snapMaxAngularDistance(0.1f) {}
  126. hkBool isValid() const;
  127. ControlData( hkFinishLoadedObjectFlag flag ) {}
  128. };
  129. /// A structure holding data which used by this utility and has to be persistent
  130. struct WorkElem
  131. {
  132. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIMATION, hkaKeyFrameHierarchyUtility::WorkElem );
  133. hkVector4    m_prevPosition;
  134. hkQuaternion m_prevRotation;
  135. hkVector4    m_prevLinearVelocity;
  136. hkVector4    m_prevAngularVelocity;
  137. };
  138. /// A structure holding the data representing the pose to drive to and the persistent data
  139. struct KeyFrameData
  140. {
  141. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIMATION, hkaKeyFrameHierarchyUtility::KeyFrameData );
  142. /// The transformation from the ragdoll root to world space
  143. hkQsTransform m_worldFromRoot;
  144. /// The desired pose in local space, one transform for each rigid body
  145. const hkQsTransform * m_desiredPoseLocalSpace;
  146. /// Internal array of work data. Has to be persistent and should be initialized with the initialize() method 
  147. struct WorkElem* m_internalReferencePose;
  148. };
  149. /// A structure holding the rigid bodies and information about how they are linked / parented
  150. /// This parent indices are usually derived by looking at how the bodies are constrained; see hkaRagdollUtils::constructSkeletonForRagdoll
  151. struct BodyData
  152. {
  153. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIMATION, hkaKeyFrameHierarchyUtility::BodyData );
  154. /// The number of rigid bodies
  155. int      m_numRigidBodies;
  156. /// An array of rigid bodies. The velocities of these rigid bodies will be modified to match the input pose
  157. hkpRigidBody*const*  m_rigidBodies;
  158. /// The hierarchy of rigid bodies. A rigid body which has no parent has an index of-1
  159. const hkInt16*       m_parentIndices;
  160. /// An index one per body indicating which control data to use for this body
  161. /// If this is HK_NULL all bodies use the first element of the control data array
  162. int*  m_controlDataIndices;
  163. BodyData() : m_controlDataIndices(HK_NULL) {}
  164. };
  165. /// The output
  166. struct Output
  167. {
  168. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIMATION, hkaKeyFrameHierarchyUtility::Output );
  169. /// This output parameter is related to velocity and is calculated
  170. /// as a byproduct of computing the snap gain. It is a reasonable
  171. /// measure of the error or stress in the controller
  172. hkReal m_stressSquared;
  173. };
  174. /// Initialize the internal WorkElem array
  175. static void HK_CALL initialize(const BodyData& bodies, WorkElem* internalReferencePose);
  176. /// applies the required velocities in order to drive the rigid bodies of this
  177. /// ragdoll to the desired pose. 
  178. /// If the output array can be HK_NULL if you wish to ignore the output
  179. static void HK_CALL applyKeyFrame( hkReal m_deltaTime, const KeyFrameData& pose, const BodyData& body, const ControlData* controlPalette, Output* outputArray = HK_NULL );
  180. };
  181. #endif // HK_KEYFRAME_HIERARCHY_UTILITY_H
  182. /*
  183. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  184. * Confidential Information of Havok.  (C) Copyright 1999-2009
  185. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  186. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  187. * rights, and intellectual property rights in the Havok software remain in
  188. * Havok and/or its suppliers.
  189. * Use of this software for evaluation purposes is subject to and indicates
  190. * acceptance of the End User licence Agreement for this product. A copy of
  191. * the license is included with this software and is also available at www.havok.com/tryhavok.
  192. */