亚洲天堂高清一二三,久久久久久久久久性生活,精品国产污污免费网站AⅤ,色橹橹欧美在线观看视频高清

3d打印常用stl文件原理解析 

2017-02-22 06:59
1.概述stl文件用三維網(wǎng)格表現(xiàn)實(shí)體模型,stl文件有兩種:一種是ASCII明碼格式,另一種是二進(jìn)制格式。(以下摘自百度百科)
1.png

2.ASCII格式在STL文件中的三角面片的信息單元 facet 是一個(gè)帶矢量方向的三角面片,STL三維模型就是由一系列這樣的三角面片構(gòu)成。
        整個(gè)STL文件的首行給出了文件路徑及文件名。
        在一個(gè) STL文件中,每一個(gè)facet由7 行數(shù)據(jù)組成,
        facet normal 是三角面片指向?qū)嶓w外部的法矢量坐標(biāo),
        outer loop 說(shuō)明隨后的3行數(shù)據(jù)分別是三角面片的3個(gè)頂點(diǎn)坐標(biāo),3頂點(diǎn)沿指向?qū)嶓w外部的法矢量方向逆時(shí)針排列。
  1. solidfilenamestl//文件路徑及文件名
  2. facetnormalxyz//三角面片法向量的3個(gè)分量值
  3. outerloop
  4. vertexxyz//三角面片第一個(gè)頂點(diǎn)坐標(biāo)
  5. vertexxyz//三角面片第二個(gè)頂點(diǎn)坐標(biāo)
  6. vertexxyz//三角面片第三個(gè)頂點(diǎn)坐標(biāo)
  7. endloop
  8. endfacet//完成一個(gè)三角面片定義

  9. ......//其他facet

  10. endsolidfilenamestl//整個(gè)STL文件定義結(jié)束
復(fù)制代碼
3.二進(jìn)制格式 二進(jìn)制STL文件用固定的字節(jié)數(shù)來(lái)給出三角面片的幾何信息。
      文件起始的80個(gè)字節(jié)是文件頭,用于存貯文件名;
      緊接著用 4 個(gè)字節(jié)的整數(shù)來(lái)描述模型的三角面片個(gè)數(shù),
      后面逐個(gè)給出每個(gè)三角面片的幾何信息。每個(gè)三角面片占用固定的50個(gè)字節(jié),依次是:
      3個(gè)4字節(jié)浮點(diǎn)數(shù)(角面片的法矢量)
      3個(gè)4字節(jié)浮點(diǎn)數(shù)(1個(gè)頂點(diǎn)的坐標(biāo))
      3個(gè)4字節(jié)浮點(diǎn)數(shù)(2個(gè)頂點(diǎn)的坐標(biāo))
      3個(gè)4字節(jié)浮點(diǎn)數(shù)(3個(gè)頂點(diǎn)的坐標(biāo))
      三角面片的最后2個(gè)字節(jié)用來(lái)描述三角面片的屬性信息。
      一個(gè)完整二進(jìn)制STL文件的大小為三角形面片數(shù)乘以 50再加上84個(gè)字節(jié)。
  1. UINT8//Header//文件頭
  2. UINT32//Numberoftriangles//三角面片數(shù)量
  3. //foreachtriangle(每個(gè)三角面片中)
  4. REAL32[3]//Normalvector//法線矢量
  5. REAL32[3]//Vertex1//頂點(diǎn)1坐標(biāo)
  6. REAL32[3]//Vertex2//頂點(diǎn)2坐標(biāo)
  7. REAL32[3]//Vertex3//頂點(diǎn)3坐標(biāo)
  8. UINT16//Attributebytecountend//文件屬性統(tǒng)計(jì)
復(fù)制代碼

處理過(guò)程當(dāng)開始processFiles時(shí),會(huì)將files中命名的stl文件存貯到model的meshs中。model是一個(gè)PrintObject*
     首先,loadModelSTL根據(jù)stl的類型選擇調(diào)用loadModelSTL_binary或者loadModelSTL_ascii,得到meshs。然后用processModel對(duì)Meshs處理,將結(jié)果存入storage。
wpid-流程圖.png
源碼解析
  1. bool processFiles(const std::vector<std::string> &files)//位于fffProcessor.h的line74
復(fù)制代碼
中:
  1. FMatrix3x3 matrix;  //變換用的矩陣,沒什么用
  2.        if (!loadMeshFromFile(model, filename.c_str(), matrix))
  3.        {
  4.            logError("Failed to load model: %s\n", filename.c_str());
  5.            return false;
  6.        }
復(fù)制代碼
調(diào)用loadMeshFromFile.
  1.   bool loadMeshFromFile(PrintObject* object, const char* filename, FMatrix3x3& matrix)
  2. {
  3.         const char* ext = strrchr(filename, '.');
  4.     if (ext && (strcmp(ext, ".stl") == 0 || strcmp(ext, ".STL") == 0))
  5.     {
  6.         object->meshes.emplace_back(object);
  7.         return loadModelSTL(&object->meshes[object->meshes.size()-1], filename, matrix);
  8.     }
  9.     return false;
  10. }
復(fù)制代碼
而loadModelSTL首先讀5個(gè)字節(jié)到buffer中,根據(jù)buffer是否為”solid”判斷stl文件類型,分別調(diào)用
   loadModelSTL_ascii和loadModelSTL_binary函數(shù)。
  1. bool loadModelSTL_ascii(Mesh* mesh, const  char* filename, FMatrix3x3& matrix)
  2. {
  3.     FILE* f = fopen(filename, "rt");
  4.     char buffer[1024];
  5.     FPoint3 vertex;
  6.     int n = 0;
  7.     Point3 v0(0,0,0), v1(0,0,0), v2(0,0,0);
  8.     while(fgets_(buffer, sizeof(buffer), f))
  9.     {
  10.         if (sscanf(buffer, " vertex %f %f %f", &vertex.x, &vertex.y, &vertex.z) == 3)
  11.         {
  12.             n++;
  13.             switch(n)
  14.             {
  15.             case 1:
  16.                 v0 = matrix.apply(vertex);  //矩陣轉(zhuǎn)換vertex到(v0 v1 v2)
  17.                                 break;
  18.             case 2:
  19.                 v1 = matrix.apply(vertex);
  20.                 break;
  21.             case 3:
  22.                 v2 = matrix.apply(vertex);
  23.                 mesh->addFace(v0, v1, v2);           //到這里,將stl轉(zhuǎn)換成了mesh
  24.                 n = 0;
  25.                 break;
  26.             }
  27.         }
  28.     }
  29. ……
復(fù)制代碼
提取出了三維點(diǎn)的信息,存到vertex中,再通過(guò)與矩陣matrix(其實(shí)是單位矩陣,結(jié)果一樣)相乘進(jìn)行坐標(biāo)變換,得到三個(gè)點(diǎn)后組成三維面片,
     使用addFace添加到mesh中。


  1.   bool loadModelSTL_ascii(Mesh* mesh, const  char* filename, FMatrix3x3& matrix)
  2. {
  3.     FILE* f = fopen(filename, "rt");
  4.     char buffer[1024];
  5.     FPoint3 vertex;
  6.     int n = 0;
  7.     Point3 v0(0,0,0), v1(0,0,0), v2(0,0,0);
  8.     while(fgets_(buffer, sizeof(buffer), f))
  9.     {
  10.         if (sscanf(buffer, " vertex %f %f %f", &vertex.x, &vertex.y, &vertex.z) == 3)
  11.         {
  12.             n++;
  13.             switch(n)
  14.             {
  15.             case 1:
  16.                 v0 = matrix.apply(vertex);  //矩陣轉(zhuǎn)換vertex到(v0 v1 v2)
  17.                                 break;
  18.             case 2:
  19.                 v1 = matrix.apply(vertex);
  20.                 break;
  21.             case 3:
  22.                 v2 = matrix.apply(vertex);
  23.                 mesh->addFace(v0, v1, v2);           //到這里,將stl轉(zhuǎn)換成了mesh
  24.                 n = 0;
  25.                 break;
  26.             }
  27.         }
  28.     }
  29. ……

  30.     提取出了三維點(diǎn)的信息,存到vertex中,再通過(guò)與矩陣matrix(其實(shí)是單位矩陣,結(jié)果一樣)相乘進(jìn)行坐標(biāo)變換,得到三個(gè)點(diǎn)后組成三維面片,
  31.     使用addFace添加到mesh中。

  32.   bool loadModelSTL_binary(Mesh* mesh, const char* filename, FMatrix3x3& matrix)
  33. {
  34.     FILE* f = fopen(filename, "rb");
  35.     char buffer[80];
  36.     uint faceCount;
  37.     //Skip the header
  38.     if (fread(buffer, 80, 1, f) != 1) //前80字節(jié)是文件頭
  39.     {
  40.         fclose(f);
  41.         return false;
  42.     }
  43.     //Read the face count
  44.     if (fread(&faceCount, sizeof(uint), 1, f) != 1)
  45.     {
  46.         fclose(f);
  47.         return false;
  48.     }
  49.     //For each face read:
  50.     //float(x,y,z) = normal, float(X,Y,Z)*3 = vertexes, uint16_t = flags
  51.     for(unsigned int i=0;i<faceCount;i++)
  52.     {
  53.         if (fread(buffer, sizeof(float) * 3, 1, f) != 1) //角面片的法矢量
  54.         {
  55.             fclose(f);
  56.             return false;
  57.         }
  58.         float v[9];
  59.         if (fread(v, sizeof(float) * 9, 1, f) != 1) //三個(gè)頂點(diǎn)坐標(biāo)
  60.         {
  61.             fclose(f);
  62.             return false;
  63.         }
  64.         Point3 v0 = matrix.apply(FPoint3(v[0], v[1], v[2]));
  65.         Point3 v1 = matrix.apply(FPoint3(v[3], v[4], v[5]));
  66.         Point3 v2 = matrix.apply(FPoint3(v[6], v[7], v[8]));
  67.         mesh->addFace(v0, v1, v2);
  68.         if (fread(buffer, sizeof(uint16_t), 1, f) != 1) //三角形面片數(shù)屬性信息,或許可以用來(lái)表示材質(zhì)??
  69.         {
  70.             fclose(f);
  71.             return false;
  72.         }
  73.     }
  74. ……

復(fù)制代碼
這樣,stl中得數(shù)據(jù)完全轉(zhuǎn)移到model.meshs中了。

聲明:3D打印資源庫(kù)(3dzyk)內(nèi)網(wǎng)友所發(fā)表的所有內(nèi)容及言論僅代表其本人,并不代表3D打印資源庫(kù)(3dzyk)觀點(diǎn)和立場(chǎng);如對(duì)文章有異議或投訴,請(qǐng)联系kefu@3dzyk.cn。
標(biāo)簽:
3d打印常用stl文件原理解析 
快速回復(fù) 返回頂部 返回列表
西林县| 徐汇区| 都兰县| 瓮安县| 南华县| 襄垣县| 阳江市| 盐城市| 高密市| 宣汉县| 虎林市| 南安市| 平遥县| 天祝| 襄城县| 聊城市| 尼勒克县| 汽车| 北碚区| 修水县| 龙游县| 织金县| 贵阳市| 济源市| 遂平县| 镇赉县| 长垣县| 唐海县| 齐河县| 白银市| 康定县| 库车县| 哈密市| 华阴市| 龙南县| 黄浦区| 仙桃市| 白玉县| 百色市| 余江县| 定安县|