hkGeometryUtility.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_GEOMETRYUTILITY_H
  9. #define HK_GEOMETRYUTILITY_H
  10. #include <Common/Base/Types/Geometry/hkStridedVertices.h>
  11. #include <Common/Base/Types/Geometry/hkGeometry.h>
  12. class hkVector4;
  13. class hkSphere;
  14. class hkGeomHull;
  15. /// Used to specify any modifications to the behaviour of the convex hull builder.
  16. enum hkGeomConvexHullMode
  17. {
  18. ///
  19. HK_GEOM_CONVEXHULL_MODE_INVALID,
  20. /// Default: fast mode.
  21. HK_GEOM_CONVEXHULL_MODE_FAST,
  22. /// Should not be used when the algorithm is being called at runtime,
  23. /// and really only should be called offline by the hkpConvexPieceMeshBuilder
  24. /// utility, because it can be very slow and only offers accuracy improvements
  25. /// in a limited number of cases, such as when the input is nearly completely
  26. /// a 2d object with a large number of vertices spread over a large distance.
  27. HK_GEOM_CONVEXHULL_MODE_ACCURATE_BUT_SLOW,
  28. ///
  29. HK_GEOM_CONVEXHULL_MODE_MAX_ID
  30. };
  31. /// Used to specify any modifications to the behaviour of the OBB builder.
  32. enum hkGeomObbMode
  33. {
  34. ///
  35. HK_GEOM_OBB_MODE_INVALID,
  36. /// Default: normal mode. The mimics the calculations used prior to Havok 3.3, and
  37. /// is used in the filter pipeline.
  38. HK_GEOM_OBB_MODE_DEFAULT,
  39. /// Produces tighter-fitting bounding boxes, but may be considerably slower.
  40. /// The algorithm uses the normal result as a starting guess, and then iteratively
  41. /// improves the box to reduce the total volume.
  42. HK_GEOM_OBB_MODE_BETTER_FIT_BUT_SLOWER,
  43. ///
  44. HK_GEOM_OBB_MODE_MAX_ID
  45. };
  46. ///
  47. /// Convex hull generator: Calculated the convex hull of a set of vertices in 3-space.
  48. ///
  49. /// The convex hull algorithm is used in several places in our current product:
  50. ///  - Generation of plane equations for convex vertices shapes. These are used for ray-casting.
  51. ///  - Generation of visualisation code for display of convex vertices shapes (in the visual debugger)
  52. ///  - Generation of a hull for calculating an inertia tensor for convex vertices shapes.
  53. ///
  54. class hkGeometryUtility
  55. {
  56. public:
  57. //
  58. // GEOMETRY CONVEXITY AND CREATION FUNCTIONS
  59. //
  60. /// Calculates the convex hull of the points in stridedVertsIn and returns the vertices used and the geometry of hull.
  61. static void HK_CALL createConvexGeometry( const hkStridedVertices& stridedVertsIn, hkGeometry& geometryOut, hkGeomConvexHullMode mode = HK_GEOM_CONVEXHULL_MODE_FAST );
  62. /// Calculates the convex hull of the points in stridedVertsIn and returns the vertices used, the plane equations generated and the geometry of hull.
  63. static void HK_CALL createConvexGeometry( const hkStridedVertices& stridedVertsIn, hkGeometry& geometryOut, hkArray<hkVector4>& planeEquationsOut, hkGeomConvexHullMode mode = HK_GEOM_CONVEXHULL_MODE_FAST );
  64. /// Calculates the vertices of the convex hull at the inner intersection of the specified plane equations.  Only one hull is found, and
  65. /// more plane equations than the minimum necessary can be specified.
  66. static void HK_CALL createVerticesFromPlaneEquations(  const hkArray<hkVector4>& planeEquationsIn, hkArray<hkVector4>& vertsOut );
  67. /// Calculates the geometry of the convex hull whose vertices are the intersections of the planeEquationsIn.
  68. static void HK_CALL createGeometryFromPlaneEquations(  const hkArray<hkVector4>& planeEquationsIn, hkGeometry& geometryOut );
  69.         // Calculate axis from covariance matrix
  70.     static hkBool HK_CALL getAxesFromCovariance(hkMatrix3 &covArray, hkVector4 &axis0, hkVector4 &axis1, hkVector4 &axis2);
  71. //
  72. // OTHER UTILITY FUNCTIONS
  73. //
  74. /// A utility class for creating oriented bounding boxes from a point cloud.
  75. /// This is useful if you want to create primitives from arbitrary geometry
  76. /// The OBB utility returns a position for the centre of the box, a set of
  77. /// 3 axes representing the orientation of the box, and a set of half extents
  78. /// representing the scale of the box.
  79. static void HK_CALL calcObb( const hkStridedVertices& stridedVertsIn, hkVector4& halfExtents, hkTransform& transform, hkGeomObbMode mode = HK_GEOM_OBB_MODE_DEFAULT);
  80. /// This method duplicates the functionality of the deprecated hkGeometryUtil::minSphere() method.n
  81. /// To avoid numerical roundoff error, a radiusEpsilon parameter must be passed.  The default should
  82. /// be sufficient to prevent error.n
  83. /// In certain (very rare) extreme cases this code may fail.
  84. ///
  85. /// param vertexArray A block of memory containing a number of hkVector4s, this is the cloud of points to bound
  86. /// param vertexCount The number of hkVector4s in the block of memory pointed to by the parameter vertices
  87. /// param radiusEpsilon To avoid numerical rounding error, the sphere calculated is increased in size by this value.
  88. ///                      which should not need to be changed.
  89. ///
  90. static hkSphere HK_CALL createMinBoundingSphere( const hkStridedVertices& stridedVertsIn, const hkReal radiusEpsilon = 1e-5f);
  91. /// Simple function to push out given planes by the desired distance. It just alters
  92. /// the w component (D) of each of the plane equations by the given amount (can be negative to shrink)
  93. static void HK_CALL expandPlanes(  hkArray<hkVector4>& planeEquations, hkReal byDistance );
  94. // INTERNAL
  95. static void getConvexHullFromStriding( const hkStridedVertices& stridedVertsIn, hkGeomHull& hullOut, hkArray<hkVector4>& usedVerticesOut, hkGeomConvexHullMode mode );
  96. };
  97. #endif // HK_GEOMETRYUTILITY_H
  98. /*
  99. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  100. * Confidential Information of Havok.  (C) Copyright 1999-2009
  101. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  102. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  103. * rights, and intellectual property rights in the Havok software remain in
  104. * Havok and/or its suppliers.
  105. * Use of this software for evaluation purposes is subject to and indicates
  106. * acceptance of the End User licence Agreement for this product. A copy of
  107. * the license is included with this software and is also available at www.havok.com/tryhavok.
  108. */