TriMeshUtils.h
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:5k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. //############################################################
  2. // 
  3. // TriMeshUtils.h
  4. //
  5. // Kari Pulli
  6. // Thu Jul  9 15:50:50 PDT 1998
  7. //
  8. // Utility functions for triangle meshes that are represented
  9. // as list of vertices and list of indices that define the
  10. // mesh connectivity.
  11. //
  12. //############################################################
  13. #ifndef _TRIMESHUTILS_H_
  14. #define _TRIMESHUTILS_H_
  15. #include <vector.h>
  16. #include "Pnt3.h"
  17. // calculate vertex normals by averaging from triangle
  18. // normals (obtained from cross products)
  19. // possibly weighted with triangle areas
  20. void
  21. getVertexNormals(const vector<Pnt3> &vtx,
  22.  const vector<int>  &tri, 
  23.  bool                strips,
  24.  vector<short>      &nrm,
  25.  int useArea = 0);
  26. void
  27. pushNormalAsShorts (vector<short>& nrms, Pnt3 n);
  28. void
  29. pushNormalAsPnt3 (vector<Pnt3>& nrms, short* n, int i);
  30. // find the median (or percentile) edge length
  31. float
  32. median_edge_length(vector<Pnt3> &vtx,
  33.    vector<int>  &tri,
  34.    bool          strips = false,
  35.    int           percentile = 50);
  36. // find the median edge length
  37. // if a triangle has an edge that's longer than
  38. // factor times the median (or percentile), remove the triangle
  39. void 
  40. remove_stepedges(vector<Pnt3> &vtx,
  41.  vector<int>  &tri,
  42.  int           factor, 
  43.  int           percentile = 50,
  44.  bool          strips = false);
  45. // check whether some vertices in vtx are not being used
  46. // in tri
  47. // if so, remove them and also adjust the tri indices
  48. void
  49. remove_unused_vtxs(vector<Pnt3> &vtx,
  50.    vector<int>  &tri);
  51. // count #tris in tstrip
  52. int
  53. count_tris(const vector<int> &strips);
  54. void
  55. tris_to_strips(int numvertices,
  56.        const vector<int>& tris, 
  57.        vector<int>& tstripinds,
  58.        const char* name = NULL);
  59. void 
  60. strips_to_tris(const vector<int> &tstripinds, 
  61.        vector<int>& tris, int nTris = 0);
  62. void
  63. flip_tris(vector<int> &inds, bool stripped = 0);
  64. // assume bdry has the right size and has been initialized with
  65. // zeroes
  66. void
  67. mark_boundary_verts(vector<char> &bdry,
  68.     const vector<int> &tris);
  69. void
  70. distance_from_boundary(vector<float> &distances,
  71.        const vector<Pnt3> &pnts,
  72.        const vector<int> &tris);
  73. /* typedef: optLevelT
  74.  * -------
  75.  * Used to select the level of optimization for Decimate().
  76.  * Refers to the placement of points after pair contraction.
  77.  * The options:
  78.  *   - PLACE_ENDPOINTS: consider only the ends of the line segment
  79.  *   - PLACE_ENDORMID:  consider ends or mids of the line segment
  80.  *   - PLACE_LINE:      find the best position on the line segment
  81.  *   - PLACE_OPTIMAL:   find the best position anywhere in space
  82.  */
  83. typedef enum {
  84.   PLACE_ENDPOINTS, PLACE_ENDORMID, PLACE_LINE, PLACE_OPTIMAL 
  85. } optLevelT;
  86. // simplify a mesh using Michael Garlands qslim package
  87. void
  88. quadric_simplify(const vector<Pnt3> &vtx_in,
  89.  const vector<int>  &tri_in,
  90.  vector<Pnt3> &vtx_out,
  91.  vector<int>  &tri_out,
  92.  int           goal,
  93.  int           optLevel,
  94.  float         errLevel,
  95.  float         boundWeight);
  96. typedef unsigned char uchar;
  97. // write geometry/topology data, representing triangle mesh, as .ply file
  98. // supports various combinations of per-vertex data besides position;
  99. // others are possible if useful.
  100. //
  101. // Any form of write_ply_file that takes intensity can also take
  102. // true-color data with 3 or 4 bytes per vertex, and the first 3 bytes per 
  103. // vertex will be written out as RGB components.  It's not currently
  104. // supported to write both intensity and RGB color but it could be added
  105. // in the future if useful.
  106. void
  107. write_ply_file(const char *fname,
  108.        const vector<Pnt3> &vtx,
  109.        const vector<int> &tris, bool strips);
  110. void
  111. write_ply_file(const char *fname,
  112.        const vector<Pnt3> &vtx,
  113.        const vector<int> &tris, bool strips,
  114.        const vector<float> &confidence);
  115. void
  116. write_ply_file(const char *fname,
  117.        const vector<Pnt3> &vtx,
  118.        const vector<int> &tris, bool strips,
  119.        const vector<uchar> &intensity);
  120. void
  121. write_ply_file(const char *fname,
  122.        const vector<Pnt3> &vtx,
  123.        const vector<int> &tris, bool strips,
  124.        const vector<Pnt3> &nrm);
  125. void
  126. write_ply_file(const char *fname,
  127.        const vector<Pnt3> &vtx,
  128.        const vector<int> &tris, bool strips,
  129.        const vector<Pnt3> &nrm,
  130.        const vector<uchar> &intensity);
  131. void
  132. write_ply_file(const char *fname,
  133.        const vector<Pnt3> &vtx,
  134.        const vector<int> &tris, bool strips,
  135.        const vector<Pnt3> &nrm,
  136.        const vector<float> &confidence);
  137. void
  138. write_ply_file(const char *fname,
  139.        const vector<Pnt3> &vtx,
  140.        const vector<int> &tris, bool strips,
  141.        const vector<uchar> &intensity,
  142.        const vector<float> &confidence);
  143. void
  144. write_ply_file(const char *fname,
  145.        const vector<Pnt3> &vtx,
  146.        const vector<int> &tris, bool strips,
  147.        const vector<Pnt3> &nrm,
  148.        const vector<uchar> &intensity,
  149.        const vector<float> &confidence);
  150. #endif  // TRIMESHUTILS_H_