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

3D图形编程

开发平台:

Visual C++

  1. //############################################################
  2. // 
  3. // RigidScan.h
  4. //
  5. // Kari Pulli
  6. // Mon Jun 29 11:51:05 PDT 1998
  7. //
  8. // An abstract base class for holding all the scanner specific
  9. // information of a complete scan.
  10. //
  11. // This class is meant to form an abstraction between the raw
  12. // (or minimally processed) data from various scanners and
  13. // the algorithms that are used to (at least)
  14. //    o  display the data for view planning, registration, etc.,
  15. //       possibly using a limited polygon budget; 
  16. //    o  determine a volumetric approximate model of the target; 
  17. //    o  fit an accurate surface description of the target using 
  18. //       the range data;
  19. //    o  associate possible input color with scanned geometry.
  20. //
  21. // The logical unit is a single rigidly registered scan.
  22. // This can mean different things for different scanners.
  23. //    o  Cyrax: probably just a single scan.
  24. //    o  Cyberware custom statue scanner: it may include
  25. //       dozens of scan sweeps as long as the base of the 
  26. //       scanner was not moved. 
  27. //    o  Modelmaker the data from a single Faro position.
  28. //    o  Generic scanner: Any other scanner from which we
  29. //       don't know much more than range maps.
  30. //
  31. //############################################################
  32. #ifndef _RIGID_SCAN_H_
  33. #define _RIGID_SCAN_H_
  34. #include <vector.h>
  35. #include <rope.h>
  36. #include "ResolutionCtrl.h"
  37. #include "TbObj.h"
  38. #include "Xform.h"
  39. #include "Pnt3.h"
  40. class VertexFilter;
  41. class MeshTransport;
  42. typedef unsigned char uchar;
  43. typedef enum {  // The queried entity is (in the precedence order)
  44.   OUTSIDE,        //   in front of data
  45.   BOUNDARY,       //   intersects data
  46.   SILHOUETTE,     //   partially behind data, does not intersect
  47.   INSIDE,         //   behind data
  48.   NOT_IN_FRUSTUM, //   not in the view frustum of scanner
  49.   INDETERMINATE   //   nothing is known (maybe missing data)
  50. } OcclusionStatus, OccSt;
  51. class RigidScan : public ResolutionCtrl, public TbObj {
  52. private:
  53.   // inherit from ResolutionCtrl:
  54.   // vector<res_info> resolutions;
  55.   // int              curr_res;
  56.   // crope            name
  57.   // crope            basename
  58.   // crope            ending
  59.   //
  60.   // inherit from TbObj:
  61.   // Xform<float>     xf;
  62.   // Pnt3             rot_ctr;
  63.   // Bbox             bbox;
  64. public:
  65.   RigidScan();
  66.   virtual ~RigidScan() {}
  67.   //////////////////////////////////////////////////////////////
  68.   // Data access methods
  69.   //////////////////////////////////////////////////////////////
  70.   enum ColorSource { colorNone, colorIntensity, colorTrue,
  71.      colorConf, colorBoundary };
  72.   // perVertex: colors and normals for every vertex (not every 3)
  73.   // stripped: triangle strips instead of triangles
  74.   // color: one of the above enum values
  75.   // colorsize: # of bytes for color: 1 = intensity,
  76.   //              2 = intensity+alpha, 3 = rgb, 4 = rgba
  77.   virtual MeshTransport* mesh(bool         perVertex = true,
  78.       bool         stripped  = true,
  79.       ColorSource  color = colorNone,
  80.       int          colorSize = 3) = 0;
  81.   // scans that don't want to return a MeshTransport can render themselves 
  82.   // any way they want.
  83.   virtual bool render_self (ColorSource color = colorNone);
  84.   
  85.   virtual int  num_vertices(void);
  86.   virtual void subsample_points(float rate, vector<Pnt3> &p,
  87. vector<Pnt3> &n);
  88.   virtual RigidScan* filtered_copy(const VertexFilter &filter);
  89.   virtual bool filter_inplace(const VertexFilter &filter);
  90.   virtual bool filter_vertices (const VertexFilter& filter, vector<Pnt3>& p);
  91.   virtual crope getInfo(void);
  92.   virtual void flipNormals (void);
  93.   virtual void computeBBox (void);
  94.   virtual unsigned long byteSize() { return 0; }
  95.   //////////////////////////////////////////////////////////////
  96.   // Volume methods (space carving)
  97.   // performed in world coordinates
  98.   //////////////////////////////////////////////////////////////
  99.   virtual OccSt carve_cube  (const Pnt3 &ctr, float side);
  100.   virtual OccSt carve_sphere(const Pnt3 &ctr, float radius);
  101.   //////////////////////////////////////////////////////////////
  102.   // Point methods (registration, signed-distance function, ...)
  103.   // a float return value is always confidence/weight [0,1]
  104.   //////////////////////////////////////////////////////////////
  105.   // for ICP registration: 
  106.   // returns
  107.   // TRUE: closest point with normal withig 45 deg is within dThr
  108.   // FALSE: isn't or that point is on boundary when not allowed
  109.   virtual bool
  110.     closest_point(const Pnt3 &p, const Pnt3 &n, 
  111.   Pnt3 &cl_pnt, Pnt3 &cl_nrm,
  112.   float thr = 1e33, bool bdry_ok = 0);
  113. #if 0   // unused, never overridden, causes compile warnings
  114.   // for something else...
  115.   virtual float 
  116.   closest_point(const Pnt3 &p, Pnt3 &cl_pnt);
  117.   virtual float 
  118.   closest_point(const Pnt3 &p, Pnt3 &cl_pnt, Pnt3 &cl_nrm);
  119. #endif
  120.   // for volumetric processing
  121.   virtual float 
  122.   closest_point_on_mesh(const Pnt3 &p, Pnt3 &cl_pnt, OccSt &status_p);
  123.   virtual float 
  124.   closest_along_line_of_sight(const Pnt3 &p, Pnt3 &cp, 
  125.       OccSt &status_p);
  126.   virtual float 
  127.   closest_along_line(const Pnt3 &p, const Pnt3 &dir,
  128.      Pnt3 &cp, OccSt &status_p);
  129.   virtual float 
  130.   color_along_line_of_sight(const Pnt3 &p, float rgb[3]);
  131.   virtual float 
  132.   color_along_line_of_sight(const Pnt3 &p, uchar rgb[3]);
  133.   //////////////////////////////////////////////////////////////
  134.   // File I/O
  135.   //////////////////////////////////////////////////////////////
  136.   virtual bool read(const crope &fname);
  137.   // is data worth saving?
  138.   virtual bool is_modified (void);
  139.   // save to given name: if default, save to existing name if there is
  140.   // one, or return false if there's not
  141.   virtual bool write(const crope& fname = crope()); 
  142.   // for saving individual meshes
  143.   virtual bool write_resolution_mesh (int npolys,
  144.       const crope& fname = crope(),
  145.       Xform<float> xfBy = Xform<float>());
  146.   // for saving anything else
  147.      // if you cut-and-paste these function delcarations to the .h file
  148.      // for a subclass, don't copy the enum MetaData declaration
  149.      // or the virtual function override will fail!
  150.   enum MetaData { md_xform };
  151.   virtual bool write_metadata (MetaData data);
  152.   ////////////////////////////////////////////////////////////////
  153.   // Aggregation
  154.   ////////////////////////////////////////////////////////////////
  155.   virtual bool get_children (vector<RigidScan*>& children) const;
  156. };
  157. #endif /* _RIGID_SCAN_H_ */