本发明属于计算机图形学领域,具体涉及一种三维模型的控制笼构造方法。
背景技术:
现在很多计算机图形学应用中,随着硬件设备的性能越来越强大,用户对显示效果的要求也越来越高。由于对应用中使用的目标模型要求也越来越精细,细节更多,所需顶点数更多。另外随着三维图形的广泛应用,用户构造出大量的三维网格模型,而且还在不断增加。
用户构造出三维模型,通常不仅仅是原封不动地进行显示,而是会在应用过程中,对它进行控制或编辑。由于精细模型的顶点越来越多,直接对它的顶点进行控制或编辑,往往操作比较冗余,难度比较大,计算量比较多。比如:对模型进行变形操作,直接对顶点进行逐个操作是不可行的。基于相邻区域的变形相似的思路,现在主要有两类网格变形方法:曲面变形和空间变形。空间变形需要借助一些点、线、面或网格为媒介,构造出可变形空间,从而通过调整媒介,使空间变形,从而间接地使处在空间内的原模型发生变形。其中一类空间变形方法,依赖控制网格计算出变形用的坐标,比如:格林坐标[Lipman Y, Levin D, Cohen-Or D. Green coordinates. ACM Trans. on Graphics, 2009,27(3):78.],在变形过程中可以迅速计算出结果,所以被广泛研究和应用。其使用的控制网格是与原模型形状相似,但为顶点数较少的包围网格,也称做Cage或控制笼。其优势在于把直接处理高精度复杂模型的棘手问题转化为对控制笼的间接处理,把算法的复杂度与模型复杂度与其表示方式分离,可大大降低算法复杂度,并扩展算法的适用性。这就需要对不同的模型构造对应的控制笼,所以快捷构造对应的控制笼很值得研究。
针对Cage(即控制笼)构造,已经有了一些研究成果。Xian等人提出基于体素化的自动cage生成方法。 [Xian CH, Lin HW, Gao SM. Automatic generation of coarse bounding cages from dense meshes. In: Yong JH, Spagnuolo M, eds. Proc. of the IEEE International Conference on Shape Modeling and Applications. Los Alamitos: IEEE Computer Society Press, 2009. 21−27.] 它通过几何计算将模型的AABB(Axis Aligned Bounding Box)包围盒体素化(voxelization),将体素(voxel)分成三类:体外、体内以及模型相交的特征体素;通过特征体素和体外体素的临界面,三角化后得到初始包围网格;最后,对包围网格进行光顺处理得到cage。该方法需要对包围盒进行体素化并分类。Ben-Chen等人在变形转移的文章[Ben-Chen M, Weber O, Gotsman C. Spatial deformation transfer. In: Tamstorf R, Fellner D, eds. Proc. of the 2009 ACM SIGGRAPH/Eurographics Symp. on Computer Animation. New York: ACM Press, 2009. 67−74.] 也讲述了如何构造cage的方法。它通过不断迭代往外推、重构、简化的过程来生成cage。其中每次外推得到的点云都要通过泊松重构来形成新的网格,计算量不小,而且迭代的次数很难预测。Deng等人提出基于二次误差度量的保凸渐进简化的构造cage方法[Deng ZJ, Luo XN, Miao XP. Automatic cage building with quadric error metrics. Journal of Computer Science and Technology, 2011,26(3):538−547.]。该方法对cage的顶点数可精确控制,但每次寻找新点都是一个二次规划问题,时间花销稍大。Li等人在[Li L, Li GQ, Huang LW. Generation of equidistance cages. Journal of Computer-Aided Design & Computer Graphics, 2011,23(6): 956−963 (in Chinese with English abstract).]中提出通过体素化抽取三维距离场等值面来构造cage。在该方法中为提高计算距离场的效率需要简化模型,抽取等值面重构的网格也需要简化。Xian等人使用OBB(Oriented Bounding Box)包围盒自动生成cage [Xian CH, Lin HW, Gao SM. Automatic cage generation by improved OBBs for mesh deformation. The Visual Computer, 2012, 28(1):21−33.]。该方法生成的cage体现模型的大致形状,以及一定的语义信息,但是与原模型不够贴近。陈雪等人提出基于可视外壳的cage生成方法[陈雪, 刘涛, 冯结青, 基于可视外壳的cage生成, 软件学报, 2013, 24(10):2379-2390]。该方法基于原模型的可视外壳,即原模型的某个角度的视觉效果,减少了对原模型的表示和复杂度的关系。但是由于该方法是由物体的侧影轮廓线与对应视点形成的空间区域的交集,所以对于内凹的模型(比如:杯子)的内凹区域不能体现。
随着GPU硬件性能不断提升,越来越多的计算借助GPU来实现,特别是可并行计算内容。三维网格重构也属于其中一种。Deng等人基于GPU的渲染流水线提出一种三维网格重构方法[Deng ZJ, He SQ, Shi C, Ma CH, Wu XJ. An algorithm of 3D mesh reconstructing based on the rendering pipeline. Icmit-16, Advances in Computer Science Research.]。该方法通过渲染流水线,从指定观察角度,快速重构出原模型可见区域的指定精细度的网格曲面。从多个角度观察并生成重构曲面,再融合在一起,就可以生成整个原模型的该精细度的重构网格。该方法不仅利用GPU并行计算快速重构,对内凹区域只要可见就可处理,但所得网格并不能包住原模型,所以不能当作控制笼。
技术实现要素:
本发明的目的是解决现有方法在控制笼构造上的不足,提出一种基于渲染流水线的控制笼构造方法。该方法将三维模型通过渲染流水线,在指定精细度下,构造出某个视角的前视重构网格和背视重构网格,把前视重构网格往前推,并把背视重构网格往后推,再两个网格之间的缝隙,增加一圈顶点来缝合,从而构造出原模型的控制笼。
本发明通过如下技术方案来实现上述目的:一种三维控制笼构造方法,其步骤包括:
(1)读入原网格数据;
(2)把渲染目标设置为A32B32G32R32格式纹理对象,以及设置深度比较方式;
(3)顶点着色器计算:除了正常的世界变换、观察变换和投影变换外,还给每个顶点配上一个以该顶点在物体空间中的坐标为值的纹理颜色;
(4)像素着色器计算:直接输出光栅化得到的纹理采样颜色值;
(5)若还未获得前视和背视两个结果,返回(2)渲染另一个;否则,执行(6);
(6)把前视和背视纹理过滤掉其中非模型对应的像素点,再根据各个剩余像素在二维纹理中的相对位置,构造网格曲面的拓扑结构。该拓扑结构和顶点(即把每个像素的RGB三个通道颜色值作为XYZ构造的三维顶点)构造前视网格曲面和背视网格曲面;
(7)结合两个纹理,为前视曲面的边界的每个顶点,找到背视曲面上同一视线上的对应顶点,以每两个对应顶点的中点创建一个顶点。把这些顶点作为缝合顶点,把前视曲面和背视曲面缝合在一起;
(8)求出各缝合顶点的法向量,把它往外推一定距离;
(9)把前视曲面的所有顶点,根据视线方向,往前推一定距离;把背视曲面的所有顶点,往后推一定距离。
附图说明
图1为本发明方法中的前视和背视网格缝合示意图。
图2为本发明方法的缝合顶点外推示意图。
图3为本发明方法的前视和背视网格外推示意图。
具体实施方式
下面结合附图对本发明的各个步骤进一步说明。
在(2)中,现在的大多数显卡已经支持直接渲染到一张纹理上了。为了得到前视和背视曲面,两个渲染目标纹理应该是不同的资源。两次渲染的深度比较方式设置分别采用“更近”(在Direct3D中使用D3DCMP_LESS)和“更远及相等”(在Direct3D中使用D3DCMP_GREATEREQUAL)两种方式。这将使在进行光栅化过程中,采用不同的深度比较方法,从而得到不同的结果。从视觉效果来看,更近方式得到的结果就是前视重构网格,而更远及相等方式得到的是背视重构网格。
在(3)中,给顶点配的纹理颜色,其目的是让投影空间里的物体顶点在被光栅化过程中,仍然可以很方便的访问到与其对应的物体空间中的顶点坐标。因此,可以使用各种资源输出的方式,这里采用A32B32G32R32格式的纹理。R通道保存X坐标,G通道保存Y坐标,还有B通道保存Z坐标。顶点着色器所使用的代码可以如下:
void VertDepth(float4 S : POSITION, out float4 SP : POSITION, out float4 SPT : TEXCOORD1)
{SP = mul(S, W ); SP = mul(SP , V ); SP = mul(SP , P ); SPT = S;}
其中,S为原模型顶点,W为世界变换矩阵,V为观察变换矩阵,P为投影变换矩阵,SP为投影空间中的顶点,SPT为输出的新生纹理颜色值。当然程序也不限于此,只要能够实现相应的功能即可。
在(4)中,像素着色器所使用的代码可以如下:
void PixDepth(float4 SPT : TEXCOORD1, out float4 SN : COLOR)
{SN = SPT ;}
其中,SPT是光栅化而采样得到的纹理颜色,即采样得到原模型上对应点的坐标。当然程序也不限于此,只要能够实现相应的功能即可。
在(5)中,可由用户指定不同的顺序,但总要把前视和背视的都生成,才后进行后续的操作。值得注意的是,在这个过程中,不能该观察角度或远近,否则,将影响到后面生成的两个纹理在轮廓上不一致。
在(6)中,两个纹理在未被渲染前,可预先设置指定值,比如:RGB的三个通道都是非常大的数,那么在渲染后,由于在模型覆盖的像素写入了模型的坐标,所以很容易区分哪些属于模型的,哪些是非模型的。在这里,纹理内各个像素既是一幅图像中的一个像素,还对应着三维空间中的一个点。可以依据像素间的位置关系来确定各个顶点的相邻关系,从而构造出三维网格曲面。
在(7)中,如果生成两个纹理期间,变换矩阵不发生改变,那么两个纹理中模型的边界应该刚好重合。那么在两个纹理中模型边界上处于同一位置的像素,即是同一视线上的对应点,也是相对应的三维顶点。曲面缝合的一种方式可以如图1。如图中,假设是从右边观察模型,黑色线条表示的是前面重构所得的网格曲面,那么右边的网格(仅显示了部分)为使用“更近”比较方式得到前视重构网格曲面,而左边的网格(仅显示了部分)为背视重构网格曲面。两个曲面的边界从观察者来看,对应点是在同一视线上的。取对应点的中点,构造新顶点,再和边界顶点一起构造三角形,形成缝合带。
在(8)中,对每个缝合点,结合与其同一视线上的点、以及边界上相邻的一个点,即可构成一个三角形,使用向量叉乘,求出三角形的法向量。缝合点往外推的方式如图2。图中以一个圆柱体模型的横截面为例,显示的包括相应的网格顶点。缝合点的法向量,通过一个细箭头来表示。缝合点可以沿着法向量往外移动一定距离。具体外推距离,用户可以根据模型情况来进行调整。然后相应的边也跟着被调整。移动结果用虚线表示。
在(9)中,可根据(7)中所述的任意一对顶点,计算出视线方向。两个顶点坐标相减,即可得到视线方向或其相反方向。前视和背视曲面往外推的例子如图3。该图仍然以圆柱体模型的横截面为例,显示的包括相应的网格顶点。在缝合点推出后,再把前视曲面沿着观察方向的相反方向移动一定距离,而把背视曲面沿着观察方向移动一定距离。移动结果用虚线表示。这样即可构造出原模型的控制笼网格。
本发明方法基于渲染流水线,对于模型的各种表示方式,比如:参数化模型、多边形网格、点云等,只要能够渲染出物体,可形成和物体对应的深度场,就可以用本方法来构造出跟目标模型相对应的三维控制笼。