一种三维场景的彩铅风格处理方法

文档序号:10513164阅读:218来源:国知局
一种三维场景的彩铅风格处理方法
【专利摘要】本发明公开了一种三维场景的彩铅风格处理方法,包括以下步骤:步骤1,导入三维场景模型,输入参数;步骤2,提取三维场景轮廓:提取三维场景的外轮廓线以及由曲率变化导致的内轮廓线,使用随光照变化的阈值模拟实际绘画中轮廓线的粗细变化;步骤3,生成排线:根据输入参数自动生成排线并存储;步骤4,生成纸纹:根据输入参数,生成纸纹;步骤5,实现排线动态效果:实时获取摄像机的平移、旋转以及缩放参数,对三维场景模型进行真实感渲染,对渲染结果采样得到排线的实时颜色参数,计算排线的参数变化并显示;步骤6,生成彩铅效果:将步骤5得到的排线结合步骤2得到的三维场景轮廓以及步骤4得到的纸纹,合成最终效果。
【专利说明】
一种三维场景的彩铅风格处理方法
技术领域
[0001 ] 本发明属于计算机图形学,非真实感绘制(Non-Photorealistic Rendering)等领 域,涉及一种三维场景的彩铅风格处理方法,更具体的是,涉及一种根据用户交互在三维场 景中生成彩铅风格排线的方法。
【背景技术】
[0002] 计算机图形学一方面致力于绘制更具真实感的场景,为了精细呈现各种反射、折 射而使用不同的技术,另一方面也致力于绘制非写实的艺术风格,这就是非真实感绘制领 域的研究内容。绘制受到绘画,演示以及卡通动画的启发,应用于电影和游戏中,也应用在 科学可视化等领域。绘制主要包括两个方向,一是模拟传统绘画介质生成的艺术风格,比如 铅笔、水彩、水墨、油画、浮雕等,另一种是创造出新的艺术风格,比如卡通、波点、使用文字 绘画等。绘制的实现方法也分为两种,一种是图像处理,类似于滤镜效果,算法通常使用各 种卷积运算。另一种是基于笔画的绘制,即绘制过程是生成笔画,然后放置于合适的位置。 根据实际的绘画工具,可以详细定值笔画效果,每一个笔画是由更小的像素块叠加形成的, 笔画的压力系数由透明度表示,粗细效果及握笔角度由像素块的形状和大小表示。
[0003] 彩铅风格是传统绘画的一种,彩铅画一般颜色较轻且画面较明亮(参考文章: Combining Sketch and Tone for Pencil Drawing Production),绘画过程一般使用成组 的平行线叠加,一组方向大致平行的连续画出的线被称为排线。目前针对铅笔风格的绘制 有不少文章,输入为二维图像或三维场景(参考文章:IdiotPencil: An Interactive System for Generating Pencil Drawing From 3D Polygonal Models)。专门针对彩铅风 格绘制的文章相对较少,输入为三维场景的彩铅风格绘制的文章相对更少。
[0004] 由于不同的艺术家的绘制风格不同,在使用程序生成绘画风格时,可以使用半自 动的方法。即由用户指定绘制的参数,程序对参数进行推断自动生成绘画效果。这样用户只 需要少量的交互就可以得到一组结果,从而很大程度的加速绘画过程。

【发明内容】

[0005] 发明目的:本发明所要解决的技术问题是针对三维场景进行彩铅风格的绘制,在 三维场景中进行动画的过程中,自动应用彩铅风格,从而加速绘画过程。
[0006] 技术方案:本发明公开了一种三维场景的彩铅风格处理方法,其核心提供绘画的 软件系统,并提供自动生成排线的算法以及动画过程中排线运动的算法,其特征在于,包括 以下步骤:
[0007] 步骤1,搭建用于用户交互的用户交互界面,导入三维场景模型,输入参数,完成三 维场景模型的常规渲染;
[0008] 步骤2,提取三维场景轮廓:提取三维场景的外轮廓线以及由曲率变化导致的内轮 廓线,使用随光照变化的阈值模拟实际绘画中轮廓线的粗细变化;
[0009] 步骤3,生成排线:根据输入参数自动生成排线并存储;排线的生成需要获取以下 几部分信息:用户输入排线参数、三维场景几何信息,以及三维场景光照信息。获取信息之 后计算得到三维场景中自动生成的排线并存储;
[0010] 步骤4,生成纸纹:根据输入参数,使用算法生成纸纹;
[0011] 步骤5,实现排线动态效果:实时获取摄像机的平移、旋转以及缩放参数,对三维场 景模型进行真实感渲染,对渲染结果采样得到排线的实时颜色参数,计算排线的参数变化 并显示;
[0012] 步骤6,生成彩铅效果:将步骤5得到的排线结合步骤2得到的三维场景轮廓以及步 骤4得到的纸纹,合成最终效果。
[0013] 步骤1中,搭建程序界面用于获取用户交互,导入三维模型的OBJ(几何信息)及MTL (材质纹理)文件,完成场景的常规渲染,包括:
[0014] 导入包含材质和纹理信息的三维场景模型文件,在三维场景模型中加入点光源, 使用OpenGL(开源图形库)对三维场景模型进行实时渲染,渲染绘制区域称为画布,绘制过 程获得三维场景模型的颜色缓存、法向图缓存及深度图缓存;缓存作为中间结果为后续步 骤提供信息,不直接显示在画布上;
[0015] 输入参数包括:排线大小参考值S、排线间隔参考值I、排线方向参考值D、排线透明 度参考值A、排线大小抖动值SJitter、排线水平方向位置抖动值XJitter、排线竖直方向位 置抖动值YJitter、排线方向抖动值DJitter、排线透明度抖动值AJitter、透明度渐变模式、 画布中排线起始和终止位置、轮廓线阈值Ta和Tb、噪声频率f、噪声振幅系数p、要生成的纸 纹大小及粗糙程度参数、画布大小参数。相邻两组排线可以使用相同的参数,也可以通过用 户交互使用不同的参数。
[0016] 步骤2中,提取三维场景的外轮廓以及由曲率变化导致的轮廓线,模拟实际绘画中 轮廓线的粗细变化并且消除屏幕锯齿,包括以下步骤:
[0017] 步骤2-1,提取三维场景模型的外轮廓线:当视线角度与三维场景模型上点的法向 夹角的余弦值小于一定阈值时,判定该点是轮廓,该阈值为函数Ta+ (Tb-Ta) *Tp的取值,其 中Ta为阈值下限,Tb为阈值上限,Τρ为百分比差值,Ta、Tb和Τρ的取值范围为[0,1 ],Τρ值为 三维场景模型上点的法向与光照方向夹角余弦值的绝对值,计算结果使得三维场景模型点 方向平行于光照方向时阈值取最大值,垂直于光照方向时阈值取最小值;对于光滑的集合 表面,法向的连续变化导致轮廓阈值的连续变化,最终呈现线条粗细的均匀变化;
[0018] 步骤2-2,提取三维场景模型的内轮廓线:当三维物体网格的曲率变化时会呈现出 内轮廓线,此时采用提取暗示轮廓线(Suggestive Contours)的方法提取三维场景模型的 内轮廓线,具体做法是选取模型点法向与视线方向点积在DirectionW方向上取得极小值的 点作为暗示轮廓,其中DirectionW是视线方向在模型点切平面的投影方向(参考文章: Suggestive Contours for Conveying Shape);
[0019] 步骤2-3,对提取的外轮廓线和内轮廓线应用多重采样抗锯齿消除锯齿效果,使轮 廓线的显示更平滑。首先开辟普通帧缓存内存16倍大小的超采样帧缓存,设置采样数为16 进行采样。在OpenGL(开源图形库)中,采样方法有两种,一种是选取坐标最接近的一个像素 作为采样值,这种做法简单快速;第二种选取坐标周围的像素值进行加权平均,这种做法速 度稍慢但画面更平滑。可以根据对效率及画面质量的平衡选择不同的采样数以及采样方 法。
[0020] 步骤3中,排线参数的自动生成,包括以下步骤:
[0021] 步骤3-1,确定排线在三维场景模型中的位置:用户每次绘制一组排线时采用如下 两种方式指定排线端点:
[0022]在画布上指定一组排线的两个端点,端点位置分别为PosO和Posl,三维场景模型 中将自动在两个端点之间生成两条以上排线,根据输入的排线间隔参考值I和位置抖动值 XJitter、YJitter计算生成的排线的位置:第η条排线水平方向的位置为(PosO.X+ (Posl · X-PosO · X)*n)+XRange*Random(XJitter),竖直方向的位置为(PosO · Y+(Posl · Υ-PosO · Y)*n)+YRange*Random(YJitter)。其中η表示排线的序号,PosO ·Χ表示点PosO在水平 方向的坐标,PosO.Y表示点PosO在竖直方向的坐标,Posl. X表示点Po s 1在水平方向的坐标, Posl.Y表示点Posl在竖直方向的坐标,XRange和YRange为固定值,表示允许随机的像素范 围,RandomO表示随机函数,得到结果后记录计算出的一组排线位置,将所有的排线位置投 影到三维场景模型中,记录三维场景模型中的排线位置;
[0023]用户在画布上指定贝塞尔曲线的三个端点,三维场景模型中将自动在端点确 定的贝塞尔曲线上自动生成两条以上排线;对于三个端点?〇82、?〇83、?〇84,首先计算 Pos2到Pos3距离与Pos3到Pos4距离之和Len,Len/I得到排线数num,对于第i条排线,
当三维场景运动时,排线位置做相应的运动;
[0024] 步骤3-2,确定排线的基础大小及基础方向:根据输入的排线大小参考值S和排线 大小抖动值5]11^61'计算排线基础大小,排线基础大小为3*(1+1^111(1〇111(3]11^617 /2)),。根据 输入的排线方向参考值D和排线方向抖动值DJitter计算排线基础方向,基础方向为D+ Random(DRange*DJitter),其中DRange为固定值;参数范围及计算公式见表1。
[0025]
[0026]
[0027] 表 1
[0028] 步骤3-3,确定排线的基础颜色:基础颜色是指不考虑透明度值的抖动及渐变之前 计算的数值,对三维场景模型打光照之后进行渲染,物体的材质可以使用布林材质或者朗 伯材质,渲染完成之后对排线位置处的颜色缓存进行采样作为基础颜色;
[0029]步骤3-4,对排线基础颜色进行校正:彩铅的颜色与真实颜色相比更加明亮,使用 大量实际彩铅的例子拟合出色彩分布曲线,归一化后得到直方图G1;对于待处理排线基础 颜色缓存的每个通道归一化得到直方图G2,然后进行直方图匹配(参考文章 :Combining Sketch and Tone for Pencil Drawing Production)。划分通道的颜色空间可以米用RGB (红绿蓝空间)、HSL(色相饱和度明度空间)或者YUV(亮度色度空间),在实际的例子中,YUV 空间效果较好;
[0030] 步骤3-5,确定排线透明度及绘制在场景中的颜色:对于透明度值的确定,根据输 入的排线透明度参考值A和排线透明度抖动值AJitter计算基础透明度,如果透明度渐变模 式参数取值为内渐变,则一组排线中所有排线基础透明度值一致,每一条排线之内进行均 匀渐变,排线内像素点的水平方向坐标StrokeX,排线宽度StrokeWidth,排线内像素点的透
,其中Random表示以AJitter为参数的随机 函数;如果透明度渐变模式参数取值为外渐变,则一组排线中的排线之间进行渐变,设一组排 线一共有StrokeNum条,其中第si条排线的透明度为
si表示排线序号;算透明度值时须将透明度通道与颜色通道分离,当透明度值最终确定以 后,再将透明度通道与颜色通道合并;
[0031] 步骤4中,生成指定颗粒及大小的纸纹效果,包括以下步骤:
[0032]步骤4-1,对纸纹像素值进行均匀采样,根据用户输入的噪声频率f和噪声振幅系 数P对画布内的像素点进行均匀采样,噪声频率f取值范围[1,16],噪声振幅系数P取值范围 [0. 1,1],使用六个噪声函数叠加得到采样点的采样值,噪声函数编号i取值范围[0,5],第i 个噪声函数的噪声频率为f $21,第i个噪声函数的噪声振幅为p1;
[0033]步骤4-2,对纸纹像素值进行差值计算:应用步骤4-1得到的采样值,设需要差值的 两个像素值分别为a和b,差值点的比例系数为px,计算差值得到差值结果为c。
[0034]步骤4-2中,根据步骤1中输入的要生成的纸纹的粗糙程度参数,使用不同的插值 算法:
[0035]如果是不光滑纸纹,使用线性差值,计算方法为:
[0036] C = a*(l-px)+b*px。这种方法计算速度最快,但视觉效果最差,得到的纸纹最粗 糖;
[0037] 如果是较光滑纸纹,使用余弦差值,计算方法为:
[0038] c = a*( l_px*PI )+b*( 1-cos(px*PI) )*0 · 5,其中PI表示圆周率。这种方法计算速度 适中,视觉效果较好,得到的纸纹较平滑;
[0039]如果是非常光滑纸纹,使用三次差值,计算方法为:
[0040] 记录a的前一个像素值ao和b的后一个像素值bi,计算co= (bi-b)-(ao-a),c = co* px3+(a〇-a-co)*px2+(bi-a())*px+a。这种方法需要的参数最多,计算速度最慢,但视觉效果最 好,得到的纸纹非常平滑;以上三种方法实现效果均属于经典柏林噪声(参考文章 :Perlin Noise)〇
[0041] 步骤5中,对排线应用动态变化的效果,包括以下步骤:
[0042]步骤5-1,对步骤3-2计算得到排线基础大小进一步调整:根据摄像机与三维场景 模型的实时距离w调整排线的显示大小,使用1减去归一化的w值作为缩放因子 ScaleFactor,计算公式为ScaleFactor= l-Normalize(w),其中Normalize是以w为参数的 函数。距离近时w值较小,缩放因子取值较大,显示的排线尺寸较大,距离远时w值较大,缩放 因子取值较小,显示的排线尺寸较小;根据三维场景模型点的法向与视线的夹角调整排线 的尺寸,三维场景模型点的法向与视线的方向平行时排线达到最大尺寸,三维场景模型点 的法向与视线的方向垂直时达到最小尺寸;
[0043]步骤5-2,生成排线点精灵:在OpenGL中点精灵是指三维场景中的二维平面,永远 保持正对摄像机;以步骤3-1中确定的排线位置作为点精灵在三维场景模型中的初始位置, 点精灵图像显示的内容为彩铅笔画的形状;
[0044]步骤5-3,当摄像机进行平移旋转缩放操作时,控制排线的实时变化,其中缩放表 示镜头远近的拉伸。具体做法是实时移动旋转排线在三维场景模型中的位置。移动旋转相 机操作通常伴随着光照的变化,这时需要实时采集三维场景中的光照信息用于修改排线的 颜色;
[0045] 步骤6中,合成最终的彩铅效果,包括以下步骤:
[0046] 步骤6-1,合并轮廓线:在画布上首先绘制排线,之后绘制轮廓线,将轮廓线上非轮 廓的部分填充为完全透明像素,然后与排线层进行颜色融合;
[0047]步骤6-2,应用纸纹效果,在已有轮廓线加排线的基础上,对画布上的全部像素的 透明度值,乘以纸纹的颜色值作为最终的透明度值,透明度值取值范围[0,1],〇为完全透 明,1为完全不透明;
[0048]步骤6-3,可选的后期处理,将动画场景逐帧保存,对每帧应用颜色校正,从而与实 际的彩铅效果更加接近。
[0049]有益效果:本发明的显著优点是:
[0050] (1)本发明为计算机生成彩铅风格效果设计了一个交互式系统,用户通过简单交 互生成大量排线,与手工绘制相比大幅提高绘制效率;
[0051] (2)本发明提出彩铅风格绘制具有一般性,对于不同三维场景、不同光照效果以及 不同动态效果均适用;
[0052] (3)本发明为彩铅风格的动画生成提供了高效方法,除了色彩直方图匹配需要后 期处理之外,其余动画效果均可以实时显示。
【附图说明】
[0053]图1为本发明方法的基本流程图。
[0054]图2为不同参数下的轮廓线提取。
[0055] 图3为用户交互排线端点的位置。
[0056] 图4为透明度模式。
[0057]图5为实例绘制结果。
【具体实施方式】
[0058] 下面结合附图和【具体实施方式】对本发明做更进一步的具体说明。
[0059] 本方法的流程图如图1所示,使用OpenGL实时绘制场景,摄像机参数变化时实时捕 捉并记录场景渲染的中间结果,比如颜色、法向、深度等,为排线颜色值的采样做准备;获取 用户对于每一组排线参数的输入,包括位置、大小、方向等,作为基础参数为进一步处理做 准备;根据当前帧修改实时排线参数自动生成排线;轮廓提取和纸纹生成作为两个相对独 立的模块,与实时生成的排线合并形成最终的彩铅效果。如果对颜色有进一步要求,可以对 每一帧画面进行直方图匹配后期处理。
[0060] 具体的说,如图1所示,本发明公开了一种三维场景的彩铅风格处理方法,主要包 括以下几个步骤:
[0061] 步骤1,搭建用于用户交互的用户交互界面,导入三维场景模型,输入参数,完成三 维场景模型的常规渲染;
[0062] 步骤2,提取三维场景轮廓:提取三维场景的外轮廓线以及由曲率变化导致的内轮 廓线,使用随光照变化的阈值模拟实际绘画中轮廓线的粗细变化;
[0063] 步骤3,生成排线:根据输入参数自动生成排线并存储;排线的生成需要获取以下 几部分信息:用户输入排线参数、三维场景几何信息,以及三维场景光照信息。获取信息之 后计算得到三维场景中自动生成的排线并存储;
[0064] 步骤4,生成纸纹:根据输入参数,使用算法生成纸纹;
[0065] 步骤5,实现排线动态效果:实时获取摄像机的平移、旋转以及缩放参数,对三维场 景模型进行真实感渲染,对渲染结果采样得到排线的实时颜色参数,计算排线的参数变化 并显示;
[0066]步骤6,生成彩铅效果:将步骤5得到的排线结合步骤2得到的三维场景轮廓以及步 骤4得到的纸纹,合成最终效果。
[0067]步骤1中,搭建程序界面用于获取用户交互,导入三维模型的OBJ(几何信息)及 MTL(材质纹理)文件,完成场景的常规渲染,包括:
[0068]导入包含材质和纹理信息的三维场景模型文件,在三维场景模型中加入点光源, 使用OpenGL(开源图形库)对三维场景模型进行实时渲染,渲染绘制区域称为画布,绘制过 程获得三维场景模型的颜色缓存、法向图缓存及深度图缓存;缓存作为中间结果为后续步 骤提供信息,不直接显示在画布上;
[0069] 输入参数包括:排线大小参考值S、排线间隔参考值I、排线方向参考值D、排线透明 度参考值A、排线大小抖动值SJitter、排线水平方向位置抖动值XJitter、排线竖直方向位 置抖动值YJitter、排线方向抖动值DJitter、排线透明度抖动值AJitter、透明度渐变模式、 画布中排线起始和终止位置、轮廓线阈值Ta和Tb、噪声频率f、噪声振幅系数p、要生成的纸 纹大小及粗糙程度参数、画布大小参数。相邻两组排线可以使用相同的参数,也可以通过用 户交互使用不同的参数。照相机参数由鼠标键盘获得,与常规三维软件的操作方式类似。
[0070] 步骤2中,提取三维场景的外轮廓以及由曲率变化导致的轮廓线,模拟实际绘画中 轮廓线的粗细变化并且消除屏幕锯齿,包括以下步骤:
[0071] 步骤2-1,提取三维场景模型的外轮廓线:当视线角度与三维场景模型上点的法向 夹角的余弦值小于一定阈值时,判定该点是轮廓,该阈值为函数Ta+ (Tb-Ta) *Tp的取值,其 中Ta为阈值下限,Tb为阈值上限,Τρ为百分比差值,Ta、Tb和Τρ的取值范围为[0,1 ],图2显示 了Ta、Tb取不同值时轮廓线外观的变化,Τρ值为三维场景模型上点的法向与光照方向夹角 余弦值的绝对值,计算结果使得三维场景模型点方向平行于光照方向时阈值取最大值,垂 直于光照方向时取最小值;对于光滑的集合表面,法向的连续变化导致轮廓阈值的连续变 化,最终呈现线条粗细的均匀变化,效果如图2所示,图2中(a)为原始图像,图2中(b)为阈值 为[0.1,0.3]时的图像,图2中(〇)为阈值为[0.2,0.4]时的图像;
[0072]步骤2-2,提取三维场景模型的内轮廓线:当三维物体网格的曲率变化时会呈现出 内轮廓线,此时采用提取暗示轮廓线(Suggestive Contours)的方法提取三维场景模型的 内轮廓线,具体做法是选取模型点法向与视线方向点积在DirectionW方向上取得极小值的 点作为暗示轮廓,其中DirectionW是视线方向在模型点切平面的投影方向(参考文章: Suggestive Contours for Conveying Shape);
[0073] 步骤2-3,对提取的外轮廓线和内轮廓线应用多重采样抗锯齿消除锯齿效果,使轮 廓线的显示更平滑。首先开辟普通帧缓存内存16倍大小的超采样帧缓存,设置采样数为16 进行采样。在OpenGL(开源图形库)中,采样方法有两种,一种是选取坐标最接近的一个像素 作为采样值,这种做法简单快速;第二种选取坐标周围的像素值进行加权平均,这种做法速 度稍慢但画面更平滑。可以根据对效率及画面质量的平衡选择不同的采样数以及采样方 法。
[0074] 步骤3中,排线参数的自动生成,包括以下步骤:
[0075]步骤3-1,确定排线在三维场景模型中的位置:用户每次绘制一组排线时采用如下 两种方式指定排线端点:
[0076]在画布上指定一组排线的两个端点,端点位置分别为PosO和Posl,三维场景模型 中将自动在两个端点之间生成两条以上排线,根据输入的排线间隔参考值I和位置抖动值 父]11^61'、¥]11^61'计算生成的排线的位置:第11条排线水平方向的位置为(?08〇.乂+(?081.父-PosO .X)*n)+XRange*Random(XJitte;r),竖直方向的位置为(PosO. Y+(Posl · Y-PosO. Y)*n) + YRange*Random(YJitter)。其中η表示排线的序号,PosO ·Χ表示点PosO在水平方向的坐标, PosO.Y表示点PosO在竖直方向的坐标,Posl .X表示点Posl在水平方向的坐标,Posl .Y表示 点Posl在竖直方向的坐标,XRange和YRange为固定值,表示允许随机的像素范围,RandomO 表示随机函数,得到结果后记录计算出的一组排线位置,如图3所示。将所有的排线位置投 影到三维场景模型中,记录三维场景模型中的排线位置;
[0077]用户在画布上指定贝塞尔曲线的三个端点,三维场景模型中将自动在端点确 定的贝塞尔曲线上自动生成两条以上排线;对于三个端点?〇82、?〇83、?〇84,首先计算 Pos2到Pos3距离与Pos3到Pos4距离之和Len,Len/I得到排线数num,对于第i条排线,i表 示排线序号,取值范围[0,num-l],水平方向的位置为(1 - i/num ) % /如2.A +
当三维场景运动时,排线位置做相应的运动;
[0078]步骤3-2,确定排线的基础大小及基础方向:根据输入的排线大小参考值S和排线 大小抖动值SJitter计算排线基础大小,基础大小等于S*(l+Random(SJitter/2)),。根据输 入的排线方向参考值D和排线方向抖动值DJitter计算排线基础方向,基础方向等于D+ Random(DRange*DJitter),其中DRange为固定值,参数范围及计算公式见表1。
[0079]
[0080] 表 1
[0081] 步骤3-3,确定排线的基础颜色:基础颜色是指不考虑透明度值的抖动及渐变之前 计算的数值,对三维场景模型打光照之后进行渲染,物体的材质可以使用布林材质或者朗 伯材质,渲染完成之后对排线位置处的颜色缓存进行采样作为基础颜色;
[0082]步骤3-4,对排线基础颜色进行校正:彩铅的颜色与真实颜色相比更加明亮,使用 大量实际彩铅的例子拟合出色彩分布曲线,归一化后得到直方图G1;对于待处理排线基础 颜色缓存的每个通道归一化得到直方图G2,然后进行直方图匹配(参考文章 :Combining Sketch and Tone for Pencil Drawing Production)。划分通道的颜色空间可以米用RGB (红绿蓝空间)、HSL(色相饱和度明度空间)或者YUV(亮度色度空间),在实际的例子中,YUV 空间效果较好;由于颜色校正计算较复杂,所以这个过程不适用于实时处理,只用于后期处 理;
[0083] 步骤3-5,确定排线透明度及绘制在场景中的颜色:对于透明度值的确定,根据输 入的排线透明度参考值A和排线透明度抖动值AJitter计算基础透明度,如果透明度渐变模 式参数取值为内渐变,则一组排线中所有排线基础透明度值一致,每一条排线之内进行均 匀渐变,排线内像素点的水平方向坐标StrokeX,排线宽度StrokeWidth,排线内像素点的透

,其中Random表示以AJi tter为参数的随机函数, 如图仲⑻所示;如果透明度渐变模式参数取值为外渐变,则一组排线中的排线之间进行渐变,设 一组排线一共有StrokeNum条,其中第si条排线的透明度为 si表示排线序号,如图4中(a)所示;算透明度值时须将透明度通道与颜色通道分离,当透明 度值最终确定以后,再将透明度通道与颜色通道合并;
[0084] 步骤4中,生成指定颗粒及大小的纸纹效果,包括以下步骤:
[0085] 步骤4-1,对纸纹像素值进行均匀采样,根据用户输入的噪声频率f和噪声振幅系 数P对画布内的像素点进行均匀采样,噪声频率f取值范围[1,16],噪声振幅系数p取值范围 [0. 1,1],使用六个噪声函数叠加得到采样点的采样值,噪声函数编号i取值范围[0,5],第i 个噪声函数的噪声频率为f *2i,第i个噪声函数的噪声振幅为pi;
[0086] 步骤4-2,对纸纹像素值进行差值计算:应用步骤4-1得到的采样值,设需要差值的 两个像素值分别为a和b,差值点的比例系数为px,计算差值得到差值结果为c。
[0087] 步骤4-2中,根据步骤1中输入的要生成的纸纹的粗糙程度参数,使用不同的插值 算法(现有技术中有多种算法,本实施例中使用了三种常见的算法):
[0088]如果是不光滑纸纹,使用线性差值,计算方法为:
[0089] c = a*(l_px)+b*px。这种方法计算速度最快,但视觉效果最差,得到的纸纹最粗 糖;
[0090]如果是较光滑纸纹,使用余弦差值,计算方法为:
[0091 ] c = a*( l_px*PI )+b*( 1-cos(px*PI) )*0 · 5,其中PI表示圆周率。这种方法计算速度 适中,视觉效果较好,得到的纸纹较平滑;
[0092]如果是非常光滑纸纹,使用三次差值,计算方法为:
[0093] 记录a的前一个像素值a〇和b的后一个像素值bi,计算c〇= (bi-b)-(ao-a),c = c〇* px3+(£U)-a-C())*px2+(bi-a())*px+a。这种方法需要的参数最多,计算速度最慢,但视觉效果最 好,得到的纸纹非常平滑;以上三种方法实现效果均属于经典柏林噪声(参考文章 :Perlin Noise)〇
[0094] 步骤5中,对排线应用动态变化的效果,包括以下步骤:
[0095] 步骤5-1,对步骤3-2计算得到排线基础大小进一步调整:根据摄像机与三维场景 模型的实时距离w调整排线的显示大小,使用1减去归一化的w值作为缩放因子 ScaleFactor,计算公式为ScaleFactor = l-Normalize(w),其中Normalize是以w为参数的 函数。距离近时w值较小,缩放因子取值较大,显示的排线尺寸较大,距离远时w值较大,缩放 因子取值较小,显示的排线尺寸较小;根据三维场景模型点的法向与视线的夹角调整排线 的尺寸,三维场景模型点的法向与视线的方向平行时排线达到最大尺寸,三维场景模型点 的法向与视线的方向垂直时达到最小尺寸;
[0096]步骤5-2,生成排线点精灵:在OpenGL中点精灵是指三维场景中的二维平面,永远 保持正对摄像机;以步骤3-1中确定的排线位置作为点精灵在三维场景模型中的初始位置, 点精灵图像显示的内容为彩铅笔画的形状;此实施方式中录入了三组,每组十种不同的彩 铅画笔形状,每一组排线应用由用户指定的一种画笔形状;
[0097]步骤5-3,当摄像机进行平移旋转缩放操作时,控制排线的实时变化,其中缩放表 示镜头远近的拉伸。具体做法是实时移动旋转排线在三维场景模型中的位置。移动旋转相 机操作通常伴随着光照的变化,这时需要实时采集三维场景中的光照信息用于修改排线的 颜色;
[0098] 步骤6中,合成最终的彩铅效果,包括以下步骤:
[0099] 步骤6-1,合并轮廓线:在画布上首先绘制排线,之后绘制轮廓线,将轮廓线上非 轮廓的部分填充为完全透明像素,然后与排线层进行颜色融合;
[0100]步骤6-2,应用纸纹效果,在已有轮廓线加排线的基础上,对画布上的全部像素的 透明度值,乘以纸纹的颜色值作为最终的透明度值,透明度值取值范围[0,1],〇为完全透 明,1为完全不透明;
[0101]步骤6-3,可选的后期处理,将动画场景逐帧保存,对每帧应用颜色校正,从而与实 际的彩铅效果更加接近。
[0102] 实施例
[0103] 本实施例的实验硬件环境是:英特尔第二代酷睿i3-2100 3.10GHz双核CPU(处理 器),NVDIA GeForce GTS 450 GPU(显卡),4G内存,软件环境是 MicrosoftVisualStudio2010(软件开发工具)、Qt5(图形用户界面应用程序开发框架)和 0penGL4.3(开源图形库)。
[0104]步骤1,搭建程序界面:搭建程序界面用于获取用户交互、导入三维模型,完成场景 的常规渲染;
[0105] 步骤2,三维场景轮廓提取:提取三维场景的外轮廓线以及由曲率变化导致的内轮 廓线,模拟实际绘画中轮廓线的粗细变化,使用多重采样抗锯齿;
[0106] 步骤3,排线自动生成:排线的生成需要获取以下几部分信息:用户输入排线参数、 二维场景几何?目息,以及二维场景光照?目息。获取?目息之后计算得到二维场景中自动生成 的排线并存储;
[0107] 步骤4,纸纹生成:根据用户指定的纸纹大小及粗糙程度等参数,使用算法生成纸 纹;
[0108] 步骤5,实现排线动态效果:实时获取摄像机的平移、旋转以及缩放参数,对场景进 行真实感渲染,对渲染结果采样得到排线的实时颜色参数,使用算法计算排线的参数变化 并显示;
[0109] 步骤6,生成彩铅效果:将步骤5得到的排线应用步骤2得到的轮廓以及步骤4得到 的纸纹,合成最终效果,最终效果如图5所示。
[0110]本发明提供了一种三维场景的彩铅风格处理方法,具体实现该技术方案的方法和 途径很多,以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人 员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也 应视为本发明的保护范围。本实施例中未明确的各组成部分均可用现有技术加以实现。
【主权项】
1. 一种三维场景的彩铅风格处理方法,其特征在于,包括以下步骤: 步骤1,导入三维场景模型,输入参数; 步骤2,提取三维场景轮廓:提取三维场景的外轮廓线以及由曲率变化导致的内轮廓 线,使用随光照变化的阈值模拟实际绘画中轮廓线的粗细变化; 步骤3,生成排线:根据输入参数自动生成排线并存储; 步骤4,生成纸纹:根据输入参数,生成纸纹; 步骤5,实现排线动态效果:实时获取摄像机的平移、旋转以及缩放参数,对三维场景模 型进行真实感渲染,对渲染结果采样得到排线的实时颜色参数,计算排线的参数变化并显 示; 步骤6,生成彩铅效果:将步骤5得到的排线结合步骤2得到的三维场景轮廓以及步骤4 得到的纸纹,合成最终效果。2. 如权利要求1所述的一种三维场景的彩铅风格处理方法,其特征在于,步骤1包括: 导入包含材质和纹理信息的三维场景模型文件,在三维场景模型中加入点光源,使用 OpenGL对三维场景模型进行实时渲染,渲染绘制区域称为画布,绘制过程获得三维场景模 型的颜色缓存、法向图缓存及深度图缓存; 输入参数包括:排线大小参考值S、排线间隔参考值I、排线方向参考值D、排线透明度参 考值A、排线大小抖动值SJitter、排线水平方向位置抖动值XJitter、排线竖直方向位置抖 动值YJitter、排线方向抖动值DJitter、排线透明度抖动值AJitter、透明度渐变模式、画布 中排线起始和终止位置、轮廓线阈值Ta和Tb、噪声频率f、噪声振幅系数p、要生成的纸纹大 小及粗糙程度参数、画布大小参数。3. 如权利要求2所述的一种三维场景的彩铅风格处理方法,其特征在于,步骤2包括以 下步骤: 步骤2-1,提取三维场景模型的外轮廓线:当视线角度与三维场景模型上点的法向夹角 的余弦值小于一定阈值时,判定该点是轮廓,该阈值为函数Ta+ (Tb-Ta) *Tp的取值,其中Ta 为阈值下限,Tb为阈值上限,Tp为百分比差值,Ta、Tb和Tp的取值范围为[0,1 ],Tp值为三维 场景模型上点的法向与光照方向夹角余弦值的绝对值,计算结果使得三维场景模型点方向 平行于光照方向时阈值取最大值,垂直于光照方向时阈值取最小值; 步骤2-2,提取三维场景模型的内轮廓线:当三维物体网格的曲率变化时会呈现出内轮 廓线,此时采用提取暗示轮廓线的方法提取三维场景模型的内轮廓线; 步骤2-3,对提取的外轮廓线和内轮廓线应用多重采样抗锯齿消除锯齿效果,使轮廓线 的显示更平滑。4. 如权利要求3所述的一种三维场景的彩铅风格处理方法,其特征在于,步骤3包括以 下步骤: 步骤3-1,确定排线在三维场景模型中的位置:每次绘制一组排线时采用如下两种方式 指定排线端点: 在画布上指定一组排线的两个端点,端点位置分别为PosO和Posl,三维场景模型中将 自动在两个端点之间生成两条以上排线,根据输入的排线间隔参考值I和位置抖动值 父]11^61'、¥]11^61'计算生成的排线的位置 :第11条排线水平方向的位置为(?08〇.乂+(?081.父-PosO.X)*n)+XRange*Random(XJitte;r),竖直方向的位置为(PosO.Y+(Posl ·Y-PosO.Y)*n) + YRange*Random(YJitter),PosO ·Χ表示点PosO在水平方向的坐标,PosO · Y表示点PosO在竖 直方向的坐标,Posl .X表示点Posl在水平方向的坐标,Posl .Y表示点Posl在竖直方向的坐 标,XRange和YRange为固定值,表示允许随机的像素范围,Random()表示随机函数,得到结 果后记录计算出的一组排线位置,将所有的排线位置投影到三维场景模型中,记录三维场 景模型中的排线位置; 在画布上指定贝塞尔曲线的三个端点,三维场景模型中将自动在端点确定的贝塞尔曲 线上自动生成两条以上排线;对于三个端点,差值使用贝塞尔曲线函数计算; 步骤3-2,确定排线的基础大小及基础方向:根据输入的排线大小参考值S和排线大小 抖动值3]11^61'计算排线基础大小,排线基础大小为3*(1+1^111(1〇111(3]11^617/2)),根据输入 的排线方向参考值D和排线方向抖动值DJitter计算排线基础方向,基础方向为D+Random (DRange*DJitter),其中DRange为固定值; 步骤3-3,确定排线的基础颜色:对三维场景模型打光照之后进行渲染,渲染完成之后 对排线位置处的颜色缓存进行采样作为基础颜色; 步骤3-4,对排线基础颜色进行矫正:使用实际彩铅的例子拟合出色彩分布曲线,归一 化后得到直方图G1;对于待处理排线基础颜色缓存的每个通道归一化得到直方图G2,然后 进行直方图匹配; 步骤3-5,确定排线透明度及绘制在场景中的颜色:对于透明度值的确定,根据输入的 排线透明度参考值A和排线透明度抖动值AJitter计算基础透明度,如果透明度渐变模式参 数取值为内渐变,则一组排线中所有排线基础透明度值一致,每一条排线之内进行均匀渐 变;如果透明度渐变模式参数取值为外渐变,则一组排线中的排线之间进行渐变。5. 如权利要求4所述的一种三维场景的彩铅风格处理方法,其特征在于,步骤4包括以 下步骤: 步骤4-1,对纸纹像素值进行均匀采样,根据输入的噪声频率f和噪声振幅系数p对画布 内的像素点进行均匀采样,噪声频率f取值范围[1,16],噪声振幅系数p取值范围[0.1,1], 使用六个噪声函数叠加得到采样点的采样值,六个噪声函数中,第i个噪声函数的噪声频率 为f*〗 1,第i个噪声函数的噪声振幅为ρ1,其中i表示噪声函数的序号,取值范围是[0,5]; 步骤4-2,对纸纹像素值进行差值计算:应用步骤4-1得到的采样值,设需要差值的两个 噪声值即像素值分别为a和b,差值点的比例系数为px,计算差值得到差值结果为c。6. 如权利要求5所述的一种三维场景的彩铅风格处理方法,其特征在于,步骤4-2中,根 据步骤1中输入的要生成的纸纹的粗糙程度参数,使用不同的插值算法: 如果是不光滑纸纹,使用线性差值,计算方法为:C = a*(l-pX)+b*px; 如果是较光滑纸纹,使用余弦差值,计算方法为:。=3*(1-?1*?1)+13*(1-〇08(?1*?1))* 0.5,其中PI表示圆周率; 如果是非常光滑纸纹,使用三次差值,计算方法为记录a的前一个像素值ao和b的后一个 像素值bi,计算co = (bi-b)-(ao-a),c = co*px3+(a〇-a-C())*px2+(bi-a())*px+a,C()表示中间结 果。7. 如权利要求6所述的一种三维场景的彩铅风格处理方法,其特征在于,步骤5包括以 下步骤: 步骤5-1,对步骤3-2计算得到排线基础大小进一步调整:根据摄像机与三维场景模型 的实时距离W调整排线的显示大小,使用1减去归一化的w值作为缩放因子ScaleFactor,计 算公式为ScaleFactor= 1-Normalize(w),其中Normalize是以w为参数的归一化函数,根据 三维场景模型点的法向与视线的夹角调整排线的尺寸,三维场景模型点的法向与视线的方 向平行时排线达到最大尺寸,三维场景模型点的法向与视线的方向垂直时达到最小尺寸; 步骤5-2,生成排线点精灵:以步骤3-1中确定的排线位置作为点精灵在三维场景模型 中的初始位置,点精灵图像显示的内容为彩铅笔画的形状; 步骤5-3,当摄像机进行平移旋转缩放操作时,控制排线的实时变化,其中缩放表示镜 头远近的拉伸。8.如权利要求7所述的一种三维场景的彩铅风格处理方法,其特征在于,步骤6包括以 下步骤: 步骤6-1,合并轮廓线:在画布上首先绘制排线,之后绘制轮廓线,将轮廓线上非轮廓的 部分填充为完全透明像素,然后与排线层进行颜色融合; 步骤6-2,应用纸纹效果,在已有轮廓线加排线的基础上,对画布上的全部像素的透明 度值,乘以纸纹的颜色值作为最终的透明度值,透明度值取值范围[〇,1],〇为完全透明,1为 完全不透明。
【文档编号】G06T15/02GK105869203SQ201610183158
【公开日】2016年8月17日
【申请日】2016年3月28日
【发明人】郭延文, 陈丹
【申请人】南京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1