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

其他游戏

开发平台:

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_CONSTRAINTSOLVER2_SIMPLEX_SOLVE_H
  9. #define HK_CONSTRAINTSOLVER2_SIMPLEX_SOLVE_H
  10. #include <Common/Base/hkBase.h>
  11. /// This represents a single constraint fed to the simplex solver
  12. struct hkpSurfaceConstraintInfo
  13. {
  14. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_CONSTRAINT_SOLVER, hkpSurfaceConstraintInfo );
  15. /// The plane direction (normally identical to the contact normal). Note: .w component is distance
  16. hkVector4 m_plane;
  17. /// The velocity of the plane
  18. hkVector4 m_velocity;
  19. /// The static friction (behaves pretty much as expected from real friction)
  20. hkReal m_staticFriction;
  21. /// An extra friction in the up direction, if this function is used (value != 0), then 
  22. /// the overall friction will be split into two components: 
  23. ///  - one in the most up direction
  24.     ///  - one which is perpendicular to the up direction
  25. /// Then each component is solved separately (box friction instead of friction circle)
  26. hkReal m_extraUpStaticFriction;
  27. /// Extra friction downward.
  28. hkReal m_extraDownStaticFriction;
  29. /// The dynamic friction:<br>
  30. ///  - if set to 1.0f, then the simplex will simply project the velocity onto each plane
  31. ///  - if set to 0.0f, then the algorithm will try to maintain the input velocity
  32. hkReal    m_dynamicFriction;
  33. /// The relative priority of the surface
  34. int   m_priority;
  35. };
  36. /// The input structure for the simplex solver
  37. struct hkpSimplexSolverInput
  38. {
  39. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_CONSTRAINT_SOLVER, hkpSimplexSolverInput );
  40. inline hkpSimplexSolverInput();
  41. /// The position of the particle
  42. hkVector4 m_position;
  43. /// The velocity of the particle
  44. hkVector4 m_velocity;
  45. /// This value is used by the simplex solver to decide whether to solve planes
  46. /// simultaneously or not.  The problem is that when two planes are nearly parallel
  47. /// the simultaneous (and correct) solution to the problem can be a very large vector.
  48. /// It is often preferable to penetrate a plane, to avoid this result.  This value
  49. /// is used by the solver to determine when to penetrate a plane rather than solve
  50. /// planes simultaneously. If a simultaneous solve results in a velocity greater than
  51. /// this value, then the solver will disregard this result and solve the planes 
  52. /// sequentially. In this case, the output will be penetrating the lowest priority
  53. /// plane.
  54. hkVector4 m_maxSurfaceVelocity;
  55. /// This is used in conjunction with the box friction model
  56. hkVector4 m_upVector;
  57. /// The timeslice 
  58. hkReal   m_deltaTime;
  59. /// The minimum time we should walk before exiting
  60. hkReal   m_minDeltaTime;
  61. /// The input array of surface constraints
  62. hkpSurfaceConstraintInfo* m_constraints;
  63. /// The number of constraints in the array
  64. int m_numConstraints;
  65. };
  66. /// Contains the simplex results for each surface constraint
  67. struct hkpSurfaceConstraintInteraction
  68. {
  69. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_CONSTRAINT_SOLVER, hkpSurfaceConstraintInteraction );
  70. /// The status of the internal solving. Note: this list is order dependent
  71. enum hkpStatus
  72. {
  73. /// OK.
  74. HK_STATUS_OK = 0,
  75. /// 3D Failure.
  76. HK_STATUS_3D_FAILURE = 1,
  77. /// 2D Failure.
  78. HK_STATUS_2D_FAILURE = 2
  79. };
  80. /// If m_touched is set to true, then the characterController touched this plane
  81. hkUint8      m_touched;
  82. /// If this value is set to true, then the simplex had to kill the velocity of this plane to find a successful solution
  83. hkUint8      m_stopped;
  84. /// The time spent in contact with this surface
  85. hkReal    m_surfaceTime;
  86. hkReal    m_penaltyDistance; // for internal use only
  87. hkpStatus  m_status;
  88. };
  89. /// Output structure for the simplex solver.
  90. struct hkpSimplexSolverOutput
  91. {
  92. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_CONSTRAINT_SOLVER, hkpSimplexSolverOutput );
  93. /// Position.
  94. hkVector4   m_position;
  95. /// Velocity.
  96. hkVector4   m_velocity;
  97. /// The time solved to if the output m_deltaTime is < the input m_deltaTime then the simplex hit a surface
  98. /// Continue to iterate to complete the timestep
  99. hkReal   m_deltaTime;
  100. /// The output interaction array - this should be the same size as the input constraints array
  101. hkpSurfaceConstraintInteraction* m_planeInteractions;
  102. };
  103. extern "C"
  104. {
  105. // Solves for the motion of a particle in a set on dynamic plane constraints
  106. void HK_CALL hkSimplexSolverSolve( const hkpSimplexSolverInput& input, hkpSimplexSolverOutput& output );
  107. }
  108. hkpSimplexSolverInput::hkpSimplexSolverInput()
  109. {
  110. m_upVector.set(0,1,0);
  111. m_maxSurfaceVelocity.setAll3( HK_REAL_EPSILON );
  112. m_position.setZero4();
  113. }
  114. #endif //HK_CONSTRAINTSOLVER2_SIMPLEX_SOLVE_H
  115. /*
  116. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  117. * Confidential Information of Havok.  (C) Copyright 1999-2009
  118. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  119. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  120. * rights, and intellectual property rights in the Havok software remain in
  121. * Havok and/or its suppliers.
  122. * Use of this software for evaluation purposes is subject to and indicates
  123. * acceptance of the End User licence Agreement for this product. A copy of
  124. * the license is included with this software and is also available at www.havok.com/tryhavok.
  125. */