hkpPoweredChainData.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 HK_DYNAMICS2_POWERED_CHAIN_H
  9. #define HK_DYNAMICS2_POWERED_CHAIN_H
  10. #include <Physics/ConstraintSolver/Solve/hkpSolverResults.h>
  11. #include <Physics/ConstraintSolver/Constraint/Atom/hkpConstraintAtom.h>
  12. #include <Physics/Dynamics/Constraint/Chain/hkpConstraintChainData.h>
  13. #include <Physics/Dynamics/Action/hkpArrayAction.h>
  14. /// hkPoweredChainData connects a series of bodies by 6d constraints.
  15. ///
  16. /// The powered chain is essentially composed of a hkpBallSocketChainData with angular motors added on top of it. 
  17. ///
  18. /// hkpPoweredChainData is suited to the accurate simulation of character limbs.
  19. /// This constraints also allows for motors with a torque limit to model real human muscles.
  20. class hkpPoweredChainData : public hkpConstraintChainData
  21. {
  22. public:
  23. HK_DECLARE_REFLECTION();
  24. HK_DECLARE_CLASS_ALLOCATOR( HK_MEMORY_CLASS_CONSTRAINT); 
  25. hkpPoweredChainData();
  26. ~hkpPoweredChainData();
  27. /// Not implemented. Returns always true.
  28. hkBool isValid() const { return true; }
  29. /// Get type from this constraint.
  30.   virtual int getType() const;
  31. /// Returns the number of stored constraint infos.
  32. virtual int getNumConstraintInfos() { return m_infos.getSize(); }
  33. /// Adds a constraint info to the chain.
  34. /// param pivotInA Pivot point in bodyA's local space. 
  35. /// param pivotInB Pivot point in bodyB's local space. 
  36. /// param aTc Relative orientation of the two bodies to be enforced. Specifies orientation of bodyB reference direction in relation to bodyA's space.
  37. /// param bTc Relative orientation of the motors' space. Specifies orientation of the motors in bodyB's space.
  38. /// param switchBodies When set the link is 'reversed' and treates bodyB as bodyA and the other way around.
  39. /// param motor Motor that is to be used by the constraints. The motor specifies the maximum forces exerted at the constraint, and
  40. ///                         error correction parameters.
  41. void addConstraintInfoInBodySpace(const hkVector4& pivotInA, const hkVector4& pivotInB, const hkQuaternion& aTc,
  42. class hkpConstraintMotor* xMotor, class hkpConstraintMotor* yMotor, class hkpConstraintMotor* zMotor);
  43. /// This is disables processing of a motor in a chain. An excluded motor is always processed by the iterative solver before other constraints in the chain.
  44. static void HK_CALL enableMotor(class hkpConstraintChainInstance* instance, int constraintIndex, int motorIndex);
  45. /// This is re-enables processing of a motor in a chain. Initially all motors are enabled.
  46. static void HK_CALL disableMotor(class hkpConstraintChainInstance* instance, int constraintIndex, int motorIndex);
  47. public:
  48. struct Runtime
  49. {
  50. // Stores hkpSolverResults                [6 * m_infos.getSize()]
  51. //        hkp3dAngularMotorSolverInfo::Status [m_infos.getSize()] // flags for angular constraints
  52. //        hkQuaternion                   [m_infos.getSize()] // motor's runtime data
  53. };
  54. inline const Runtime* getRuntime( hkpConstraintRuntime* runtime )     { return reinterpret_cast<Runtime*>(runtime); }
  55. inline hkpSolverResults* getSolverResults(hkpConstraintRuntime* runtime) { return reinterpret_cast<hkpSolverResults*>( runtime ); }
  56. // assuming we always want solver results
  57. // -- other wise swap the order of solverResults and externalRuntimeData 
  58. inline hkp3dAngularMotorSolverInfo::Status* getConstraintFlags(hkpConstraintRuntime* runtime)
  59. {
  60. return reinterpret_cast<hkp3dAngularMotorSolverInfo::Status*>( hkAddByteOffset(runtime, m_infos.getSize() * 6 * sizeof(hkpSolverResults) ));
  61. }
  62. inline hkReal* getMotorRuntimeQuaternions( hkpConstraintRuntime* runtime)
  63. {
  64. return reinterpret_cast<hkReal*>( hkAddByteOffset( getConstraintFlags(runtime), HK_NEXT_MULTIPLE_OF(4, m_infos.getSize() * sizeof(hkp3dAngularMotorSolverInfo::Status)) ) );
  65. }
  66. public:
  67. //
  68. // Internal functions
  69. //
  70. /// Interface implementation.
  71. virtual void buildJacobian( const hkpConstraintQueryIn &in, hkpConstraintQueryOut &out );
  72. /// Interface implementation.
  73. virtual void getConstraintInfo( hkpConstraintData::ConstraintInfo& infoOut ) const;
  74. /// Interface implementation.
  75. virtual void getRuntimeInfo( hkBool wantRuntime, hkpConstraintData::RuntimeInfo& infoOut ) const;
  76. public:
  77. /// Serialization ctor.
  78. hkpPoweredChainData(hkFinishLoadedObjectFlag f);
  79. public:
  80. struct hkpBridgeAtoms m_atoms;
  81. struct ConstraintInfo
  82. {
  83. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, hkpPoweredChainData::ConstraintInfo );
  84. HK_DECLARE_REFLECTION();
  85. /// Constraint's pivot point in bodyA's space.
  86. hkVector4 m_pivotInA;
  87. /// Constraint's pivot point in bodyB's space.
  88. hkVector4 m_pivotInB;
  89. /// Relative orientation of the two bodies to be enforced. Specifies orientation of bodyB's reference direction in relation to bodyA's space.
  90. hkQuaternion m_aTc;
  91. /// Specifies the reference frame of the constraint in the bodyB's space (or bodyA's space when m_switchBodies == true).
  92. hkQuaternion m_bTc; 
  93. /// Pointers to motors for the angular constraints. 
  94. // Those cannot be HK_NULL because we take tau/damping from them.
  95. class hkpConstraintMotor* m_motors[3];
  96. /// When set to true, it switches the roles of bodyA and bodyB:
  97. /// The target m_aTb quaternion is interpreted as m_bTa; the constraint space is aligned to the body A instead of body B.
  98. /// Note that the pivot vectors are not swapped.
  99. hkBool m_switchBodies;
  100. };
  101. /// Constraint infos for the chain's constraints.
  102. hkArray<struct ConstraintInfo> m_infos;
  103. /// Solver tau, this overrides the global value from hkpSolverInfo when processing the ball-socket part of the constraint.
  104. /// The angular parts use the tau/dumping values from the motors.
  105. hkReal m_tau;
  106. /// Solver damping, this overrides the global value from hkpSolverInfo.
  107. /// The angular parts use the tau/dumping values from the motors.
  108. hkReal m_damping;
  109. /// Constraint force mixing parameter.
  110. ///
  111. /// Adding this value makes the constraint softer and it behaves in a spring-like manner.
  112. /// This is achieved by adding this value to the diagonal of the constraint matrix for the linear velocity equations. 
  113. ///
  114. /// Should be zero or tiny, e.g. a fraction of HK_REAL_EPSILON. When this value is zero, then some chain configurations
  115. /// may result in a division by zero when solving.
  116. hkReal m_cfmLinAdd; //+default(0.1f*1.19209290e-07f)
  117. /// Constraint force mixing parameter, See m_cfmLinAdd for more details.
  118. /// 
  119. /// Multiplication factor for the diagonal value of the constraint matrix for the linear velocity equations. 
  120. /// This parameter should be equal or greater than 1.0f.  For visible effect try the value of 1.5f. You might set this value to as high as 10.0f.
  121. /// Note that in chains, you'd usually leave this parameter at 1.0f (as you rearely want to affect the ball-and-socket part of the chain) and 
  122. /// increase the angular-part cfm instead. 
  123. hkReal m_cfmLinMul; //+default(1.0f)
  124. /// Constraint force mixing parameter, see m_cfmLinAdd for more details.
  125. ///
  126. /// Should be zero or tiny, e.g. a fraction of HK_REAL_EPSILON. When this value is zero, then some chain configurations
  127. /// may result in a division by zero when solving.
  128. hkReal m_cfmAngAdd; //+default(0.1f*1.19209290e-07F)
  129. /// Constraint force mixing parameter, see m_cfmLinAdd for more details.
  130. /// 
  131. /// Multiplication factor for the diagonal value of the constraint matrix for the angular velocity equations. 
  132. /// This parameter should be equal or greater than 1.0f.  For visible effect try the value of 1.5f. You might set this value to as high as 10.0f.
  133. hkReal m_cfmAngMul; //+default(1.0f)
  134. /// Specifies the maximum distance error in constraints allowed before the stabilization algorithm kicks in.
  135. /// The algorithm eliminates explosions in may cases, but due to its nature it yields incorrect results in certain use cases.
  136. /// It is disabled by default.
  137. hkReal m_maxErrorDistance;
  138. };
  139. #endif // HK_DYNAMICS2_POWERED_CHAIN_H
  140. /*
  141. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  142. * Confidential Information of Havok.  (C) Copyright 1999-2009
  143. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  144. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  145. * rights, and intellectual property rights in the Havok software remain in
  146. * Havok and/or its suppliers.
  147. * Use of this software for evaluation purposes is subject to and indicates
  148. * acceptance of the End User licence Agreement for this product. A copy of
  149. * the license is included with this software and is also available at www.havok.com/tryhavok.
  150. */