彩色3D打印纹理切片算法研究*

2019-01-23 10:48徐家攀赵吉宾田同同
组合机床与自动化加工技术 2019年1期
关键词:交线像素点纹理

徐家攀,赵吉宾,李 论,田同同

(1.东北大学 机械工程与自动化学院,沈阳 110819; 2.中国科学院沈阳自动化研究所,沈阳 110016)

0 引言

随着3D打印技术的不断推广,3D打印的产品广泛应用于产品设计,建筑设计,模具设计,机械制造,医学等各个领域,这些领域的产品都需要色彩来增强表现力。因此彩色3D打印更符合人类未来生产和生活的需求。那么彩色切片算法相关问题的研究是3D打印行业不可或缺的环节[1-2]。

占志敏等[3]对VRML格式的文件进行解析,提出了以面来定义颜色实现整体上色和以顶点来定义颜色采用内插法实现渐变效果,但此方法没有解决纹理贴图模型的切片算法;胡汉伟等[4]对AMF格式的文件解析,提出了以三角形来定义颜色,使用增量法获得X向扫描线相邻像素点的颜色信息,此方法仅适用于表面彩色模型,没有对区分内外轮廓的模型进行分析。王璟璇等[5]根据颜色域值为0和1来定义颜色,当域值为0时直接索引图片值,当域值为1时进行插值计算获得交线的颜色值,此算法未对贴图模型进行分析。

为了实现贴图的纹理切片算法,实现全彩色3D打印,本文提出基于Obj文件的彩色3D纹理切片算法。首先对Obj文件进行解析获取坐标数据;接着根据纹理信息和坐标数据,进行纹理映射获取交线的颜色,最后利用插值算法计算生成的切面位图交线的每个像素点的颜色信息并根据拓扑关系连接各个点便生成了彩色截面位图。

1 Obj文件解析

常见到的*.obj文件有两种:第一种是基于COFF(Common Object File Format)格式的Obj文件(也称目标文件),这种格式用于编译应用程序;第二种是Alias|Wavefront公司推出的Obj模型文件[6]。本文对第二种obj模型文件进行分析。Obj文件非注释行都以关键字开头,非注释行的第一行即为关键字"mtllib"引用材质库。紧接着是顶点定义,一般包含几何顶点(V),纹理坐标(Vt),顶点法线(Vn);最后是由关键字"usemtl"和关键字"f"指定每个面所使用的材质和每个面的索引,关键字"usemtl"指定了材质之后,以后的面都是使用这一材质,直到遇到下一个"usemtl"来指定新的材质[7-8]。

基于纹理贴图的彩色纹理切片算法,最主要的是模型的几何信息和纹理信息,对Obj文件进行解析,并将得到几何信息和纹理信息保存到适当的数据结构中。Obj文件的解析流程如图1所示。

图1 Obj文件读取流程

2 彩色纹理切片算法

2.1 彩色纹理切片原理

彩色纹理切片是对纹理贴图的三维模型进行分层切片,即对模型进行切片的过程中没层层轮廓必须带有相应的纹理信息;主要分为三个方面:一是几何信息的获取;二是颜色信息的获取;三是彩色轮廓的生成。由于Obj文件完全兼容STL文件,所以几何信息的获取可以使用STL的切片算法获取;而颜色信息的获取首先需要得到纹理图片的信息,所以在读取Obj文件的同时获取纹理图片信息,另外还需要知道每个交点的纹理坐标,所有在计算几何坐标的同时计算交点的纹理坐标;完成几何信息获取和颜色信息获取后,最后获得所需分辨率的彩色截面轮廓图。具体的彩色切片算法流程如图2所示。

图2 颜色分层算法流程

2.2 几何信息的获取

由于Obj文件的几何结构完全兼容STL,故可采用STL的切片算法,由于STL切片算法没有纹理信息,我们只需要在原有算法的基础上添加纹理信息。

(1)几何坐标计算

由于在交点计算前已建立几何数据的拓扑关系,在OBJ文件中索引三角面片的三个顶点[8],如图3所示,三角面的三个顶点V1、V2、V3,通过建立的拓扑关系寻找到各个顶点的几何坐标和纹理坐标。根据切平面Z=Zp,通过线性插值计算便可得到切平面与三角面的交线的几何坐标和纹理坐标。

图3 切平面穿过三角面时的顶点坐标

图中,Zp为切层厚度,且Za=Zp

(2)纹理坐标计算

要得到截面的彩色信息,必须知道切平面与三角面的交线AB的两端点纹理坐标,接下来根据两端点的纹理坐标索引该AB线段上各像素点的颜色。AB两端点纹理坐标计算同样采用线性插值的方法,这里只给出顶点A的求法,顶点B类似。

2.3 颜色信息的获取

Obj文件采用纹理贴图来定义颜色,同时根据sRGB色彩空间获取每个像素点的颜色。Obj文件的纹理贴图一般为2D纹理[9-10]。通过指定切平面与三角面交线每个顶点在矩形纹理上的UV坐标,可以将2D纹理通过线性插值映射到三角面与切平面的交线上,由此获得彩色截面轮廓。如图4所示。

图4 Obj文件纹理映射

(1)纹理图片的获取

当读取Obj文件后,首先要获得纹理图片信息,以便采集颜色信息。纹理贴图过的Obj文件包含了纹理信息和几何信息,当读取Obj文件时,首先获取了彩色三维模型的路径信息和纹理图片名称,为了得到纹理图片信息,将获得的彩色模型路径信息中的彩色模型名替换为纹理图片名称。

(2)交线颜色获取

为了保证生成的彩色截面轮廓颜色准确性,在获取纹理图片后,需要将2D纹理映射到三角面与切平面交线上。首先将2.2节中得到的纹理坐标转化为对应纹理图片上两点的像素坐标,根据像素坐标通过线性插值获取两点之间的所有像素点,然后得到每个像素点的颜色信息。

2.4 彩色截面轮廓的生成

最后生成的彩色截面轮廓图是以图片的形式呈现,于是在生成图片前必须设置图片的分辨率和图片的格式。在这里一般设置生成彩色截面图的分辨率与纹理图片的分辨率保持一致,避免颜色失真。图片的格式可以根据我们需要设置。如图5所示,通过交线颜色赋值和彩色截面轮廓生成最终实现生成彩色轮廓截面图。

(1)交线颜色赋值

当设置完生成图片的分辨率后,根据2.2节中获得的三角面和切片面的交线的几何坐标转化为生成图片上的分辨率坐标,通过线性插值得到两点之间的所有像素点,然后将2.3节中得到的所有像素点的颜色信息赋值给此过程得到的像素点,于是交线的两端点之间的所有的像素点带有了颜色信息。

(2)彩色截面轮廓生成

为了生成彩色轮廓我们需要将2.4节中得到的带有颜色的点画出来,本文采用Qt的QPen和Qpainter类,利用drawPoint()函数依次将每个像素点画出,便得到了基于纹理贴图的Obj文件的彩色二维截面轮廓。

3 实验验证

本文以一个实心立方体为例,实体默认颜色为白色;坐标系中心在立方体的一个顶点上,Z轴向上为正方向。实验程序利用C++,QT,OpenGl编写。当立方体6个面贴有纹理图片时如图5所示。设置生成图片的分辨率为300dpi,切片厚度为1mm,生成彩色轮廓线宽为1mm,自下而上切片,部分彩色截面图如图6所示。

(a) 视图a (b)视图b图5 纹理贴图模型图

第1层 第15层 第30层图6 生成的部分彩色截面图

4 结束语

本文针对基于纹理贴图的Obj文件的彩色模型,提出了一种利用像素点颜色获取彩色截面轮廓的切片算法,本算法不仅可以生成彩色截面轮廓,也可以生成传统截面轮廓。通过实验验证,彩色纹理切片算法生成的彩色截面轮廓更能表达彩色信息,解决了当前的切片算法只能实现色彩渐变效果不能实现纹理的弊端。但该算法还存在需要继续解决和完善的方面,如轮廓偏置优化等,将作为下一步研究的重点。

猜你喜欢
交线像素点纹理
图像二值化处理硬件加速引擎的设计
球面与简单多面体表面交线问题探究
基于局部相似性的特征匹配筛选算法
基于BM3D的复杂纹理区域图像去噪
培养数学空间想象力
两曲面交线上第二型曲线积分的计算
使用纹理叠加添加艺术画特效
基于像素点筛选的舰船湍流尾迹检测算法
基于canvas的前端数据加密
TEXTURE ON TEXTURE质地上的纹理