基于树形存储结构的模型切片传输算法
技术领域
本发明属于三维显示技术领域,具体涉及一种基于树形存储结构的模型切片传输算法。
背景技术
随着人们对于三维显示的需求日益增高,因此在当代国际上,三维成像研究成为一股热潮。运用三维显示技术制造出虚拟与现实相互交错的视觉效果现已比比皆是。
但目前的三维显示技术存在操作环境严苛、设备昂贵、未在空间成像、视角单一等问题。如VR,AR等设备需佩戴头显,全息投影受干扰影响较大,价格昂贵。
基于这种需求,本发明提出了一种高效的切片传输算法,配备硬件上的支持,将切片后的数据存入自定义的树形存储结构中,再经下位机解码,最终将数据以图片形式输出,用于解决三维投影的实时显示问题,最终呈现出一种全新的裸眼3D的效果。
在现今的三维显示技术中,基于STL模型的快速分层切片算法被广泛的应用到3D打印的技术中去。而本发明将这种切片技术应用于投影中,叠加硬件上的支持,得到一种全新的裸眼3D效果。目前的主流算法是等层厚分层算法和适应性分层算法,前者实现简单,程序执行速度快,但台阶效应明显,后者采用适应性变化层厚的算法明显减少了台阶效应,且没有大量增加加工时间,但仍然没有完全消除台阶效应。
发明内容
为了解决现有技术中存在的上述问题,本发明提供了一种基于树形存储结构的模型切片传输算法。它将切片后的数据存入自定义的树形存储结构中,再经下位机解码,最终将数据以图片形式输出,用于解决三维投影的实时显示问题,最终呈现出一种全新的裸眼3D的效果。
本发明要解决的技术问题通过以下技术方案实现:
基于树形存储结构的模型切片传输算法,
该算法的具体处理过程如下:
包括上位机切片编码程序处理过程、数据传输过程以及下位机解码程序执行过程;
S1所述上位机切片编码程序处理过程的具体步骤是,
1.1预处理:
依次读取STL文件中每个三角形的数据,每次读取一个三角形的数据,即一行的数据,并记录三角形数据中三个顶点的坐标;
1.2对三角形与切平面相交的情况进行分类,并对三角形与切平面相交所得交线进行计算,然后,将计算出来的交线坐标信息和交线所在切片层的信息传输到下位机;
S2数据传输过程
将上位机切片编码程序处理过程处理的数据通过网线传输方式传输给下位机;
S3下位机解码程序执行过程
下位机接收由上位机传输过来的数据,包括层数和交线两点的坐标;格式为(level,x1,x2,y1,y2),将其存入自定义的数据结构中;等待上位机数据传输完毕,自定义的数据结构也更新完毕;对数据结构逐层遍历,并根据遍历结果在输出矩阵上划线,每一层遍历结束后,将结果以图片形式输出;
所述步骤S3具体的过程是:
3.1SliceTree类变量定义
3.1.1点节点node结构体;
node节点用来储存每一条线;其中,变量x1,y1,x2,y2表示一条线的两个顶点,node类型的*next指针指向下一个node节点;
3.1.2层节点slice结构体
slice节点用来标识切片的每一层;其中,变量floor用来记录层数,slice类型指针*lchild指向下一层,node类型指针*rchild指向本层第一个node节点的头节点;
3.2SliceTree类函数定义
3.2.1数据结构的更新函数
3.2.2数据结构的遍历函数
遍历函数的实现过程如下:
Step1:初始化一个slice*节点,一个node*节点和一个cv::Mat矩阵;
Step2:如果slice已遍历至最后一层,则程序结束,否则遍历该层;
Step3:如果node已遍历至最后一个节点,则输出该矩阵,返回step2,否则遍历下一节点;
Step4:遍历至某节点时,调用SliceTree::draw()函数在Mat矩阵上划线,完成后返回step3;
3.2.3draw()函数
Mat矩阵划线函数,通过for循环对线段上所有的像素点进行处理并进行输出。
进一步的,所述预处理的具体步骤是:
1.1.1:依次读取STL文件中每个三角形的数据,每次读取一个三角形的数据,即一行的数据,并记录三角形数据中三个顶点的坐标;
1.1.2:将三角形数据中三个顶点的坐标分别记录为(x1,y1,z1)、(x2,y2,z2)、(x3,y3,z3);
1.1.3:根据三角形三个顶点的z坐标进行升序排列;
1.1.4:将排列好的数据记录为(x1,y1,zmin)、(x2,y2,zmid)、(x3,y3,zmax)。
优选的,所述步骤1.2的分类和计算过程具体包括:
1.2.1:输入处理好的一个三角形的三个顶点数据(x1,y1,zmin)、(x2,y2,zmid)、(x3,y3,zmax),选取一个切平面zi(i依次选取1,2,3……n,n为总切片层数),判断该三角形是否在切平面上,若式(zmin-zi)×(zmax-zi)≤0成立,则该三角形在切平面上,进入步骤1.2.2;若不是,则该三角形不在切平面上,继续读取下一个三角形的信息,直到找到一个在该切平面上的三角形为止,若没有三角形在该切平面上,则选取下一个切平面zi+1;
1.2.2:步骤1.2.1得到了一个在该切平面上的三角形,进一步分析该三角形与切平面相交的情况;
将三个顶点依次命名为:A:(x1,y1,zmin)、B:(x2,y2,zmid)、C:(x3,y3,zmax),根据(zmin-zi)×(zmax-zi)=0或(zmin-zi)×(zmax-zi)<0分为三种一般情况和五种特殊情况;
具体是:
当(zmin-zi)×(zmax-zi)<0时,分为以下三种一般情况:
1)若zmid-zi<0,则将三个顶点数据(x1,y1,zmax)、(x2,y2,zmid)、(x3,y3,zmin)带入以下方程(1):
得到:
其中(x13,y13,zi)表示边AC与切平面的交点,(x23,y23,zi)表示边BC与切平面的交点,记录交线的坐标:[(x13,y13)(x23,y23)]。
2)若zmid-zi>0,则将三个顶点数据(x1,y1,zmax)、(x2,y2,zmid)、(x3,y3,zmin)带入以下方程(4):
得到:
其中(x13,y13,zi)表示边AC与切平面的交点,(x12,y12,zi)表示边AB与切平面的交点,记录交线的坐标:[(x13,y13)(x12,y12)];
3)若zmid-zi=0,则将三个顶点数据(x1,y1,zmax)、(x3,y3,zmin)带入以下方程(6):
得到:
其中(x13,y13,zi)表示边AC与切平面的交点,记录交线的坐标:[(x13,y13)(x2,y2)];
当(zmin-zi)×(zmax-zi)=0时,分为以下五种特殊情况:
4)当zmin-zi=0且zmid-zi=0时,记录交线的坐标:[(x2,y2)(x3,y3)];
5)当zmin-zi=0且zmid-zi>0时,舍去该交线,不做记录;
6)当zmax-zi=0且zmid-zi=0时,记录交线的坐标:[(x2,y2)(x3,y3)];
7)当zmax-zi=0且zmid-zi<0时,舍去该交线,不做记录;
8)当zmin-zi=0且zmax-zi=0时,记录三条交线的坐标:[(x1,y1)(x2,y2)]、[(x2,y2)(x3,y3)]、[(x1,y1)(x3,y3)];
将步骤1.2.2得到的交线的坐标信息和所在切片层的信息传输到下位机。
进一步的,所述步骤3.2.1数据结构的更新函数具体步骤是:
更新数据结构的过程即为链表的尾插法,首先根据level找到对应的slicelevel,然后向右遍历至最后一个node节点,插入新节点;等待上位机数据传输完成,数据结构也更新完毕。
与现有技术相比,本发明的有益效果:
现有的技术中,都是通过上位机切片算法产生图片,之后经过宽带宽数据线直接传输或通过图片压缩算法处理后进行传输,来保证数据的同步。在本发明中,切片算法运行时,不再直接产生图片,而是将层数和交线坐标传输给下位机,保证了传输速度。在下位机,通过我们自定义的数据结构将层数坐标信息储存起来;传输完成后,通过遍历程序按层遍历该数据结构,将图片复原,以达到提高传输效率的目的;最后通过对STL模型切片实例的分析,验证了该算法的可行性和高效性。
附图说明
图1-a是本发明三角形与切平面一般情况下的第一种关系图。
图1-b是本发明三角形与切平面一般情况下的第二种关系图。
图1-c是本发明三角形与切平面一般情况下的第三种关系图。
图2-a是本发明三角形与切平面特殊情况下的第一种关系图。
图2-b是本发明三角形与切平面特殊情况下的第二种关系图。
图2-c是本发明三角形与切平面特殊情况下的第三种关系图。
图2-d是本发明三角形与切平面特殊情况下的第四种关系图。
图2-e是本发明三角形与切平面特殊情况下的第五种关系图。
图3是本发明数据结构的最终效果图。
图4是本发明数据结构遍历流程图。
图5-1是本发明实施例实体图。
图5-2是本发明实施例STL模型图。
图6-1是本发明实施例第40层部分数据截图。
图6-2是本发明实施例第80层部分数据截图。
图7-1是本发明实施例第40层切片图片。
图7-2是本发明实施例第80层切片图片。
具体实施方式
下面结合具体实施例对本发明做进一步详细的描述,但本发明的实施方式不限于此。
本发明提出了一种高效的切片传输方案,用于解决三维投影中切片图片实时传输的问题。
本发明提出的这种优化后的切片算法,不仅能够达到逐层切片,无重复,大大的节约了存储空间,实现了模型图像的实时显示,而且适用立体图形的范围更广,不会遗漏图形几何特征。
在传输上面,本发明采用基于TCP协议的Socket网络传输的方式,将数据由上位机传输给下位机,以保证实时性和可靠性。
在下位机解码部分,目前现有的技术是通过上位机直接将图片传输给DLP,这种技术的缺点是只能接受数据量较小的图片信息,不能较好的将图片显示,无法呈现出完整的三维显示的效果。为了解决图片传输数据量限制的问题,本发明采用树形结构编码的形式,将这个数据结构存储于下位机中,等待上位机数据传输完毕,数据结构更新完毕后,下位机再进行逐层遍历,将结果以图片的形式输出,以达到能够做大量的数据传输,又能有实时、稳定的效果。
本发明的创新点在于,将优化后的切片算法与自定义的树形存储结构相结合,通过编解码以及网线传输的形式,以达到较好的实时传输,实时显示的三维显示效果,应用于三维投影当中,以达到真正的裸眼3D。
本发明算法具体实施过程是:
S1.上位机切片编码程序处理过程
空间三维模型可由无数个三角形组成,STL文件格式记录了每个三角形三个顶点的三维坐标,以及每个三角形的法向量;其中三角形记录的顺序基本是无序的,这一点给切片带来了很大的不便性,同时三角形中的一个顶点信息至少被记录了两遍,STL文件格式简单,但同时又有一定的数据冗余性。
1.1预处理:
1.1.1:依次读取STL文件中每个三角形的数据,每次读取一个三角形的数据,即一行的数据;
1.1.2:将三角形数据中三个顶点的坐标分别记录为(x1,y1,z1)、(x2,y2,z2)、(x3,y3,z3);
1.1.3:根据三角形三个顶点的z坐标进行升序排列;
1.1.4:将排列好的数据记录为(x1,y1,zmin)、(x2,y2,zmid)、(x3,y3,zmax)。
1.2对三角形与切平面相交的情况分类处理以及两者相交所得交线的计算:
1.2.1:输入处理好的一个三角形的三个顶点数据(x1,y1,zmin)、(x2,y2,zmid)、(x3,y3,zmax),选取一个切平面zi(i依次选取1,2,3……n,n为总切片层数),判断该三角形是否在切平面上,若式(zmin-zi)×(zmax-zi)≤0成立,则该三角形在切平面上,进入步骤1.2.2;若不是,则该三角形不在切平面上,继续读取下一个三角形的信息,直到找到一个在该切平面上的三角形为止,若没有三角形在该切平面上,则选取下一个切平面zi+1。
1.2.2:步骤1.2.1得到了一个在该切平面上的三角形,进一步分析该三角形与切平面相交的情况。
我们将三个顶点依次命名为:A:(x1,y1,zmin)、B:(x2,y2,zmid)、C:(x3,y3,zmax),根据(zmin-zi)×(zmax-zi)=0或(zmin-zi)×(zmax-zi)<0可分为三种一般情况和五种特殊情况。
具体是:
当(zmin-zi)×(zmax-zi)<0时,分为以下三种一般情况:
1)若zmid-zi<0,则将三个顶点数据(x1,y1,zmax)、(x2,y2,zmid)、(x3,y3,zmin)带入以下方程(1):
可得:
如图1-a所示,图1-a是本发明三角形与切平面一般情况下的第一种关系图,其中(x13,y13,zi)表示边AC与切平面的交点,(x23,y23,zi)表示边BC与切平面的交点,记录交线的坐标:[(x13,y13)(x23,y23)]。
2)若zmid-zi>0,则将三个顶点数据(x1,y1,zmax)、(x2,y2,zmid)、(x3,y3,zmin)带入以下方程(4):
可得:
如图1-b所示,图1-b是本发明三角形与切平面一般情况下的第二种关系图,其中(x13,y13,zi)表示边AC与切平面的交点,(x12,y12,zi)表示边AB与切平面的交点,记录交线的坐标:[(x13,y13)(x12,y12)]。
3)若zmid-zi=0,则将三个顶点数据(x1,y1,zmax)、(x3,y3,zmin)带入以下方程(6):
可得:
如图1-c所示,图1-c是本发明三角形与切平面一般情况下的第三种关系图,其中(x13,y13,zi)表示边AC与切平面的交点,记录交线的坐标:[(x13,y13)(x2,y2)]。
当(zmin-zi)×(zmax-zi)=0时,分为以下五种特殊情况:
4)当zmin-zi=0且zmid-zi=0时,如图2-a所示,图2-a是本发明三角形与切平面特殊情况下的第一种关系图,记录交线的坐标:[(x2,y2)(x3,y3)]。
5)当zmin-zi=0且zmid-zi>0时,如图2-b所示,图2-b是本发明三角形与切平面特殊情况下的第二种关系图,舍去该交线,不做记录。
6)当zmax-zi=0且zmid-zi=0时,如图2-c所示,图2-c是本发明三角形与切平面特殊情况下的第三种关系图,记录交线的坐标:[(x2,y2)(x3,y3)]。
7)当zmax-zi=0且zmid-zi<0时,如图2-d所示,图2-d是本发明三角形与切平面特殊情况下的第四种关系图,舍去该交线,不做记录。
8)当zmin-zi=0且zmax-zi=0时,如图2-e所示,图2-e是本发明三角形与切平面特殊情况下的第五种关系图,记录三条交线的坐标:[(x1,y1)(x2,y2)]、[(x2,y2)(x3,y3)]、[(x1,y1)(x3,y3)]。
将步骤1.2.2得到的交线的坐标信息和所在切片层的信息传输到下位机。
S2数据传输过程
本发明采用基于TCP协议的Socket网络编程的原理,在上位机windows平台上搭建了服务器,用于发送经过编码处理的图像信息,在下位机Linux平台上搭建了客户端,用于接收图像信息并作进一步解码处理。
S3.下位机解码程序执行过程
下位机接收由上位机传输过来的数据,包括层数和交线两点的坐标。格式为(level,x1,x2,y1,y2),将其存入我们自定义的数据结构中。等待上位机数据传输完毕,我们的数据结构也更新完毕。对数据结构逐层遍历,并根据遍历结果在输出矩阵上划线,每一层遍历结束后,将结果以图片形式输出。
S3具体的实施步骤是:
3.1SliceTree类变量定义
3.1.1点节点node结构体
node节点用来储存每一条线。其中,变量x1,y1,x2,y2表示一条线的两个顶点,node类型的*next指针指向下一个node节点。
3.1.2层节点slice结构体
slice节点用来标识切片的每一层。其中,变量floor用来记录层数,slice类型指针*lchild指向下一层,node类型指针*rchild指向本层第一个node节点的头节点。
3.2SliceTree类函数定义
3.2.1数据结构的更新函数
更新数据结构的过程即为链表的尾插法,首先根据level找到对应的slicelevel,然后向右遍历至最后一个node节点,插入新节点。等待上位机数据传输完成,我们的数据结构也更新完毕。数据结构的最终效果如图3。
3.2.2数据结构的遍历函数
参照流程图4,遍历函数的实现过程如下:
Step1:初始化一个slice*节点,一个node*节点和一个cv::Mat矩阵;
Step2:如果slice已遍历至最后一层,则程序结束,否则遍历该层;
Step3:如果node已遍历至最后一个节点,则输出该矩阵,返回step2,否则遍历下一节点;
Step4:遍历至某节点时,调用SliceTree::draw()函数在Mat矩阵上划线,完成后返回step3。
3.2.3draw()函数
Mat矩阵划线函数,通过for循环对线段上所有的像素点进行处理。
实施例1:
1)上位机使用Visual studio2017的开发平台,在Windows10专业版环境下运行。STL文件选用圆锥模型。实体图和STL模型图分别为为图5-1,图5-2。
2)下位机运行在TX2上,使用ubuntu16,04系统。上位机下位机使用串口通信。
3)上位机运行切片算法,产生交线坐标数据,通过TCP协议传输到下位机。同时将该数据保存到txt文件中,用于后续分析。其中第40层、第80层部分数据截图如图6-1,图6-2。
4)数据传输到下位机后,通过下位机的解码,即数据结构的建立、更新和遍历过程产生图片,其中第40层、第80层切片图片如图7-1,图7-2。
5)经过一定量的不同模型的测试,在时间损耗上,我们的方案较原有方案缩短了百分之八十左右。
本发明优点主要体现在传输过程中,在实施例1中,层数和交线坐标信息数据共计167KB,现有方案所传输的图片数据有548KB,所传输的数据量大大减少;而且,在一些模型上时间甚至缩短了百分之九十左右。
以上内容是结合具体的优选实施方式对本发明所作的进一步详细说明,不能认定本发明的具体实施只局限于这些说明。对于本发明所属技术领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干简单推演或替换,都应当视为属于本发明的保护范围。