一种基于连续折线形三维管道的绘制方法及系统
技术领域
本发明涉及三维空间图形绘制领域,尤其涉及一种基于连续折线形三维管道的绘制方法及系统。
背景技术
随着计算机技术的发展,三维管道的创建方法根据实际应用的场景与目的不同,而大量的涌现出来。但现有三维管道的创建方法,多采用样条曲线或贝塞尔曲线作为三维管道的路径,从而进行创建管道的方式。而对于折线形管道的创建,则需要由多个直线形管道进行拼接组合形成,使得在折线弯角处,存在无法闭合的现象。由于以上两种方法,很难满足很多用户的使用,和场景的需求。因此本次发明将对于构建三维连续折线形直管道给出切实可行的创建方法。
发明内容
针对上述现有技术存在的不足和缺陷,本发明提出一种基于连续折线形三维管道的绘制方法及系统,确定待绘制管道的所有预设节点的三维坐标;分别计算待绘制管道的所有预设节点的左/右补点的切线的单位向量及三维坐标;分别计算所有预设节点与其左/右补点法线、次法线的单位向量;基于预设节点或其左/右补点计算其周围的待绘制节点的三维坐标;基于待绘制节点的三维坐标绘制三维管道;
具体发明内容包括:
一种基于连续折线形三维管道的绘制方法包括:
确定待绘制管道的所有预设节点的三维坐标;
分别计算待绘制管道的所有预设节点的左/右补点的切线的单位向量及三维坐标,所述计算待绘制管道的所有预设节点的左补点的三维坐标的方法具体为:bosi1={Li*Qi1+posi};所述计算待绘制管道的所有预设节点的右补点的三维坐标的方法具体为:bosi2={Li*Qi2+posi};其中:Li为预设节点i与其左/右补点的距离,Li=R*sin(phi/2);其中R为待绘制管道的半径,phi为左补点的切线与右补点的切线间的夹角;所述phi的计算方法具体为:phi=arcos(Qi1·Qi2),其中Qi1为预设节点i的左补点的切线,Qi2为预设节点i的右补点的切线。其中,Q01,Q02,bos01,bos02是不存在的;
分别计算所有预设节点与其左/右补点法线、次法线的单位向量;
基于预设节点或其左/右补点计算其周围的待绘制节点的三维坐标;
基于待绘制节点的三维坐标绘制三维管道;
其中,所述预设节点的三维坐标为posi={posi.x,posi.y,posi.z},其中i为预设节点的标号,posi.x代表预设节点i在X轴上的坐标,,posi.y代表预设节点i在Y轴上的坐标,posi.z代表预设节点i在Z轴上的坐标。其中i属于[0,1,2,……m],m为整数。
进一步地,所述待绘制管道的横截面包括多边形。
进一步地,所述基于预设节点或其左/右补点计算其周围的待绘制节点的三维坐标方法为:
基于预设节点计算其周围的待绘制节点的三维坐标为:
Posi.x=posi.x+cx*pnormali.x+cy*pbinormali.x;
Posi.y=posi.y+cx*pnormali.y+cy*pbinormali.y;
Posi.z=posi.z+cx*pnormali.z+cy*pbinormali.z;
其中,pnormali为预设节点i的法线坐标,pbinormali为预设节点i的次法线坐标;
基于左右补点计算其周围的待绘制节点的三维坐标为:
Posi.x=bosi.x+cx*bnormali.x+cy*bbinormali.x;
Posi.y=bosi.y+cx*bnormali.y+cy*bbinormali.y;
Posi.z=bosi.z+cx*bnormali.z+cy*bbinormali.z;
其中,bnormali为补点i的法线坐标,bbinormali为补点i的次法线坐标;
cx=-R*cos(v);cy=R*sin(v);其中,v=2PI*j/n,j表示待绘制管道的第j个绘制节点,n为待绘制管道的多边形的边数。
一种基于连续折线形三维管道的绘制系统,包括:
预设模块,用于确定待绘制管道的所有预设节点的三维坐标;
第一计算模块,用于计算待绘制管道的所有预设节点的左/右补点的切线的单位向量及三维坐标;
第二计算模块,用于计算所有预设节点与其左/右补点法线、次法线的单位向量,所述计算待绘制管道的所有预设节点的左补点的三维坐标的方法具体为:bosi1={Li*Qi1+posi};所述计算待绘制管道的所有预设节点的右补点的三维坐标的方法具体为:bosi2={Li*Qi2+posi};其中:Li为预设节点i与其左/右补点的距离,Li=R*sin(phi/2);其中R为待绘制管道的半径,phi为左补点的切线与右补点的切线间的夹角;所述phi的计算方法具体为:phi=arcos(Qi1·Qi2),其中Qi1为预设节点i的左补点的切线,Qi2为预设节点i的右补点的切线。其中,Q01,Q02,bos01,bos02是不存在的;
第三计算模块,用于基于预设节点或其左/右补点计算其周围的待绘制节点的三维坐标;
绘制模块,用于基于待绘制节点的三维坐标绘制三维管道;
所述预设节点的三维坐标为posi={posi.x,posi.y,posi.z},其中i为预设节点的标号,posi.x代表预设节点i在X轴上的坐标,,posi.y代表预设节点i在Y轴上的坐标,posi.z代表预设节点i在Z轴上的坐标。
进一步地,待绘制管道的横截面包括多边形。
进一步地,所述基于预设节点或其左/右补点计算其周围的待绘制节点的三维坐标方法为:
基于预设节点计算其周围的待绘制节点的三维坐标为:
Posi.x=posi.x+cx*pnormali.x+cy*pbinormali.x;
Posi.y=posi.y+cx*pnormali.y+cy*pbinormali.y;
Posi.z=posi.z+cx*pnormali.z+cy*pbinormali.z;
其中,pnormali为预设节点i的法线坐标,pbinormali为预设节点i的次法线坐标;
基于左右补点计算其周围的待绘制节点的三维坐标为:
Posi.x=bosi.x+cx*bnormali.x+cy*bbinormali.x;
Posi.y=bosi.y+cx*bnormali.y+cy*bbinormali.y;
Posi.z=bosi.z+cx*bnormali.z+cy*bbinormali.z;
其中,bnormali为补点i的法线坐标,bbinormali为补点i的次法线坐标;
cx=-R*cos(v);cy=R*sin(v);其中,v=2PI*j/n,j表示待绘制管道的第j个绘制节点,n为待绘制管道的多边形的边数。
本发明的有益效果是:
1、首先,能够使管道按照预先设定的路径进行绘制,不会偏离预设路径。解决了现有技术中折线形三维管道在绘制过程中出现的弯折、管道半径大小不一,导致管道膨胀或收缩变形的问题;
2、其次,绘制的三维管道在通过预设节点的折线的拐角连接处能够闭合,不会出现尖角、断节等情况,应用到更多场景,更加真实贴切,达到了良好的视觉效果。
3、最后,该绘制方法绘制的三维管道是通过一次绘制而成,并不是现有技术中将多段管道拼接而成,而绘制过程中,每调用一次WebGL API都会占用CPU的内存影响CPU的效率,每个调用都会使得CPU进行额外的处理和数据复制,而通过本方法提供的数据已经转换成CPU提供的是大批可并行处理的数据,提升了运行CPU的效率。
附图说明
为了更清楚地说明本发明或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明一种基于连续折线形三维管道的绘制方法实施例1流程图;
图2为本发明一种于连续折线形三维管道的系统结构图;
图3为本发明绘制的三维管道的效果图的主视图;
图4为本发明绘制的三维管道的效果图的侧视图;
图5为现有技术绘制的三维管道的效果图的主视图;
图6为现有技术绘制的三维管道的效果图的侧视图;
图7为本发明三维管道所有预设节点的示意图;
图8为本发明三维管道所有预设节点的左补点以及右补点的示意图;
图9为本发明基于预设节点Y0计算出的待绘制节点的分布示意图;
图10为本发明三维管道所有待绘制节点的分布示意图;
图11为本发明三维管道预设节点的切线、法线、次法线的向量示意图;
图12为本发明三维管道预设节点的右补点切线、法线、次法线的向量示意图;
图13为本发明基于所有待绘制节点绘制的三维管道效果示意图。
具体实施方式
为了使本技术领域的人员更好地理解本发明实施例中的技术方案,并使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图对本发明中技术方案作进一步详细的说明。
本发明给出了一种基于连续折线形三维管道的绘制方法实施例1如图1所示,包括:
S101:确定待绘制管道的所有预设节点的三维坐标;
S102:分别计算待绘制管道的所有预设节点的左/右补点的切线的单位向量及三维坐标;若待绘制管道上的预设节点的个数为n,设定此时待绘制管道上的节点总数量为(n-2)*3+2,,其中补点的数量为节点总数量与预设节点之差。待绘制管道上节点的排列顺序为:预设节点Y0,左补点B11(代表预设节点1的左补点),预设节点Y1,右补点B12(预设节点1的右补点),左补点B21(预设节点2的左补点),预设节点Y2,右补点B22(预设节点的右补点)……左补点B(n-1)1(预设节点n-1的左补点),预设节点Yn-1,右补点B(n-1)2(预设节点n-1的右补点),预设节点n;
S103:分别计算所有预设节点与其左补点及右补点的切线、法线、次法线的单位向量;
S104:基于预设节点或其左/右补点计算其周围的待绘制节点的三维坐标;
S105:基于待绘制节点的三维坐标绘制三维管道,如图3和4所示。
其中,预设节点的三维坐标为posi={posi.x,posi.y,posi.z},其中i为预设节点的标号,posi.x代表预设节点i在X轴上的坐标,posi.y代表预设节点i在Y轴上的坐标,posi.z代表预设节点Yi在Z轴上的坐标。
优选地,所述计算待绘制管道的所有预设节点的左补点的三维坐标的方法具体为:bosi1={Li*Qi1+posi};所述计算待绘制管道的所有预设节点的右补点的三维坐标的方法具体为:bosi2={Li*Qi2+posi};其中:Li为预设节点i与其左/右补点的距离,Li=R*sin(phi/2);其中R为待绘制管道的半径,phi为左补点的切线与右补点的切线间的夹角;所述phi的计算方法具体为:phi=arcos(Qi1·Qi2),其中Qi1为预设节点i的左补点的切线,Qi2为预设节点i的右补点的切线。其中,Q01,Q02,bos01,bos02是不存在的。
优选地,所述待绘制管道的横截面包括多边形。
优选地,所述基于预设节点或其左/右补点计算其周围的待绘制节点的三维坐标方法为:
基于预设节点计算其周围的待绘制节点的三维坐标为:
Posi.x=posi.x+cx*pnormali.x+cy*pbinormali.x;
Posi.y=posi.y+cx*pnormali.y+cy*pbinormali.y;
Posi.z=posi.z+cx*pnormali.z+cy*pbinormali.z;
其中,pnormali为预设节点i的法线坐标,pbinormali为预设节点i的次法线坐标;
基于左右补点计算其周围的待绘制节点的三维坐标为:
Posi.x=bosi.x+cx*bnormali.x+cy*bbinormali.x;
Posi.y=bosi.y+cx*bnormali.y+cy*bbinormali.y;
Posi.z=bosi.z+cx*bnormali.z+cy*bbinormali.z;
其中,bnormali为补点i的法线坐标,bbinormali为补点i的次法线坐标;
cx=-R*cos(v);cy=R*sin(v);其中,v=2PI*j/n,j表示待绘制管道的第j个绘制节点,n为待绘制管道的多边形的边数。
本发明给出了一种基于连续折线形三维管道的绘制方法实施例如下:
S101:确定待绘制管道的所有预设节点的三维坐标;
其中,预设节点可分为首节点,尾节点以及中间预设节点,则待绘制管道的所有预设节点至少为2个,若为2个,则所有预设节点即首尾预设节点。
所述预设节点的三维坐标为posi={posi.x,posi.y,posi.z},其中i为预设节点的标号,posi.x代表预设节点i在X轴上的坐标,,posi.y代表预设节点i在Y轴上的坐标,posi.z代表预设节点i在Z轴上的坐标。其中,i=0,1,2,…..整数。
在此,设定预设节点为5个,分别为预设节点Y0,Y1,Y2,Y3,Y4,如图7所示,则预设节点的三维坐标为
pos0={pos0.x,pos0.y,pos0.z},
pos1={pos1.x,pos1.y,pos1.z},
pos2={pos2.x,pos2.y,pos2.z},
pos3={pos3.x,pos3.y,pos3.z},
pos4={pos4.x,pos4.y,pos4.z},
S102:分别计算待绘制管道的所有预设节点的左/右补点的切线的单位向量及三维坐标;
其中,添加的补点是为了在绘制过程中的夹角为锐角的拐点处,使得转折更加自然,避免由于两个预设节点间的距离过长而使管道变形也避免了绘制管道拐角处出现缝隙或者缺口,影响真实美观性。补点的添加方式是在除了首尾两个预设节点外的所有中间预设中间节点的两侧各添加一个补点,分别为左补点、右补点。
若待绘制管道上的预设节点的个数为5,设定此时带绘制管道上的节点总数量为11,,其中补点的数量为节点总数量与预设节点之差。待绘制管道上节点的排列顺序为:如图8所示,预设节点Y0,左补点B11(预设节点1的左补点),预设节点Y1,右补点B12(预设节点1的右补点),
左补点B21(预设节点2的左补点),预设节点Y2,右补点B22(预设节点的右补点),
左补点B31(预设节点3的左补点),预设节点Y3,右补点B32(预设节点3的右补点),预设节点Y4。
在此,以预设节点Y1及其左补点B11、右补点B12为例:
计算预设节点Y1的左补点B11的切线Q11=pos0-pos1,右补点B12的切线Q12=pos2-pos1。分别求出Q11与Q12单位向量。
计算左补点B11的切线Q11与右补点B12的切线Q12的空间夹角为phi=phi=arcos(Q11·Q12),其中,Q11与Q12的点积值在-1到1之间。
则左补点B11的三维坐标bos11={L1*Q11+pos1};其中:L1代表第1个预设节点与其左补点的距离;Q11代表预设节点Y1的左补点B11的切线;所述L1的计算方法具体为:L1=R/sin(phi/2);其中R为待绘制管道的半径,phi为左补点的切线Q11与右补点的切线Q12间的夹角;所述phi的计算方法具体为:phi=arcos(Q11·Q12)。
同理,可以按照上述方法计算其他预设节点的左补点以及右补点。
S103:分别计算所有预设节点与其左/右补点法线、次法线的单位向量;
以预设节点Y1为例:
首先计算预设节点Y0与预设节点Y1之间的距离S01,预设节点Y1与预设节点Y2之间的距离S12,若S12<S01,则在预设节点Y0与预设节点Y1间的线段截取点C使得S1c=S12,则预设节点Y1的切线Q1为pos2-posc的方向向量,并对该切线进行归一化。若S12>S01,在预设节点Y1与预设节点Y2间的线段截取点C使得S1c=S01,则预设节点1的切线Q1为pos2-posc的方向向量,并对该切线进行归一化。若S12=S01,则预设节点1的切线Q1为pos2-pos0的方向向量,并对该切线进行归一化。
预设节点0的切线Q0为pos1-pos0的方向向量,并对该切线进行归一化。
预设节点i的切线Qi为posi-posi-1的方向向量,并对该切线进行归一化。
在此,预设节点个数为5,分别为预设节点Y0、预设节点Y1、预设节点Y2、预设节点Y3、预设节点Y4,则预设节点Y4的切线Q4为pos4-pos3的方向向量,并对该切线进行归一化。
接下来,计算预设节点的法线与次法线;
以预设节点Y0为例:
求取预设节点Y0的归一化后的切线在x,y,z轴上的最小值,使单位向量(1,0,0)或(0,1,0)或(0,0,1)设为临时法线temNormal;即当预设节点0的单位切线在x轴方向的绝对值最小则将向量(1,0,0)作为预设节点0的临时法线normal_tem。
通过对预设节点Y0的切线Q0与其临时法线temNormal进行叉积计算,得出其临时次法线temBinormal:temBinormal=Q0*temNormal。并对其进行归一化
计算预设节点Y0的法线值为:normals0=Q0*temBinormal;
计算预设节点Y0的次法线值为:binormals0=Q0*normal0;
图11为预设节点的切线、法线以及次法线的示意图。
其余预设节点的法线计算方法为:
A.计算两个相邻预设节点的切线叉积的值的单位向量vec。
B.计算两个相邻预设节点的切线间的夹角theta=acos(Qi-1,Qi);
C.获取预设节点Yi的旋转轴矩阵,通过单位向量vec与夹角theta得旋转轴矩阵
tx*x+c,tx*y-s*z,tx*z+s*y,0
tx*y+s*z,ty*y+c,ty*z-s*x,0
tx*z-s*y,ty*z+s*x,t*z*z+c,0
0 ,0 ,0 ,1
其中c=cos(theta),s=sin(theta),t=1-c,x=vec.x,y=vec.y,z=vec.z,tx=t*x,ty=t*y。使用预设节点Y(i-1)的单位法线乘以旋转轴矩阵得到预设节点Yi的法线,并进行归一化;
通过预设节点Yi的切线与其法线的叉积计算得出预设节点Yi的次法线单位向量:具体如下:
预设节点的次法线单位向量:binormalsi=Qi*normalsi。
左补点的次法线单位向量:binormals(i-1)1=Qi1*normals(i-1)1。
左补点的次法线单位向量:binormalsi2=Qi2*normalsi2。
左补点Bi1,右补点Bi2的切线即为预设节点Yi与预设节点Y(i-1)的向量做差的结果的归一化。
左补点Bi1,右补点Bi2的法线与其次法线的计算方法与预设节点相同,再次不再赘述。
S104:所述基于预设节点或其左/右补点计算其周围的待绘制节点的三维坐标方法为:基于预设节点计算其周围的待绘制节点的三维坐标为:
Posi.x=posi.x+cx*pnormali.x+cy*pbinormali.x;
Posi.y=posi.y+cx*pnormali.y+cy*pbinormali.y;
Posi.z=posi.z+cx*pnormali.z+cy*pbinormali.z;
其中,pnormali为预设节点i的法线坐标,pbinormali为预设节点i的次法线坐标;
基于左右补点计算其周围的带绘制节点的三维坐标为:
Posi.x=bosi.x+cx*bnormali.x+cy*bbinormali.x;
Posi.y=bosi.y+cx*bnormali.y+cy*bbinormali.y;
Posi.z=bosi.z+cx*bnormali.z+cy*bbinormali.z;
其中,bnormali为补点i的法线坐标,bbinormali为补点i的次法线坐标;
cx=-R*cos(v);cy=R*sin(v);其中,v=2PI*j/n,j表示待绘制管道的第j个绘制节点,n为待绘制管道的多边形的边数。
优选地,所述待绘制管道的横截面包括多边形。
假设:绘制的管道为四边形;
则n=4;当j=1时则v=90°;j=2时则v=180°;j=3时则v=270°;j=4时则v=360°,如图9所示,为本发明基于预设节点Y0计算出的待绘制节点的分布示意图,以此类推,全部的绘制节点效果图如图10所示。
S105:基于待绘制节点的三维坐标绘制三维管道,如图13所示。
本发明还给出了一种基于连续折线形三维管道的系统实施例,如图2所示,包括:
预设模块,用于确定待绘制管道的所有预设节点的三维坐标;
第一计算模块,用于计算待绘制管道的所有预设节点的左/右补点的切线的单位向量及三维坐标;
第二计算模块,用于计算所有预设节点与其左/右补点法线、次法线的单位向量;
第三计算模块,用于基于预设节点或其左/右补点计算其周围的待绘制节点的三维坐标;绘制模块,用于基于待绘制节点的三维坐标绘制三维管道;
本说明书中方法的实施例采用递进的方式描述,对于系统的实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。本发明提出一种基于连续折现形三维管道的方法及系统,根据预设路径上的预设节点的三维坐标,选定每个预设节点的左补点以及右补点,通过求切线、法线以及次法线来计算出绘三维管道的绘制节点。通过本发明,不仅能够使管道按照预先设定的路径进行绘制,不会偏离预设路径。解决了现有技术中折线形三维管道在绘制过程中出现的弯折、管道半径大小不一,导致管道膨胀或收缩变形的问题;而且绘制的三维管道在通过预设节点的折线的拐角连接处能够闭合,不会出现尖角、断节等情况,应用到更多的场景,更加真实贴切,达到了良好的视觉效果。
虽然通过实施例描绘了本发明,本领域普通技术人员知道,本发明有许多变形和变化而不脱离本发明的精神,希望所附的权利要求包括这些变形和变化而不脱离本发明的精神。