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

其他游戏

开发平台:

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_UTILITIES_KEYFRAME_UTILITY_H
  9. #define HK_UTILITIES_KEYFRAME_UTILITY_H
  10. #include <Common/Base/hkBase.h>
  11. class hkpRigidBody;
  12. /// This class contains a set of utility functions to help calculate and apply velocities to rigid bodies
  13. /// in order to make them follow a user-defined position/orientation and velocity. Thus is can be used to make
  14. /// rigid bodies follow "keyframes", either exactly, or in an approximate "blended" manner.
  15. /// NOTE: You must be careful when switching from using hard to soft keyframes: 
  16. /// All keyframes eventually require "centre-of-mass" positions in order to correctly compute the velocities
  17. /// to set. The applyHardKeyFrame() method automatically converts Local positions to "centre-of-mass" positions, however
  18. /// applySoftKeyFrame() takes a KeyFrameInfo which must have "centre-of-mass" positions set explicitly.
  19. class hkpKeyFrameUtility
  20. {
  21. public:
  22. ///You use an AccelerationInfo to specify acceleration details for hkpKeyFrameUtility::applySoftKeyFrame
  23. struct AccelerationInfo
  24. {
  25. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_UTILITIES, hkpKeyFrameUtility::AccelerationInfo );
  26. AccelerationInfo();
  27. /// This parameter controls the linear stiffness of applySoftKeyFrame, its units are 1/Time.
  28. /// Eg. If this value is 2, then the applySoftKeyFrame function will set the body's velocity such
  29. /// that it would achieve the position of the next keyframe in  0.5 = 1/2 seconds.
  30. /// Valid values range between 0 and 1/deltaTime
  31. hkVector4 m_linearPositionFactor;
  32. /// This parameter controls the angular stiffness of applySoftKeyFrame, its units are 1/Time.
  33. /// Eg. If this value is 2, then the applySoftKeyFrame function will set the body's velocity such
  34. /// that it would achieve the orientation of the next keyframe in  0.5 = 1/2 seconds.
  35. /// Valid values range between 0 and 1/deltaTime
  36. hkVector4 m_angularPositionFactor;
  37. /// This parameter controls the velocity control of applySoftKeyFrame, its units are 1/Time.
  38. /// Eg. If this value is 2, then the applySoftKeyFrame function will set the body's velocity such
  39. /// that it would achieve the linear velocity of the next keyframe in  0.5 = 1/2 seconds.
  40. /// Valid values range between 0 and 1/deltaTime
  41. hkVector4 m_linearVelocityFactor;
  42. /// This parameter controls the velocity control of applySoftKeyFrame, its units are 1/Time.
  43. /// Eg. If this value is 2, then the applySoftKeyFrame function will set the body's velocity such
  44. /// that it would achieve the angular velocity of the next keyframe in  0.5 = 1/2 seconds.
  45. /// Valid values range between 0 and 1/deltaTime
  46. hkVector4 m_angularVelocityFactor;
  47. /// Maximum linear acceleration. If the velocity changes required by the applySoftKeyFrame
  48. /// function would exceed this acceleration, they are clipped against this.
  49. hkReal m_maxLinearAcceleration;
  50. /// The maximum angular accelerations (m/sec2). If the velocity changes required by the applySoftKeyFrame
  51. /// function would exceed this acceleration, they are clipped against this.
  52. hkReal m_maxAngularAcceleration; 
  53. /// If the distance between object and keyframe gets bigger than the max allowed distance, the object is
  54. /// immediately "warped" to the correct keyframe position/orientation, and corresponding velocities.
  55. hkReal m_maxAllowedDistance;
  56. };
  57. /// You use a KeyFrameInfo to specify keyframe details for hkpKeyFrameUtility::applySoftKeyFrame.
  58. /// NOTE: All the positions for SOFT keyframes must be "centre-of-mass" positions. To convert a Local position
  59. /// to a "centre-of-mass" position, you must add on rb->getCentreOfMassLocal() rotated by m_orientation.
  60. /// It contains the current keyframe position, orientation, angular velocity, and linear velocity. 
  61. /// It also provides functions for calculating the angular and linear velocities if you only have the current and target positions and orientations.
  62. struct KeyFrameInfo
  63. {
  64. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_UTILITIES, hkpKeyFrameUtility::KeyFrameInfo );
  65. /// The current "centre-of-mass" position of a keyframe
  66. hkVector4 m_position;
  67. /// The current orientation
  68. hkQuaternion m_orientation;
  69. /// The current velocity
  70. hkVector4 m_linearVelocity;
  71. /// The current angular velocity
  72. hkVector4 m_angularVelocity;
  73. /// Convenience function for setting velocities if you only have "centre-of-mass" positions and orientations
  74. void setUsingPositionOrientationPair(  const hkVector4& currentPosition, const hkQuaternion& currentOrientation, const hkVector4& nextPosition, const hkQuaternion& nextOrientation, hkReal invDeltaTime );
  75. /// Convenience function for setting velocities if you only have "centre-of-mass" positions and orientations. Uses approximation of angular velocity.
  76. void fastSetUsingPositionOrientationPair(  const hkVector4& currentPosition, const hkQuaternion& currentOrientation, const hkVector4& nextPosition, const hkQuaternion& nextOrientation, hkReal invDeltaTime );
  77. };
  78. /// Change velocities of body to move towards keyframe given acceleration guidelines, in time deltaTime.
  79. /// Uses several fast approximations for angular calculations and exponential falloff.
  80. static void HK_CALL applySoftKeyFrame( const KeyFrameInfo& keyFrameInfo, AccelerationInfo& accelInfo, hkReal deltaTime, hkReal invDeltaTime, hkpRigidBody* body );
  81. /// Change velocities of body to move to future (position, orientation) in time deltaTime
  82. /// Note: You must pass in INVERSE deltaTime
  83. /// NOTE: All the positions for HARD keyframes are automatically converted to be "centre-of-mass" positions
  84. /// using the information in the body supplied.
  85. static void HK_CALL applyHardKeyFrame( const hkVector4& nextPosition, const hkQuaternion& nextOrientation, hkReal invDeltaTime, hkpRigidBody* body);
  86. /// This function should be used instead of hkpKeyFrameUtility::applyHardKeyFrame when stepping asynchronously
  87. static void HK_CALL applyHardKeyFrameAsynchronously( const hkVector4& nextPosition, const hkQuaternion& nextOrientation, hkReal invDeltaTime, hkpRigidBody* body);
  88. };
  89. #endif // HK_UTILITIES_KEYFRAME_UTILITY_H
  90. /*
  91. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  92. * Confidential Information of Havok.  (C) Copyright 1999-2009
  93. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  94. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  95. * rights, and intellectual property rights in the Havok software remain in
  96. * Havok and/or its suppliers.
  97. * Use of this software for evaluation purposes is subject to and indicates
  98. * acceptance of the End User licence Agreement for this product. A copy of
  99. * the license is included with this software and is also available at www.havok.com/tryhavok.
  100. */