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

其他游戏

开发平台:

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 HKVEHICLE_HKVEHICLEINSTANCE_H
  9. #define HKVEHICLE_HKVEHICLEINSTANCE_H
  10. #include <Physics/Dynamics/Action/hkpUnaryAction.h>
  11. #include <Common/Base/hkBase.h>
  12. class hkpVehicleAerodynamics;
  13. class hkpVehicleDriverInput;
  14. class hkpVehicleBrake;
  15. class hkpVehicleEngine;
  16. class hkpVehicleSteering;
  17. class hkpVehicleSuspension;
  18. class hkpVehicleTransmission;
  19. class hkpVehicleWheelCollide;
  20. #include <Physics/Vehicle/hkpVehicleData.h>
  21. class hkpVelocityAccumulator;
  22. class hkStepInfo;
  23. /// This is the main class for a vehicle - it is a container for all the
  24. /// runtime data the vehicle needs, and also contains pointers to all the
  25. /// components that can be shared between different vehicles.
  26. /// This class cannot be shared between different vehicles.
  27. /// 
  28. /// Because this class is an hkpUnaryAction, it can be added to the world 
  29. /// as an action.  See the VehicleApi demos for examples of usage.
  30. class hkpVehicleInstance : public hkpUnaryAction
  31. {
  32. public:
  33. HK_DECLARE_CLASS_ALLOCATOR(HK_MEMORY_CLASS_VEHICLE);
  34. HK_DECLARE_REFLECTION();
  35. /// This structure stores all data that is useful to the user and is shared
  36. /// among vehicle components.
  37. struct WheelInfo
  38. {
  39. //+version(1)
  40. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_VEHICLE, hkpVehicleInstance::WheelInfo );
  41. HK_DECLARE_REFLECTION();
  42. /// The maximum number of shape keys which is reported by vehicle wheel collider (see also hkpShapeRayCastOutput::MAX_HIERARCHY_DEPTH)
  43. enum { MAX_NUM_SHAPE_KEYS = 8  };
  44. /// The point of contact of the wheel with the ground (if the wheel is in contact with the ground).
  45. class hkContactPoint m_contactPoint;
  46. /// The friction coefficient at the point of contact.
  47. hkReal m_contactFriction;
  48. /// The ground body the vehicle is in contact.  This value is HK_NULL
  49. /// if none of the wheels are in contact with the ground.
  50. hkpRigidBody* m_contactBody; //+nosave
  51. /// The shapeKey hierarchy of the object at the point of contact.
  52. hkpShapeKey m_contactShapeKey[hkpVehicleInstance::WheelInfo::MAX_NUM_SHAPE_KEYS];
  53. /// Location of the wheel hardPoint in world space
  54. hkVector4 m_hardPointWs;
  55. /// Farthest point on the wheel from the vehicle in the direction of the suspension.
  56. hkVector4 m_rayEndPointWs;
  57. /// Current length of the suspension.
  58. hkReal m_currentSuspensionLength;
  59. /// Current direction of the suspension (in world space).
  60. hkVector4 m_suspensionDirectionWs;
  61. /// Axis relative to the chassis that the wheel is spinning around.
  62. hkVector4 m_spinAxisChassisSpace;
  63. /// Axis in world space that the wheel is spinning around.
  64. hkVector4 m_spinAxisWs;
  65. /// The current rotation of the steering wheel.
  66. hkQuaternion m_steeringOrientationChassisSpace;
  67. /// The current spin velocity of the wheel in rad/s.
  68. hkReal m_spinVelocity;
  69. /// The current spin angle of the wheel in rads.
  70. hkReal m_spinAngle;
  71. /// The energy density lost when skidding (useful to implement tyre marks or skid sounds).
  72. hkReal m_skidEnergyDensity;
  73. /// The side force at the particular wheel.
  74. hkReal m_sideForce;
  75. /// The forward velocity lost by this particular wheel when slipping. 
  76. /// This is the difference between the linear velocity of the wheels 
  77. /// (angular velocity projected) and the actual velocity of the vehicle
  78. hkReal m_forwardSlipVelocity;
  79. /// The slip velocity in the side direction for the particular wheel.
  80. hkReal m_sideSlipVelocity;
  81. void init();
  82. };
  83. /// Default constructor, the chassis rigid body must be constructed already.
  84. hkpVehicleInstance( hkpRigidBody* chassis );
  85. ~hkpVehicleInstance();
  86. //
  87. // Methods
  88. //
  89. /// Call to initialize any data that is derived from the initially setup data, such
  90. /// as the number of wheels on each axle.
  91. virtual void init();
  92. /// Applies the vehicle controller at a given time / timestep. This function
  93. /// updates the physical state of the vehicle.
  94. virtual void applyAction(const class hkStepInfo& stepInfo);
  95. /// Clone functionality from hkpAction. Will make a new vehicle instance
  96. /// sharing as much data as it can.
  97. virtual hkpAction* clone( const hkArray<hkpEntity*>& newEntities, const hkArray<hkpPhantom*>& newPhantoms ) const;
  98. /// This forwards to hkpVehicleWheelCollide::getPhantoms
  99. virtual void getPhantoms( hkArray<hkpPhantom*>& phantomsOut );
  100. //
  101. // Functions to calculate useful information.
  102. //
  103. /// Calculate the current position and rotation of a wheel for the graphics engine.
  104. virtual void calcCurrentPositionAndRotation( const hkpRigidBody* chassis, const hkpVehicleSuspension* suspension, int wheelNo, hkVector4& posOut, hkQuaternion& rotOut );
  105. /// Retrieves the current RPM of the vehicle
  106. virtual hkReal calcRPM() const;
  107. /// Retrieves the current speed of the vehicle in KM/H
  108. virtual hkReal calcKMPH() const;
  109. /// Retrieves the current speed of the vehicle in MP/H
  110. virtual hkReal calcMPH() const;
  111. /// Retrieve the velocity for a fixed ground object.
  112. /// You can override this function if you want to assign velocity to ground objects
  113. /// like speed pads
  114. virtual void handleFixedGroundAccum( hkpRigidBody* ground, hkpVelocityAccumulator& accum );
  115. //
  116. // Internal functions
  117. //
  118. protected:
  119. void updateWheelsHardPoints(const hkTransform &car_transform);
  120. //
  121. // Members
  122. //
  123. public:
  124. /// Contains data about the vehicle that can be shared across several vehicles.
  125. class hkpVehicleData* m_data;
  126. /// The DriverInput  for the vehicle.
  127. class hkpVehicleDriverInput* m_driverInput;
  128. /// The Steering  for the vehicle.
  129. class hkpVehicleSteering* m_steering;
  130. /// The Engine  for the vehicle.
  131. class hkpVehicleEngine* m_engine;
  132. /// The Transmission  for the vehicle.
  133. class hkpVehicleTransmission* m_transmission;
  134. /// The Brake  for the vehicle.
  135. class hkpVehicleBrake* m_brake;
  136. /// The Suspension  for the vehicle.
  137. class hkpVehicleSuspension* m_suspension;
  138. /// The Aerodynamics  for the vehicle.
  139. class hkpVehicleAerodynamics* m_aerodynamics;
  140. /// The Collision  for the vehicle.
  141. class hkpVehicleWheelCollide* m_wheelCollide;
  142. /// The Tyremarks controller  for the vehicle.
  143. class hkpTyremarksInfo* m_tyreMarks;
  144. /// The list of external vehicle controllers.
  145. class hkpVehicleVelocityDamper* m_velocityDamper;
  146. /// The WheelInfo class holds all wheel information generated externally (from the
  147. /// physics engine) such as each wheel's ground contact, sliding state, forces,
  148. /// contact friction etc. Since all information is shared between several
  149. /// s, none of it does not belong in any one. 
  150. hkArray<struct WheelInfo> m_wheelsInfo;
  151. struct hkpVehicleFrictionStatus m_frictionStatus;
  152. //
  153. // Variables used by the components to cache data.
  154. // This is slightly ugly, but necessary until it is possible until a 
  155. // decent runtime cache manager can be constructed.
  156. //
  157. /// Current controller input state.
  158. class hkpVehicleDriverInputStatus* m_deviceStatus; 
  159. // from brake
  160. hkArray<hkBool> m_isFixed;
  161. hkReal m_wheelsTimeSinceMaxPedalInput;
  162. // from driver input
  163. hkBool m_tryingToReverse;
  164. // from engine
  165. hkReal m_torque;
  166. hkReal m_rpm;
  167. // from steering
  168. hkReal m_mainSteeringAngle;
  169. hkArray<hkReal> m_wheelsSteeringAngle;
  170. // from transmission
  171. hkBool m_isReversing;
  172. hkInt8 m_currentGear;
  173. hkBool m_delayed;
  174. hkReal m_clutchDelayCountdown;
  175. public:
  176. /// Get a pointer the vehicle's chassis.
  177. inline class hkpRigidBody* getChassis ( void ) const;
  178. /// Set the chassis of the vehicle.
  179. /// This should only be called before the vehicle has been added to the
  180. /// world.
  181. void setChassis ( class hkpRigidBody* chassis );
  182. hkpVehicleInstance( hkFinishLoadedObjectFlag f ) : hkpUnaryAction(f), m_wheelsInfo(f), m_frictionStatus(f), m_isFixed(f), m_wheelsSteeringAngle(f) { }
  183. };
  184. #include <Physics/Vehicle/hkpVehicleInstance.inl>
  185. #endif // HKVEHICLE_HKVEHICLEINSTANCE_H
  186. /*
  187. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  188. * Confidential Information of Havok.  (C) Copyright 1999-2009
  189. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  190. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  191. * rights, and intellectual property rights in the Havok software remain in
  192. * Havok and/or its suppliers.
  193. * Use of this software for evaluation purposes is subject to and indicates
  194. * acceptance of the End User licence Agreement for this product. A copy of
  195. * the license is included with this software and is also available at www.havok.com/tryhavok.
  196. */