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

3D图形编程

开发平台:

Visual C++

  1. //############################################################
  2. // 
  3. // MMScan.h
  4. //
  5. // Jeremy Ginsberg
  6. // $Date: 2001/07/02 17:56:26 $
  7. //
  8. // Stores all information pertaining to a 3DScanners ModelMaker H
  9. // scan "conglomerate"... this contains many small scan fragments,
  10. // each of which can be characterized by a single viewing direction.
  11. //
  12. // Data structures revamped starting today to better encapsulate the
  13. // idea of a collection of scan fragments.
  14. //
  15. //############################################################
  16. #ifndef _MMSCAN_H_
  17. #define _MMSCAN_H_
  18. #include "RigidScan.h"
  19. #include "ResolutionCtrl.h"
  20. class KDindtree;
  21. class MMScan : public RigidScan {
  22. public:
  23.   // -----------------------------------------
  24.   // struct mmStripeInfo (MMScan.mmStripeInfo)
  25.   //    o  per-stripe information
  26.   //    o  the points for each stripe are conglomerated into vector vtx of
  27.   //       a given scan fragment
  28.   struct mmStripeInfo {
  29.     int numPoints;
  30.     int startIdx;                  // index of stripe's first point in vtx
  31.     Pnt3 sensorVec;                // scannning / viewing direction
  32.     unsigned char validMap[40];    // bitmap for placement along stripe
  33.                                    // 1 = valid pt    0 = invalid pt
  34.     char scanDir;                  // 0 = unknown; 1 = normal; 2 = backwards
  35.     mmStripeInfo(void)
  36.       {
  37. numPoints = 0; startIdx = -1; sensorVec.set(0,0,0); scanDir = 0;
  38.       }
  39.   };
  40.   // -----------------------------------------
  41.   // struct mmResLevel (MMScan.mmResLevel)
  42.   //    o triangle and t-strip information for a particular resolution
  43.   //    o more or less equivalent to the Mesh.cc class
  44.   struct mmResLevel {
  45.     vector<Pnt3>  vtx;
  46.     vector<short> nrm;
  47.     vector<uchar> intensity;
  48.     vector<float> confidence;
  49.     vector<int>   tris;
  50.     vector<int>   tstrips;
  51.     // no more per-face normals
  52.     //    vector<short> triNrm;
  53.     mmResLevel(void)
  54.       {
  55. tris.clear(); tstrips.clear(); 
  56. vtx.clear(); nrm.clear(); intensity.clear(); confidence.clear();
  57.       }
  58.     ~mmResLevel(void)
  59.       {
  60. tris.clear(); tstrips.clear(); 
  61. vtx.clear(); nrm.clear(); intensity.clear(); confidence.clear();
  62.       }
  63.     int num_tris(void)
  64.       {
  65. return tris.size() / 3;
  66.       }
  67.     int num_vertices(void)
  68.       {
  69. return vtx.size();
  70.       }
  71.   };
  72. typedef uchar vec3uc[3];
  73.   // -----------------------------------------
  74.   // struct mmScanFrag (MMScan.mmScanFrag)
  75.   //    o  a scan fragment is a series of meshes which can
  76.   //       be represented by a single vifilter_verticesew direction.
  77.   //    o  this is now the most basic level of organization of an MMScan
  78.   //    o  the raw data from the scanner and its connectivity information
  79.   //       are now stored in meshes[0], instead of directly in the scanFrag
  80.   struct mmScanFrag {
  81.     vector<mmStripeInfo> stripes;
  82.     vector<mmResLevel>   meshes;
  83.     vector<int>          indices;      // used for triangulation
  84.     Pnt3    viewDir;
  85.     vec3uc  falseColor;
  86.     bool    isVisible;
  87.     //    vector<char> boundary;   needed only for older confidence calcs
  88.     mmScanFrag(void)
  89.       {
  90. //stripes.clear(); meshes.clear();
  91. //viewDir.set(0,0,0); indices.clear();
  92. mmResLevel mainRes;
  93. meshes.push_back(mainRes);
  94. falseColor[0] = falseColor[1] = falseColor[2] = '';
  95. isVisible = true;
  96.       }
  97.     ~mmScanFrag(void)
  98.       {
  99. //stripes.clear(); meshes.clear(); indices.clear();
  100.       }
  101.     int num_vertices(int level)
  102.       {
  103. if (meshes.size() == 0) return 0;
  104. if (!isVisible) return 0;
  105. return meshes[level].vtx.size();
  106.       }
  107.     int num_stripes(void)
  108.       {
  109. return stripes.size();
  110.       }
  111.     int num_tris(void)
  112.       {
  113. if (meshes.size() == 0) return 0;
  114. if (!isVisible) return 0;
  115. return meshes[0].tris.size() / 3;
  116.       }
  117.   };
  118.   MMScan(void);
  119.   ~MMScan(void);
  120.   // perVertex: colors and normals for every vertex (not every 3)
  121.   // stripped:  triangle strips instead of triangles
  122.   // color: one of the enum values from RigidScan.h
  123.   // colorsize: # of bytes for color
  124.   virtual MeshTransport* mesh(bool         perVertex = true,
  125.       bool         stripped  = true,
  126.       ColorSource  color = colorNone,
  127.       int          colorSize = 3);
  128.   bool read(const crope &fname);
  129.   bool write(const crope &fname);
  130.   crope getInfo(void);
  131.   int num_vertices();
  132.   int num_vertices(int resNum);
  133.   void computeBBox (void);
  134.   void flipNormals (void);
  135.   bool filter_vertices (const VertexFilter& filter, vector<Pnt3>& p);
  136.   void subsample_points(float rate, vector<Pnt3> &p, vector<Pnt3> &n);
  137.   bool closest_point(const Pnt3 &p, const Pnt3 &n, 
  138.      Pnt3 &cp, Pnt3 &cn,
  139.      float thr = 1e33, bool bdry_ok = 0);
  140.   bool load_resolution (int iRes);
  141.   int create_resolution_absolute(int budget = 0,
  142.  Decimator dec = decQslim);
  143.   RigidScan* filtered_copy(const VertexFilter& filter);
  144.   bool filter_inplace(const VertexFilter &filter);
  145.   bool is_modified(void) {
  146.     return isDirty_disk;
  147.   }
  148.   // --- NOT INHERITED FROM RIGIDSCAN
  149.   int num_tris(int res = 0);
  150.   int num_stripes();
  151.   int num_scans(void) { return scans.size(); };
  152.   int num_resolutions(void) { 
  153.     // assume that each scan has the same number of resolutions
  154.     if (scans.size() == 0) return 0;
  155.     return scans[0].meshes.size();
  156.   };
  157.   
  158.   int write_xform_ply(int whichRes, char *dir,
  159.       crope &confLines, bool applyXform = true);
  160.   void flipNormals (int scanNum);
  161.   void absorb_xforms(char *basename);
  162.   void update_res_ctrl();
  163.   const vec3uc& getScanFalseColor(int scanNum)
  164.     {
  165.       if (scanNum >= scans.size()) scanNum = scans.size() - 1;
  166.       if (scanNum < 0) scanNum = 0;
  167.       return scans[scanNum].falseColor;
  168.     }
  169.   bool isScanVisible(int scanNum)
  170.     {
  171.       if (scanNum >= scans.size()) return false;
  172.       if (scanNum < 0) return false;
  173.       return scans[scanNum].isVisible;
  174.     }
  175.   void setScanVisible(int scanNum, int shouldBeVisible)
  176.     {
  177.       if ((scanNum >= scans.size()) || (scanNum < 0)) return;
  178.       scans[scanNum].isVisible = shouldBeVisible;
  179.     }
  180.   void deleteScan(int scanNum)
  181.     {
  182.       if (scanNum < 0) return;
  183.       if (scanNum >= num_scans()) return;
  184.       
  185.       scans.erase(&scans[0] + scanNum);
  186.       
  187.       isDirty_mem = isDirty_disk = true;
  188.       computeBBox();
  189.     }
  190.   
  191. private:
  192.   //--- DATA DIRECTLY FROM CTA FILE
  193.   vector<mmScanFrag> scans;         // scan information
  194.   //--- DERIVED FROM CTA DATA
  195.   // evil global arrays repeating all of the vertices and meshes in the
  196.   // scan fragments... i can't think of any other way to create a kdtree and
  197.   // boundary for the conglomerate, so we keep these around solely for that
  198.   // purpose.
  199.   struct mergedRegData {
  200.     vector<Pnt3>  vtx;
  201.     vector<short> nrm;
  202.     vector<int>   tris;
  203.     vector<char>  boundary;
  204.   };
  205.   vector<mergedRegData> regData;
  206.   vector<KDindtree*>    kdtree;
  207.   bool haveScanDir;
  208.   // dirty bits, for saving files, updating global arrays, etc.
  209.   bool isDirty_mem;
  210.   bool isDirty_disk;
  211.   //--- PRIVATE HELPERS FNS
  212.   bool read_mms(const crope &fname);
  213.   bool read_cta(const crope &fname);
  214.   mmResLevel *currentRes(int scanNum);
  215.   bool isValidPoint(int scanNum, int stripeNum, int colNum);
  216.   void triangulate(mmScanFrag *scan, mmResLevel *res, int subSamp = 1);
  217.   void make_tstrips(mmScanFrag *scan, mmResLevel *res, int subSamp = 1);
  218.   //  void drawSensorVecs(vector<int> &tris);
  219.   //  void calcTriNormals(const vector<int> &tris, vector<short> &triNrm);
  220.   void calcIndices(void);
  221.   void calcScanDir(void);
  222.   void calcConfidence(void);
  223.   mergedRegData& getRegData (void);
  224.   void mark_boundary (mergedRegData& reg);
  225.   KDindtree* get_kdtree(void);
  226.   bool stripeCompare(int strNum, mmScanFrag *scan);
  227.   void setMTColor (MeshTransport* mt, int iScan, bool perVertex,
  228.    ColorSource source, int colorSize);
  229. };
  230. //typedef MMScan::mmStripeInfo mmStripeInfo;
  231. typedef MMScan::mmResLevel mmResLevel;
  232. typedef MMScan::mmScanFrag mmScanFrag;
  233. #endif