第 32 卷第 2 期
2011 年 6 月
《陶瓷学报》
JOURNAL OF CERAMICS
Vol. 32, No. 2
Jun. 2011
文章编号:1000- 2278(2011)02- 0285- 04
STL 文件读取显示与操作
肖任贤 张军舰 冯 浩 潘海鹏
(景德镇陶瓷学院机电工程学院,江西 景德镇 333403)
摘 要
以 VC++ 为平台,利用 OpenGL 图形绘制接口技术,实现 STL 格式文件的快速读取与显示;并在此基础上实现 STL 模型的定
向定量移动与旋转功能,便于对 STL 模型进行切片,使施釉机器人的离线编程系统能根据坯体模型生成正确的喷枪轨迹,然后通
过实例验证可视化效果。
关键词 STL 文件;三角面片;坐标变换
中图分类号:TQ 174.75 文献标识码:A
0 引 言
目前,机器人施釉已经在陶瓷领域有所应用,然
而,在施釉作业中,施釉机器人喷枪运动轨迹的生产
一直是制约施釉机器人广泛应用的瓶颈。为了生成
施釉机器人的喷枪轨迹,我们提出了基于 STL 模型
生成施釉机器人喷枪轨迹的方法,使得离线编程系统
可以有效利用各种数据格式的工件 CAD 模型规划
施釉机器人的喷枪轨迹。本文先对 STL 模型进行读
取、显示,在此基础上通过调用 OpenGL 平移、旋转函
数对已读出的 STL 模型进行校正,较直接对其进行
坐标平移、旋转变换省去了繁琐的矩阵运算,提高了
效率,便于对 STL 模型进行切片,使施釉机器人的离
线编程系统能根据工件模型生成正确的喷枪轨迹。
1 ST L 文件结构
1.1 S T L 文件格式
STL 文件是若干个空间小三角形面片的集合,
它是通过三维实体模型的三角网格化获得的。每个
三角形面片由三角形三个顶点坐标(xi,yi,zi)(其中 i=1,
2,3)和其指向模型外部的法向量{n1,n2,n3}组成;其法
收稿日期:2011- 01- 13
通讯联系人:肖任贤,E- mail: zhanjj320@163.com
向量{n1,n2,n3}与三角形三个顶点(xi,yi,zi
则:即右手环握三角形,四指指向三角形顶点的排序
)满足右手定
方向,则拇指所指方向即为该三角形面片的法矢量方
向 。 根 据 数 据 存 储 方 式 的 不 同 ,STL 文 件 可 分 为
ASCII 码和二进制码两种存储方式。与 ASCII 格式文
件相比,二进制文件要小得多,大约是 ASCII 格式文
件的 1/5,兼于 ASCII 格式文件可以读取,便于测试,
故选用其作为可视化的研究对象。
1.2 S T L 文件的数据结构
为了能够正确地读取 STL 模型的原始数据,更
好地利用 OpenGL 技术将三维图形显示出来,并实现
对其操作,我们在充分了解 STL 文件的基础上,还必
须理解它的结构。
现在我们已经知道,ASCII 码格式的 STL 文件
是逐行给出三角形面片的几何信息的,其每一行都以
一些关键字开头。一般地,一个 ASCII 码形式的 STL
文件格式如下所示:
solid[零件名]// 三维实体的名称;
facet normal 1.463521e- 002- 9.994401e- 001
3.008748e- 002// 三角片面的法矢量的几何数据;
outer loop
vertex- 9.715140e- 003- 3.753986e+0001.895258e
- 001// 三角片面的第一个顶点的信息;
vertex- 3.976572e- 002- 3.753045e+0002.354102e
286
- 001// 三角片面的第二个顶点的信息;
vertex- 7.806888e- 002- 3.752368e+000 2.765020e
- 001// 三角片面的第三个顶点的信息;
endloop
endfacet// 该三角片面的信息结束;
endsolid[零件名]// 三维实体的信息结束;
2 基于 O penG L 的 ST L 模型的读取与
显示
2.1 O penG L 概述
OpenGL 是一个功能非常强大的三维图形应用
程序编程接口(Applicantion Program Interfer,API),它
是以美国 SGI 公司的 IRIS GL 三维图形库为基础制
定的一个通用的开放的三维图形标准。其包括超过
700 个函数,这些函数可以用于指定物体和操作,用
于创建交互式的三维应用程序等。
2.2 S T L 文件的读取与显示
本文以 STL 格式文件为数据源,根据文件格式
以及内部数据结构的分析,采用 OpenGL 作为三维图
形接口,并以 VC++ 标准 IO 库的 ifstream 类型定义
对象,并绑定在 STL 文件上,再利用标准 string 类型
中的 get line 逐行读取绑定的 STL 文件;最后对读入
的数据进行是否为顶点信息的判断,存储其中的顶点
数据。再应用 OpenGL 编程技术实现对 STL 格式文
件的显示。
对 STL 文件的具体读取算法如下:
Step1.定义一个临时的三角形 T。
Step2.依次读取上述数据结构中一个 facet 段,将
normal 和三个 vertex 分别存于三角形 T 的法向量和
定点中。
Step3.创建一个三角形链表 l,在 l 中添加 T。
Step4.判断 STL 文件是否读取完,是,则转至
Step5,否,则转至 Step2。
Step5.读取结束。
STL 文件在经过上述读取后,要求读取结果以三
维图形的形式显示出来。在 OpenGL 函数库中,提供
了丰富的函数,用于绘制几何模型,提供了直接渲染
三角形面片的函数 glBegin(GL_TRIANGLES)和
glEnd(),因而,利用 OpenGL 实现 STL 三维模型真实
《陶瓷学报》2011 年第 2 期
感图形显示更具有优势。
部分程序如下:
Void CRPSupportDesign View::Draw STL(double
v00,double v01,double v02,double v10,double v11,
double v12,double v20,double v21,double v22)
{
glBegin(GL- TRINAGLES);
glNormalBd(n0,n1,n2);
glVertex3d(v00,v01,v02);
glVertex3d(v10,v11,v12);
glVertex3d(v20,v21,v22);
glEnd();
}
3 ST L 模型的操作
由 CAD 模型转换而来的 STL 模型所包含的坐
标系是在 CAD 系统构建模型时设定的(称其为模型
坐标系),在很大程度上有可能和施釉机器人工作台
坐标系(称其为任务坐标系)不一致。因此需要离线
编程系统在读取 STL 模型后对其坐标系进行校正,
使得模型坐标系与任务坐标系重合,使离线编程系统
能根据坯体模型生成正确的喷枪轨迹。针对坯体来
说,要实现 STL 模型的校正,通常使用的坐标变换为
平移和旋转。对待施釉工件几何模型的变换实际上
是以点的变换为基础的,即对模型对象一系列的顶点
进行变换后,用新的顶点来生成变换后的模型。在一
些文献中用的该校正方法,其中要进行大量的矩阵运
算,给程序的调试与运行带来了一定的困难。然而在
OpenGL 的平移和旋转函数中封装了坐标变换,可直
接对其进行调用,因此省去了繁琐的矩阵运算,提高
了效率。本文即是通过调用 OpenGL 的平移和旋转
函数来实现 STL 模型校正的。
部分程序如下:
<1> 定向定量平移:
void CSTLViewerView::OnViewTranslate()
{
// TODO: Add your command handler code here
CTranslateDlg dlg;
if(dlg.DoModal() == IDOK)
《陶瓷学报》2011 年第 2 期
287
图 1 S TL 文件的读取与显示
图 2 S TL 模型的平移
Fig.1 Reading and displaying STL files
Fig.2 Translating an STL model
{
m_TranslateX = dlg.m_X + m_TranslateX;
m_TranslateY = dlg.m_Y + m_TranslateY;
m_TranslateZ = dlg.m_Z + m_TranslateZ;
Invalidate();
}
}
<2> 定向定量旋转:
void CSTLViewerView::OnViewRotate()
{
// TODO: Add your command handler code here
CRotateDlg dlg;
if (dlg.DoModal() == IDOK)
{
m_RotateX = dlg.m_RotateX + m_RotateX;
m_RotateY = dlg.m_RotateY + m_RotateY;
m_RotateZ = dlg.m_RotateZ + m_RotateZ;
Invalidate();
}
}
根据用户设置的平移、旋转参数,在绘图虚函数
中调用平移旋转函数如下:
glTranslate(m_TranslateX,m_TranslateY,
m_TranslateZ);
glRoate(m_RoateX,1.0f,0.0f,0.0f);
glRoate(m_RoateY,0.0f,1.0f,0.0f);
glRoate(m_RoateZ,1.0f,0.0f,1.0f);
4 实 例
图 3 S TL 模型的旋转
Fig.3 Rotating an STL model
在对 STL 文件进行分析的基础上,利用 VC++6.
0,OpenGL 编程技术对 STL 文件进行可视化验证。
对从 ProE5.0 中导出的 STL 文件进行测试,如图 1 所
示 STL 文件的读取与显示。
在此基础上可实现对已显示的 STL 文件进行定
向定量平移与旋转,操作对话框如图 2、图 3 所示,分
别是对已显示的 STL 模型的平移与旋转的对话框,
输入预定的数据可实现对 STL 模型的平移与旋转操作。
从图 2、图 3 可见,通过调用 OpenGL 平移、旋转
函数更容易实现对 STL 模型的校正,而且不需要对
矩阵考虑矩阵运算和坐标平移程序的编写。
5 结 论
本文以 VC++6.0 为数据开发平台,结合 OpenGL
编程技术实现对 STL 文件的读取与显示功能,并以
此为基础通过调用 OpenGL 的平移、旋转函数对 STL
288
模型的校正,使得模型坐标系与任务坐标系重合,为
STL 模型切片做好准备,使施釉机器人的离线编程系
统能根据 STL 模型的切片生成正确的喷枪轨迹。
参 考 文 献
1 卫 炜,周来水,张艳丽.海量 STL 文件的快速读取与显示.机械
科学与技术.2006,8
2 胡海鸥,王 素.基于 OpenGL 的 STL 文件可视化研究.中国
科技论文在线,2010,2
3 严桎铭,钟艳如.基于 VC++ 和 OPpenGL 的 STL 文件显示.计
算机系统应用,2009,3
《陶瓷学报》2011 年第 2 期
4 陈 挺,俞子荣.基于 OpenGL 技术的 STL 数据格式的显示.计
算机与自动化,2009,9
5 张贞贞,陈定方.基于 VC 的 STL 文件读取.湖北工业大学学
报,2008,4
6 赵启升.基于 OpenGL 三维物体建模方法的研究与实现.电子
技术论坛
7 闫 涛.基于三角网格交互式数据分割技术的研究与实现.硕
士学位论文,2009 届
8 周 峰.喷涂机器人喷枪空间轨迹生成研究.硕士学位论文,
2009 届
9 孙 波.OpenGL 编程实例学习教程. 北京:北京大学出版社
10 孙 鹏.Visual C++6.0 完全自学手册. 北京:机械工业出版社
STL Files Reading, Displaying and Manipulating
(School of Mechanical and Electrical Engineering, Jingdezhen Ceramic Institute, Jingdezhen, Jiangxi 333403)
XIAO Renxian ZHANG Junjian FENG Hao PAN Haipeng
By using OpenGL on the platform of VC++, fast reading and visualization of STL files can be achieved. Along with it the
realization of the translation and rotation of an STL model also makes possible the model slicing. As a result, the off -line
programming system for a glazing robot can generate the correct track of a spray gun working on the model of a clay piece
Abstract
and subsequently verify its visual effectiveness through practical applications.
Key words STL file; triangles; coordinate transformation
Received on Jan. 13, 2011
XIAO Renxian, E-mail: zhanjj320@163.com