首页 > 代码库 > 可视化入门2:STL数据显示

可视化入门2:STL数据显示

第一个任务为
STL数据OpenGL绘制,可旋转、缩放、拾取面片(拾取后显示出面片号、节点号)、移动顶点位置改变物体形状;
 
第一阶段:
    读取并显示stl数据
 
OpenGL中如何读取Solidworks模型生成的STL文件:

STL文件的ASCII码形式

ASCII码格式STL文件逐行给出三角面片的几何信息,每一行以1个或2个关键字开头。在STL文件中的三角面片的信息单元facet是一个带矢量方向的三角面片,STL模型就是由一组这样的三角面片构成。在一个STL文件中,每一个facet由7行数据组成,第1行是三角面片指向实体外部的法向失量数据,第2行说明随后的第3,4,5行数据分别是三角面片的3个顶点信息,沿指向实体外部的法向矢量(第1行数据)方向逆时针排列。ASCII码格式的STL文件结构如下:
solid filename stl                  ∥ 文件路径及文件名
facet normal x y z                 ∥ 三角面片法向量的3个分量值
outer loop        
vertex x y z                     ∥三角面片第一个顶点的坐标
vertex x y z                     ∥三角面片第二个顶点的坐标
vertex x y z                     ∥三角面片第三个顶点的坐标
endloop
endfacet                            ∥第一个三角面片定义完毕
………………………
………………………….
eadsolid fileame stl                    ∥整个文件结束
 
OpenGL中读取STL文件的VC代码如下:

    FILE *fp = NULL;
    fp = fopen("..\\主动同步带轮.STL","r");
    if(fp)
    {
        CString strLine;
        CString strHead;
        GLfloat normal[3];
        GLfloat vertex[3];

        glNewList(3,GL_COMPILE);
        glPushMatrix();
        //glDisable(GL_LIGHTING);
        glEnable(GL_DEPTH_TEST);
        glEnable(GL_LIGHTING);  
        glEnable(GL_LINE_SMOOTH);    
        glScalef(0.001,0.001,0.001);

        while(1)
        {
            fscanf(fp,"%s\n",strHead.GetBuffer(20));
            strHead.TrimLeft();

            if(strHead == "solid")
            {
                fscanf(fp,"%s\n",strLine.GetBuffer(20));
                continue;
            }
            else if(strHead == "facet")
            {
                fscanf(fp,"%s\n",strLine.GetBuffer(20));
                fscanf(fp,"%f %f %f\n",normal,normal+1,normal+2);
                glNormal3fv(normal);
            }
            if(strHead == "outer")
            {
                fscanf(fp,"%s\n",strLine.GetBuffer(20));
                
                glBegin(GL_POLYGON);

                for(int i = 0; i < 3; i++)
                {
                    fscanf(fp,"%s\n",strLine.GetBuffer(20));
                    strLine.TrimLeft();
                    if(strLine == "vertex")
                    {
                        fscanf(fp,"%f %f %f\n",vertex,vertex+1,vertex+2);
                        glVertex3d(vertex[0],vertex[1],vertex[2]);
                    }
                }
                
                glEnd();

                continue;
            }
            else if(strHead == "endloop" || strHead == "endfacet")
            {
                continue;
            }
            else if(strHead == "endsolid")
            {
                break;
            }
        }

        //glEnable(GL_DEPTH_TEST);
        //glEnable(GL_LIGHTING);  
        glDisable(GL_LINE_SMOOTH);                
        glPopMatrix();
        glEndList();
        
        fclose(fp);
    }

以上为在vs中读取stl并显示的代码段;
 

可视化入门2:STL数据显示