說起stl模型,相信使用過cad三維軟體的人都不陌生,
stl = stl檔案,一種3d模型檔案格式stl(stereo lithography的縮寫)
stl檔案格式是由3d systems 公司於1988 年制定的乙個介面協議,是一種為快速原型製造技術服務的三維圖形檔案格式。stl 檔案由多個三角形麵片的定義組成,每個三角形麵片的定義包括三角形各個定點的三維座標及三角形麵片的法向量。三角形頂點的排列順序遵循右手法則。 stl 檔案有2 種型別:文字檔案(ascii格式)和二進位制檔案(binary)。
在此文中我們對ascii格式的stl檔案進行解析,並且用opengl對其進行顯示。
stl的ascii格式如下:
solid filenamestl //檔案路徑及檔名
facet normal x y z // 三角麵片法向量的3個分量值
outer loop
vertex x y z ∥三角麵片第乙個頂點的座標
vertex x y z // 三角麵片第二個頂點的座標
vertex x y z ∥三角麵片第三個頂點的座標
endloop
endfacet // 第乙個三角麵片定義完畢
…………
endsolid filenamestl ∥整個檔案結束
下面來說說處理這個解析的思路,首先我們可以按行一行行讀來下,去掉第一行開始一直往下讀,每讀一行都檢查是不是到了最後一行,但是這樣顯然效率不高,不如我們一開始把三角麵片個個數求出來,迴圈中對每個三角麵片進行解析,可以觀察出每個三角麵片所佔的ascii檔案的行數為7行,那麼把行數讀出來除以七所得的商就是三角麵片的個數,那麼我們再一一對每個三角麵片進行解析,實際上這個工作並不是很難,關鍵是要知道stl的格式與openglbatch的介面,opengl的介面實際上是一串float的陣列,這裡面儲存了verts即頂點座標資訊,以及norms即法向量資訊,那麼剛好和我們的stl檔案相一致。
以下是我們的核心**;
#include "windows.h"
#include // opengl toolkit
#include #include #include #include #pragma comment(lib,"legacy_stdio_definitions.lib")
#include#ifdef __cplusplus
extern"c"
#endif
file __iob_func[3] = ;
#include #else
#define freeglut_static
#include #endif
glframe viewframe;
glfrustum viewfrustum;
glbatch ********batch;
glmatrixstack modelviewmatix;
glmatrixstack projectionmatrix;
glgeometrytransform transformpipeline;
glshadermanager shadermanager;
int num;
float* verts;
float* vnorms;
void getstlmodel()
} num = nlines / 7;
rewind(file);
while (getc(file) != '\n');
verts = new float[9 * num];
vnorms = new float[9 * num];
for (int i = 0; ivnorms[count1] = vnorms[count1 + 3] = vnorms[count1 + 6] = atof(x);
count1++;
vnorms[count1] = vnorms[count1 + 3] = vnorms[count1 + 6] = atof(y);
count1++;
vnorms[count1] = vnorms[count1 + 3] = vnorms[count1 + 6] = atof(z);
count1 += 7;
fscanf(file, "%*s %*s");
if (3 != fscanf(file, "%*s %80s %80s %80s\n", x, y, z))
if (isbegin == false)
verts[count2] = atof(x);
count2++;
verts[count2] = atof(y);
count2++;
verts[count2] = atof(z);
count2++;
if (3 != fscanf(file, "%*s %80s %80s %80s\n", x, y, z))
verts[count2] = atof(x);
count2++;
verts[count2] = atof(y);
count2++;
verts[count2] = atof(z);
count2++;
if (3 != fscanf(file, "%*s %80s %80s %80s\n", x, y, z))
verts[count2] = atof(x);
count2++;
verts[count2] = atof(y);
count2++;
verts[count2] = atof(z);
count2++;
fscanf(file, "%*s");
fscanf(file, "%*s"); }}
void setuprc()
void specialkeys(int key, int x, int y)
void changesize(int w, int h)
void renderscene(void)
; transformpipeline.getmodelviewprojectionmatrix(), vred);
shadermanager.usestockshader(glt_shader_default_light, transformpipeline.getmodelviewmatrix(), transformpipeline.getprojectionmatrix(), vred);
********batch.draw();
modelviewmatix.popmatrix();
glutswapbuffers();
}int main(int argc, char* ar**)
setuprc();
glutmainloop();
return 0;
}
讀取STL模型
讀取二進位制格式的stl模型檔案 std ifstream fin fin.open stlfilepath,std ios in std ios binary bool isbinary true 判斷stl是否是二進位製流檔案 fin.seekg 0,std ios end std stream...
OpenGL讀取Obj模型檔案
想要順利讀取obj模型檔案,先要了解這種檔案的格式,obj檔案格式是非常簡單的。這種檔案以純文字的形式儲存了模型的頂點 法線和紋理座標和材質使用資訊。obj檔案的每一行,都有極其相似的格式。在obj檔案中,每行的格式如下 字首 引數1 引數2 引數3 其中,字首標識了這一行所儲存的資訊型別。引數則是...
opengl讀取OBJ模型檔案
要順利讀取 obj模型檔案,先要了解obj檔案的格式。obj檔案格式是非常簡單的,它以純文字的形式儲存了模型的頂點 法線和紋理座標和材質使用資訊。obj檔案的每行的格式如下 字首引數1引數 2引數3 其中,字首標識了這一行所儲存的資訊型別。引數則是具體的資料。obj檔案常見的的字首有 v表示本行指定...