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

3D图形编程

开发平台:

Visual C++

  1. //############################################################
  2. // 
  3. // RigidScan.cc
  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. #include "RigidScan.h"
  33. #include "MeshTransport.h"
  34. #include "TriMeshUtils.h"
  35. #include "plvScene.h"      // for meshes_written_stripped()
  36. #include "plvDraw.h"       // to know what color properties to write
  37. #include <fstream.h>       // for write_metadata
  38. RigidScan::RigidScan()
  39. {
  40. }
  41. bool
  42. RigidScan::render_self (ColorSource color)
  43. { return false; }
  44. int  
  45. RigidScan::num_vertices(void)
  46. { return 0; }
  47. void 
  48. RigidScan::subsample_points(float rate, vector<Pnt3> &p,
  49.     vector<Pnt3> &n)
  50. { }
  51. void
  52. RigidScan::flipNormals (void)
  53. { }
  54. void
  55. RigidScan::computeBBox (void)
  56. { }
  57. RigidScan* 
  58. RigidScan::filtered_copy(const VertexFilter &filter)
  59. {
  60.   return NULL;
  61. }
  62. bool
  63. RigidScan::filter_vertices (const VertexFilter& filter, vector<Pnt3>& p)
  64. {
  65.   return false;
  66. }
  67. bool
  68. RigidScan::filter_inplace (const VertexFilter &filter)
  69. {
  70.   return false;
  71. }
  72. crope 
  73. RigidScan::getInfo(void)
  74. {
  75.   float q[4], t[3];
  76.   Xform<float> xf = getXform();
  77.   xf.toQuaternion(q);
  78.   xf.getTranslation(t);
  79.   Bbox wb = worldBbox();
  80.   char info[1024 + PATH_MAX];
  81.   sprintf(info,
  82.   "filename: %sn"
  83.   "trans: %.3f %.3f %.3fn"
  84.   "orientation: %.3f %.3f %.3f %.3fn"
  85.   "n"
  86.   "extents in world coordinates:n"
  87.   "  X: %.3f to %.3fn"
  88.   "  Y: %.3f to %.3fn"
  89.   "  Z: %.3f to %.3f",
  90.   get_name().c_str(),
  91.   t[0], t[1], t[2], q[0], q[1], q[2], q[3],
  92.   wb.min()[0], wb.max()[0], wb.min()[1], wb.max()[1],
  93.   wb.min()[2], wb.max()[2]);
  94.   return crope (info);
  95. }
  96. OccSt
  97. RigidScan::carve_cube  (const Pnt3 &ctr, float side)
  98. { return INDETERMINATE; }
  99. OccSt 
  100. RigidScan::carve_sphere(const Pnt3 &ctr, float radius)
  101. { return INDETERMINATE; }
  102. bool
  103. RigidScan::closest_point(const Pnt3 &p, const Pnt3 &n, 
  104.  Pnt3 &cl_pnt, Pnt3 &cl_nrm,
  105.  float thr, bool brdy_ok)
  106. { return 0; }
  107. #if 0
  108. float 
  109. RigidScan::closest_point(const Pnt3 &p, Pnt3 &cl_pnt)
  110. { return 0.0f; }
  111. float 
  112. RigidScan::closest_point(const Pnt3 &p, Pnt3 &cl_pnt, Pnt3 &cl_nrm)
  113. { return 0.0f; }
  114. #endif
  115. float 
  116. RigidScan::closest_point_on_mesh(const Pnt3 &p, Pnt3 &cl_pnt, 
  117.  OccSt &status_p)
  118. { return 0.0f; }
  119. float 
  120. RigidScan::closest_along_line_of_sight(const Pnt3 &p, Pnt3 &cp, 
  121.        OccSt &status_p)
  122. { return 0.0f; }
  123. float 
  124. RigidScan::closest_along_line(const Pnt3 &p, const Pnt3 &dir,
  125.       Pnt3 &cp, OccSt &status_p)
  126. { return 0.0f; }
  127. float 
  128. RigidScan::color_along_line_of_sight(const Pnt3 &p, float rgb[3])
  129. { return 0.0f; }
  130. float 
  131. RigidScan::color_along_line_of_sight(const Pnt3 &p, uchar rgb[3])
  132. { return 0.0f; }
  133. bool 
  134. RigidScan::read(const crope &fname)
  135. { return false; }
  136. bool
  137. RigidScan::is_modified (void)
  138. { return false; }
  139. bool 
  140. RigidScan::write(const crope& fname)
  141. { return false; }
  142. bool
  143. RigidScan::write_resolution_mesh (int nPolys, const crope& fname,
  144.   Xform<float> xfBy)
  145. {
  146.   // This is a basic implementation that will work for any RigidScan,
  147.   // by writing the geometry/topology information that is returned from
  148.   // RigidScan::mesh().  Feel free to override it if you can implement
  149.   // it in a more efficient scan-specific fashion (like GenericScan,
  150.   // for example, which stores its data in a Mesh class that knows how to
  151.   // write itself anyway and can thus avoid the call to mesh()).
  152.   int nOldRes = resolutions[curr_res].abs_resolution;
  153.   if (!select_by_count (nPolys))
  154.     return false;
  155.   
  156.   bool success = false;
  157.   bool bStrips = theScene->meshes_written_stripped();
  158.   // BUGBUG support other color modes than truecolor, intensity?
  159.   MeshTransport* mt = mesh (true, bStrips,
  160.     (theRenderParams && 
  161.     (theRenderParams->colorMode == intensityColor)) ?
  162.     colorIntensity : colorTrue);
  163.   if (mt) {
  164.     // if there's only one fragment and it doesn't need any
  165.     // transformation, we can write directly from the fragment
  166.     if (mt->vtx.size() == 1
  167. && xfBy.isIdentity()
  168. && mt->xf[0].isIdentity()) {
  169.       // can just write the geometry
  170.       cerr << "Writing single mesh... " << flush;
  171.       if (mt->color.size() == 1
  172.   && mt->color[0]->size() >= mt->vtx[0]->size()) {
  173. cerr << "(in color)... " << flush;
  174. write_ply_file (fname.c_str(), *(mt->vtx[0]),
  175. *(mt->tri_inds[0]), bStrips,
  176. *(mt->color[0]));
  177.       } else {
  178. write_ply_file (fname.c_str(), *(mt->vtx[0]),
  179. *(mt->tri_inds[0]), bStrips);
  180.       }
  181.       success = true;
  182.     } else {
  183.       // either multiple fragments, or needs xform before write, so
  184.       // need to build conglomerate vectors with all vertices and
  185.       // consistent triangle indexing
  186.       cerr << "Writing mesh consisting of " << mt->vtx.size()
  187.    << " fragments... " << flush;
  188.       vector<Pnt3> vtx;
  189.       vector<int> tris;
  190.       vector<uchar> color;
  191.       int nvtx = 0;
  192.       int ntris = 0;
  193.       int ncolors = 0;
  194.       for (int i = 0; i < mt->vtx.size(); i++) {
  195. nvtx += mt->vtx[i]->size();
  196. ntris += mt->tri_inds[i]->size();
  197. if (i < mt->color.size() && mt->color[i])
  198.   ncolors += mt->color[i]->size();
  199.       }
  200.       vtx.reserve (nvtx);
  201.       tris.reserve (ntris);
  202.       color.reserve (ncolors);
  203.       nvtx = 0;
  204.       ntris = 0;
  205.       ncolors = 0;
  206.       for (i = 0; i < mt->vtx.size(); i++) {
  207. Pnt3* newVtxStart = vtx.end();
  208. vtx.insert (vtx.end(), mt->vtx[i]->begin(), mt->vtx[i]->end());
  209. int* tend = tris.end();
  210. tris.insert (tend, mt->tri_inds[i]->begin(), mt->tri_inds[i]->end());
  211. const int* newtend = tris.end();
  212. for (int* t = tend; t < newtend; t++) {
  213.   if (*t != -1)
  214.     *t += nvtx;
  215. }
  216. // update triangle indices
  217. nvtx += mt->vtx[i]->size();
  218. if (i < mt->color.size() && mt->color[i])
  219. color.insert (color.end(), mt->color[i]->begin(), mt->color[i]->end());
  220. Xform<float> xfThis = xfBy * mt->xf[i];
  221. if (!xfThis.isIdentity()) {
  222.   cerr << "applying xform... " << flush;
  223.   for (Pnt3* pi = newVtxStart; pi < vtx.end(); pi++) {
  224.     xfThis (*pi);
  225.   }
  226. }
  227.       }
  228.       if (color.size() >= vtx.size())
  229. write_ply_file (fname.c_str(), vtx, tris, bStrips, color);
  230.       else
  231. write_ply_file (fname.c_str(), vtx, tris, bStrips);
  232.       success = true;
  233.     }
  234.     delete mt;
  235.   }
  236.   select_by_count (nOldRes);
  237.   if (success)
  238.     cerr << "done." << endl;
  239.   else
  240.     cerr << "failed!" << endl;
  241.   return success;
  242. }
  243. bool
  244. RigidScan::write_metadata (MetaData data)
  245. {
  246.   bool success = false;
  247.   switch (data) {
  248.   case md_xform: 
  249.     success = TbObj::writeXform (get_basename());
  250.     break;
  251.   }
  252.   
  253.   return success;
  254. }
  255. bool
  256. RigidScan::get_children (vector<RigidScan*>& children) const
  257. { return false; }