hkpVehicleFriction.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 HK2VEHICLEFRICTION
  9. #define HK2VEHICLEFRICTION
  10. #include <Common/Base/hkBase.h>
  11. // This must be changed bellow in the carrays too
  12. enum { HK_VEHICLE_FRICTION_N_AXIS = 2 };
  13. /// Info about the time for our vehicle
  14. struct hkpVehicleStepInfo
  15. {
  16. public:
  17. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_VEHICLE, hkpVehicleStepInfo );
  18. float m_deltaTime;
  19. float m_invDeltaTime;
  20. };
  21. extern const hkClass hkpVehicleFrictionDescriptionClass;
  22. /// The class hkpVehicleFrictionDescription is used by vehicle dynamics as a const description
  23. /// of how to simulate the friction of a vehicle this class can be initialized using
  24. /// hkVehicleFrictionDescriptionInitValues()
  25. struct hkpVehicleFrictionDescription
  26. {
  27. HK_DECLARE_REFLECTION();
  28. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_ACTION, hkpVehicleFrictionDescription);
  29. /// A helper construction info class to fill in the values for a hkpVehicleFrictionDescription.
  30. /// All values should be specified in chassis local space.
  31. struct Cinfo
  32. {
  33. public:
  34. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_VEHICLE, hkpVehicleFrictionDescription::Cinfo );
  35. /// An approximation of the final wheel position of a standing car.
  36. /// This information is used to calculate some tables for the internal implicit integrator for
  37. /// the friction clipping.
  38. /// Note: If in the final game the wheels change position, this internal table can get slightly incorrect.
  39. /// However the effect is minimal (<1% in normal situations). If you are worried and you want to check the correctness
  40. /// of this function, you can call hkVehicleFrictionDescriptionInitValues every step with the correct wheel positions.
  41. /// (On PlayStation(R)2, this could be rather slow).
  42. hkVector4 m_wheelPosition[2];/*HK_VEHICLE_FRICTION_N_AXIS*/
  43. hkVector4 m_chassisCenterOfMass;
  44. hkVector4 m_directionRight;
  45. hkVector4 m_directionFront;
  46. hkVector4 m_directionUp;
  47. hkMatrix3 m_chassisFrictionInertiaInv;
  48. hkReal m_chassisMassInv;
  49. /// This is the inertia of the wheel around the axle
  50. hkReal m_wheelAxleAngularInertia[2];/*HK_VEHICLE_FRICTION_N_AXIS*/
  51. /// This is the wheels radius
  52. hkReal m_wheelRadius[2];/*HK_VEHICLE_FRICTION_N_AXIS*/
  53. /// Equalizes the friction between front and back wheels: If set to 0, realistic behaviour,
  54. /// if set to 1.0, the system redistributes the wheel down forces to be the down forces of a 
  55. /// non moving, in its resting position car. Values between 0 and 1 interpolate between those values
  56. hkReal m_frictionEqualizer;
  57. };
  58. //
  59. // Internal use only
  60. //
  61. enum { hkFricionEllipseLineSegments = 16 };
  62. /// Used by the vehicle friction solver as a const description for a certain type of vehicle.
  63. struct AxisDescription
  64. {
  65. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_VEHICLE, hkpVehicleFrictionDescription::AxisDescription );
  66. HK_DECLARE_REFLECTION();
  67. //
  68. // For friction clipping (internal optimization)
  69. //
  70. float m_frictionCircleYtab[16];/*hkFricionEllipseLineSegments*/
  71. float m_xStep;
  72. float m_xStart;
  73. // the rotation inertia of the wheel
  74. hkReal m_wheelSurfaceInertia;
  75. hkReal m_wheelSurfaceInertiaInv;
  76. hkReal  m_wheelChassisMassRatio; 
  77. hkReal  m_wheelRadius;
  78. hkReal  m_wheelRadiusInv;
  79. // the final wheeldown force will be calculated using the following formulas:
  80. // wheelDownForce = m_wheelDownForceFactor * wheelDownForce + m_wheelDownForceSumFactor * ( sumOfAllWheelDownForces)
  81. hkReal  m_wheelDownForceFactor;
  82. hkReal  m_wheelDownForceSumFactor;
  83. };
  84. hkReal m_wheelDistance;
  85. hkReal m_chassisMassInv;
  86. struct AxisDescription m_axleDescr[2];/*HK_VEHICLE_FRICTION_N_AXIS*/
  87. };
  88. extern const hkClass hkpVehicleFrictionStatusClass;
  89. /// This class is used for persistent and export data of the vehicle friction solver
  90. struct hkpVehicleFrictionStatus
  91. {
  92. HK_DECLARE_REFLECTION();
  93. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_CONSTRAINT, hkpVehicleFrictionStatus);
  94. struct AxisStatus
  95. {
  96. HK_DECLARE_REFLECTION();
  97. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_CONSTRAINT, AxisStatus);
  98. //
  99. // Export data
  100. //
  101. hkReal  m_forward_slip_velocity; // [m/sec]
  102. hkReal  m_side_slip_velocity;       // [m/sec]
  103. hkReal  m_skid_energy_density; // [N]
  104. hkReal m_side_force; // [N]
  105. //
  106. // For internal use only
  107. //
  108. hkReal m_delayed_forward_impulse; // the to the next PSI delayed forward impulse
  109. hkReal m_sideRhs;
  110. hkReal m_forwardRhs;
  111. //
  112. // Friction circle
  113. //
  114. /// Friction force in sideways direction in the range 0..1 (>1 means the wheel is sliding)
  115. hkReal m_relativeSideForce;
  116. /// Friction force in forward direction in the range 0..1 (>1 means the wheel is sliding)
  117. hkReal m_relativeForwardForce;
  118. void init()
  119. {
  120. m_forward_slip_velocity = 0.0f; // the velocity between a skidding tire and ground
  121. m_side_slip_velocity = 0.0f;
  122. m_skid_energy_density = 0.0f; // the energy destroyed in one physical timestep by a skidding tire
  123. m_side_force = 0.0f;
  124. m_delayed_forward_impulse = 0.0f;
  125. m_sideRhs = 0.0f;
  126. m_forwardRhs = 0.0f;
  127. m_relativeSideForce = 0.0f;
  128. m_relativeForwardForce = 0.0f;
  129. }
  130. };
  131. struct AxisStatus m_axis[2];/*HK_VEHICLE_FRICTION_N_AXIS*/
  132. hkpVehicleFrictionStatus() 
  133. {
  134. m_axis[0].init(); 
  135. m_axis[1].init(); 
  136. }
  137. hkpVehicleFrictionStatus( hkFinishLoadedObjectFlag flag ) 
  138. // skip initialization of m_axis[0/1]
  139. }
  140. };
  141. #endif //HK2VEHICLEFRICTION
  142. /*
  143. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  144. * Confidential Information of Havok.  (C) Copyright 1999-2009
  145. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  146. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  147. * rights, and intellectual property rights in the Havok software remain in
  148. * Havok and/or its suppliers.
  149. * Use of this software for evaluation purposes is subject to and indicates
  150. * acceptance of the End User licence Agreement for this product. A copy of
  151. * the license is included with this software and is also available at www.havok.com/tryhavok.
  152. */