readOBJ.h 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. //
  2. // IGL Lib - Simple C++ mesh library
  3. //
  4. // Copyright 2011, Daniele Panozzo. All rights reserved.
  5. #ifndef READOBJ_H
  6. #define READOBJ_H
  7. #include <Eigen/Core>
  8. #include <string>
  9. #include <iostream>
  10. #include <fstream>
  11. #include <vector>
  12. namespace igl
  13. {
  14. //! Read a mesh from an ascii obj file
  15. void readOBJ(std::string str, Eigen::MatrixXd& V, Eigen::MatrixXi& F)
  16. {
  17. std::ifstream s(str.c_str());
  18. std::vector<Eigen::Vector3d> Vtemp;
  19. std::vector<Eigen::Vector3i> Ftemp;
  20. char buf[1000];
  21. while(!s.eof())
  22. {
  23. s.getline(buf, 1000);
  24. if (buf[0] == 'v') // vertex coordinates found
  25. {
  26. char v;
  27. double v1,v2,v3;
  28. sscanf(buf, "%c %lf %lf %lf",&v,&v1,&v2,&v3);
  29. Vtemp.push_back(Eigen::Vector3d(v1,v2,v3));
  30. }
  31. else if (buf[0] == 'f') // face description found
  32. {
  33. char v;
  34. int v1,v2,v3;
  35. sscanf(buf, "%c %d %d %d",&v,&v1,&v2,&v3);
  36. Ftemp.push_back(Eigen::Vector3i(v1-1,v2-1,v3-1));
  37. }
  38. }
  39. s.close();
  40. V = Eigen::MatrixXd(Vtemp.size(),3);
  41. for(int i=0;i<V.rows();++i)
  42. V.row(i) = Vtemp[i];
  43. F = Eigen::MatrixXi(Ftemp.size(),3);
  44. for(int i=0;i<F.rows();++i)
  45. F.row(i) = Ftemp[i];
  46. }
  47. }
  48. #endif