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

3D图形编程

开发平台:

Visual C++

  1. //############################################################
  2. // 
  3. // CyberScan.h
  4. //
  5. // Kari Pulli
  6. // Wed Jul  8 13:15:25 PDT 1998
  7. //
  8. // Store range scan information from a Cyberware custom made
  9. // range scanner for the Digital Michelangelo project.
  10. //
  11. //############################################################
  12. #ifndef _CyberSCAN_H_
  13. #define _CyberSCAN_H_
  14. #include <string>
  15. #include "RigidScan.h"
  16. //#include "CyberXform.h"
  17. #include "DrawObj.h"
  18. #include "SDfile.h"
  19. class KDindtree;
  20. class CyberSweep;
  21. // this data used only for registration
  22. struct regLevelData
  23. {
  24.   vector<Pnt3>  *pnts;
  25.   vector<short> *nrms;
  26.   vector<char>  *bdry;
  27.   bool bFree;
  28.   regLevelData()  
  29.     { pnts = NULL; nrms = NULL; bdry = NULL; bFree = false; }
  30.   ~regLevelData() 
  31.     { if (bFree) { delete pnts; delete nrms; delete bdry; } }
  32. };
  33. // carving spheres...
  34. struct carveStackEntry {
  35.   Pnt3  ctr;
  36.   float radius;
  37.   vector<CyberSweep*> sweeps;
  38.   carveStackEntry(const Pnt3 &c, float r, const vector<CyberSweep*> &sw)
  39.     : ctr(c), radius(r)
  40.     {
  41.       for (int i=0; i<sw.size(); i++) {
  42. sweeps.push_back(sw[i]);
  43.       }
  44.     }      
  45.   carveStackEntry(const Pnt3 &c, float r)
  46.     : ctr(c), radius(r)
  47.     {}      
  48.   bool can_be_child(const Pnt3 &c, float r)
  49.     {
  50.       return dist(c,ctr) + r <= radius;
  51.     }
  52. };
  53. class CyberScan : public RigidScan {
  54. private:
  55.   // the raw data
  56.   vector<CyberSweep*> sweeps;
  57.   bool bDirty;
  58.   // for registration
  59.   vector<KDindtree*> kdtree;
  60.   vector<regLevelData*> reglevels;
  61.   KDindtree*     get_current_kdtree (void);
  62.   regLevelData*  getHighestRegLevel (void);
  63.   regLevelData*  getCurrentRegLevel (void);
  64.   regLevelData*  getRegLevelFor (int iRes);
  65.   void read_postprocess(const char *filename);
  66.   // for space carving
  67.   vector<carveStackEntry> carveStack;
  68. public:
  69.   CyberScan(void);
  70.   ~CyberScan(void);
  71.   // perVertex: colors and normals for every vertex (not every 3)
  72.   // stripped:  triangle strips instead of triangles
  73.   // color: one of the enum values from RigidScan.h
  74.   // colorsize: # of bytes for color
  75.   virtual MeshTransport* mesh(bool         perVertex = true,
  76.       bool         stripped  = true,
  77.       ColorSource  color = colorNone,
  78.       int          colorSize = 3);
  79.   
  80.   int  num_vertices(void);
  81.   void subsample_points(float rate, vector<Pnt3> &p,
  82. vector<Pnt3> &n);
  83.   RigidScan* filtered_copy (const VertexFilter &filter);
  84.   RigidScan* get_piece (int sweepNumber, int frameStart, int frameFinish);
  85.   bool filter_inplace      (const VertexFilter &filter);
  86.   bool filter_vertices     (const VertexFilter &filter, 
  87.     vector<Pnt3>& p);
  88.   bool closest_point(const Pnt3 &p, const Pnt3 &n, 
  89.      Pnt3 &cp, Pnt3 &cn,
  90.      float thr = 1e33, bool bdry_ok = 0);
  91.   void computeBBox();
  92.   void flipNormals();
  93.   virtual crope getInfo(void);
  94.   unsigned int get_scanner_config(void);
  95.   float get_scanner_vertical(void);
  96.   // These two methods are for jedavis's image stuff...
  97.   bool worldCoordToSweepCoord(const Pnt3 &wc, int *sweepIndex, Pnt3 &sc);
  98.   void sweepCoordToWorldCoord(int sweepIndex, const Pnt3 &sc, Pnt3 &wc);
  99.   bool read(const crope &fname);
  100.   bool write(const crope &fname);
  101.   bool is_modified (void);
  102.   bool load_resolution (int iRes);
  103.   int  create_resolution_absolute(int budget = 0, 
  104.   Decimator dec = decQslim);
  105.   virtual bool release_resolution(int nPolys);
  106.   // for auto-aligning
  107.   vector< vector<CyberSweep*> > get_ordered_sweeps (void);
  108.   vector<CyberSweep*> get_sweep_list (void);
  109.   void dump_pts_laser_subsampled(std::string fname,
  110.  int nPnts);
  111.   bool get_raw_data(const Pnt3 &p, sd_raw_pnt &data);
  112.   // for volumetric processing
  113.   virtual float 
  114.   closest_point_on_mesh(const Pnt3 &p, Pnt3 &cl_pnt, OccSt &status_p);
  115.   virtual float 
  116.   closest_along_line_of_sight(const Pnt3 &p, Pnt3 &cp, 
  117.       OccSt &status_p);
  118.   virtual OccSt carve_cube  (const Pnt3 &ctr, float side);
  119. protected:
  120.   virtual bool switchToResLevel (int iRes);
  121. };
  122. // this stores the actual rendering (and registration) data
  123. struct levelData {
  124.   vector<Pnt3>   pnts;
  125.   vector<short>  nrms;
  126.   vector<int>    tstrips;
  127.   vector<uchar>  intensity;
  128.   vector<char>   bdry; // 1 for boundary vtx (for registration)
  129.   // only important for subsampled levels:
  130.   // ratio of samples that were valid.
  131.   vector<uchar>  confidence; 
  132.                              
  133.   // this is a mapping from the indices of the sampled
  134.   // data to the unsampled (raw) data
  135.   // for level 0 this vector is empty (the mapping is identity)
  136.   vector<int>    map_sampled_to_unsampled;
  137. };  
  138. // This class contains a set of scanlines for a single
  139. // other_screw value (turn if vertical scan, nod if horizontal).
  140. class CyberSweep : public RigidScan, public DrawObj {
  141.   friend class CyberScan;
  142. private: // mesh data for rendering
  143.   vector<levelData*> levels;
  144.   uchar              falseColor[3];
  145. private:
  146.   SDfile sd;
  147.   // implemented but stubbed out; CyberScan does the work
  148.   virtual MeshTransport* mesh(bool         perVertex = true,
  149.       bool         stripped  = true,
  150.       ColorSource  color = colorNone,
  151.       int          colorSize = 3);
  152.   void init_leveldata(void);
  153.   void insert_possible_resolutions(void);
  154.   
  155.   void simulateFaceNormals(vector<short> &faceNormals, int currentRes);
  156.   
  157. public:
  158.   CyberSweep(void);
  159.   ~CyberSweep(void);
  160.   void computeBBox();
  161.   void flipNormals();
  162.   bool read (const crope &fname);
  163.   bool write (const crope &fname);
  164.   bool load_resolution (int iRes);
  165.   vector<Pnt3> start, end;
  166.   void drawthis(void);
  167.   // stuff we have to support for self-alignment among sweeps
  168. private:
  169.   vector<KDindtree*> kdtree;
  170.   KDindtree*         get_current_kdtree (void);
  171. public:
  172.   void subsample_points(float rate, vector<Pnt3> &p,
  173. vector<Pnt3> &n);
  174.   RigidScan *filtered_copy(const VertexFilter &filter);
  175.   RigidScan *get_piece(int firstFrame, int lastFrame);
  176.   bool closest_point(const Pnt3 &p, const Pnt3 &n, 
  177.      Pnt3 &cp, Pnt3 &cn,
  178.      float thr = 1e33, bool bdry_ok = 0);
  179.   int num_frames(void)  { return sd.num_frames(); }
  180.   Xform<float> vrip_reorientation_frame() 
  181.     { return sd.vrip_reorientation_frame(); }
  182.   // debugging accessor
  183.   crope get_description (void) const;
  184.   virtual float 
  185.   closest_along_line_of_sight(const Pnt3 &p, Pnt3 &cp, 
  186.       OccSt &status_p);
  187.   OccSt carve_sphere(const Pnt3 &ctr, float r);
  188. };
  189. #endif /* _CyberSCAN_H_ */