第一个任务为
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 ∥整个文件结束
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);
}