李丽亚
(太原工业学院 计算机工程系,山西 太原 030008 )
·计算机科学研究·
基于VC++的图像纹理映射算法的应用
李丽亚
(太原工业学院 计算机工程系,山西 太原 030008 )
将phong明暗算法和纹理映射方法应用于圆柱面,在圆柱面上映射一幅位图,并进行光照计算.在算法实现中,利用点表来进行图像纹理绑定.图像纹理映射主要实现的是载入纹理的功能,并且可以控制三维立体图的形状、尺寸及纹理等,并通过时间设置使三维图像最终在视觉上产生动态效果以及旋转起来的三维视觉效果.
纹理映射;载入功能;三维效果
计算机图形学艺术的一个重要目的就是绘制接近真实的图形和场景.当前流行的两种热点技术分别是LOD技术和图像绘制技术[1].LOD技术符合人眼的视觉特点,即离视点近绘制较高细节,远则绘制较低细节;而图像的绘制技术是先建三维模型,然后再把图片映射到模型的表面上,最后利用光照模型,通过透视投影生成二维图像.本文即是使用后一种方法来实现的,先对三维圆柱面建模,然后贴图,添加光照、透视投影,形成三维的视觉效果.
自然界中的物体表面拥有各种各样的纹理细节,我们通过这些纹理的差别来区分相同形状的物体.在图形学中涉及的纹理有两种:其一是绘制物体面上有凹凸感的纹路所构成的图像,也叫沟纹;其二是形形色色的光滑的彩色图像,也叫花纹[2].比如:我们在球面上贴上地球表面贴图,希望陆地是凸起的,海平面是凹下去的,这种图案是不规则的,而这种凹凸感仅仅是我们的视觉感受.而对于花纹,在物体的外表面添加上以后依旧光滑,就像我们在花瓶的模型上添加花纹,我们看起来它平滑而且有磁器的质感.无论是凹凸感的沟纹和还是平滑的花纹,绘制添加在物体表面的方法是一样的,也就是生成方法一致,这就是为什么在图形学艺术中把二者统称纹理.所谓纹理映射即是在绘制好的物体线框图上添加的各种美丽的图案.
纹理一般分为颜色纹理、几何纹理及过程纹理.颜色纹理是指物体模型上添加的平滑的花纹或文字.几何纹理一般是针对物体模型上的微观几何形状的表面纹理,比如地球表面、混凝土墙面、石块等具有不平滑的凹凸表面.过程纹理是指由规则过渡到不规则的动态变化的自然景象,比如火、云、烟、雾、水波纹等.这里使用的是颜色纹理的映射[3].
(1)纹理映射的过程
三维计算机图像处理的核心部分主要包括几何数据输入、动画、坐标变换、视域裁剪、取景变换、绘制渲染、直到最后输出合成图像.
(2)纹理映射的实现方法
我们常用的颜色纹理和凹凸纹理在实现时可以用这样的方法:颜色纹理映射可以用两种方法来实现,方法一是不计算光照,而是直接用纹理来替代物体原先的颜色.方法二是纹理数据参加光照计算.因为高光的颜色取决于光源的颜色,它和物体模型本身材质的颜色没有关系.所以需将镜面反射光分离,通过设置材质漫反射系数kd完成纹理映射后,再将镜面反射光分量加上去.凹凸纹理(bump map)的基本思想是用简单光照模型计算物体表面的光强时,对物体表面的法向进行微小的扰动,导致表面光强的突变,产生凹凸不平的真实感效果.
几何模型在图形学艺术中有广泛的应用,而圆柱体就是其中之一.本文是在圆柱体的基础几何体上进行纹理添加,从而实现一个真实感图形的实际应用.利用 Phong 算法及圆柱面图像纹理映射旋转展示“清明上河图”的画轴.画轴纹理图如图1所示.
(1)Phong明暗处理步骤
首先计算多边形顶点的平均法矢量;第二步对多边形网格的每个顶点根据简单光照模型计算光强;根据每个多边形网格的顶点的光强,按照扫描线顺序使用线性插值计算多边形网格边上每一点的光强;在扫描线与多边形相交区间内,使用线性插值获得区间内每一点的光强.然后再将光强分解为该点的RGB颜色.
(2)纹理映射的设计
纹理映射的步骤:将屏幕坐标系中四个角点的像素点映射到物体坐标系中物体表面的可见部分;将物体坐标系对应到纹理坐标系;再对纹理坐标系下的四边形面片中的所有像素点做加权平均,最后的结果作为物体表面的漫反射系数参与颜色计算[4].如图2所示.
图2 纹理映射步骤
当物体表面是参数曲面时,给定参数与纹理坐标之间的关系,如图3所示.
(1)
(2)
(3)圆柱面映射过程
从平面图像坐标到柱面坐标的几何变换,就是根据平面图像上个点的坐标,求出对应圆柱表面上点的坐标,实现图像从平面到圆柱表面的映射.即以屏幕客户区中心自定义坐标系,并把它作为圆柱面模型的体心.然后读入二维位图图像纹理,利用点表将纹理绑定到圆柱表面.使用材质漫反射设置纹理颜色,广元颜色设置为白色.使用 Phong 明暗原理来绘制光照纹理圆柱面动画.如图4所示.
图3 曲面纹理映射图4 从平面到圆柱面的映射
3.1 观察视点的设置
视点即人的眼睛处于的方向,在这里的视点是指模拟的人眼在场景中的位置(也就是在用户坐标系中的位置) ,由于本程序是要实现画轴效果,所以视点应该高于水平线.在初始化构造函数中 R、Phi、Theta 控制视点在用户坐标系中的球坐标,d 来控制视距.将 R 设置为1000,d 设置为 800,Phi 的值设置为 80,Theta 的值置 0,即可设置视点位于水平线.
bPlay=FALSE;//初始设置不选择,点击 play 按钮后才开始旋转
R=1000.0,d=800.0,Phi=80.0,Theta=0.0;//视点视距
Near=200.0,Far=1200.0;//近剪切面与远剪切面
Alpha=0.0,Beta=0.0;//旋转角
3.2 自定义圆柱半径和高度
给点表函数 ReadVertex 设置两个参数 rr 和 hh, 即圆柱体的底面半径和圆柱体的高, 通过这两个参数设置圆柱体的底面和高度,在调用时,只需要给定这两个参数,然后由函数将这两个实参传递进去,从而实现圆柱体的初始化.
void CTestView::ReadVertex(double rr,double hh)//点表
{
double r=rr;//圆柱底面半径
h=hh;//圆柱的高
}
3.3 控制旋转频率的定时器设置
时间定时器可以控制圆柱体画轴的旋转速度, 点击 play 按钮后, 定时器 SetTimer()开始工作,间隔时间为 0 ms,再次单击运行,KillTimer()函数重新进入工作状态,销毁定时器 SetTimer().
void CTestView::OnPlay()
{
bPlay=bPlay?FALSE:TRUE;
if(bPlay)
SetTimer(1,0,NULL);
else
KillTimer(1);
}
图5 “清明上河图”画轴开始效果
3.4 每次旋转角度的设置
在旋转的时候旋转的时间间隔和选择角度会影响旋转的效果,选择一个合适的选择角度就比较重要,这里将旋转角度设置为 2,使旋转呈现一个缓慢渐进的效果.
void CTestView::OnTimer(UINT nIDEvent)//动画时间函数
{
Beta=2;
tran.RotateY(Beta);
Invalidate(FALSE);
CView::OnTimer(nIDEvent);
}[5]
(5)项目效果
模型初始化开始时的效果:
点击绘图图标后,画轴开始转动,效果如图6、7、8、9所示.
图6 旋转角度为72度的图像 图7 旋转角度为144度的图形
图8 选择角度为216度的图像 图9 旋转角度为288度的图像
本文是将Phong明暗算法和纹理映射方法应用于在圆柱面上映射一幅位图,并进行了光照计算.圆柱面侧面展开为长方形,获取需贴图案的展开尺寸后,则圆柱面模型表面上的像素点可以与贴图上的像素点一一对应.在案例中,运用点表进行图像纹理绑定.图像纹理映射的设计在程序运行的结果中可以通过实际的截图看出,主要实现的是载入纹理的功能,并且通过代码编写来控制三维立体图的形状、尺寸及纹理等.最后通过时间设置使三维图像最终在视觉上产生动态效果以及旋转起来的三维视觉效果.
[1]孔令德.计算机图形学基础教程[M].北京:清华大学出版社,2012.
[2]D.P.Mukherjee,Debasish Jana.Computer Graphics Algorithms and Implementations[M].北京:清华大学出版社,2012.
[3]韩希珍,赵建.结合偏微分方程增强图像纹理及对比度[J].光学精密工程,2012(6).
[4]姚嘉梁,胡军.人脸全景纹理图像拼接算法[J].计算机仿真,2011(2).
[5]孔令德.计算机图形学实践教程[M].北京:清华大学出版社,2013.
2016-10-02
李丽亚(1981-),女,山西阳城人,讲师,研究方向为图形图像.
TP311.1
A
2095-185X(2017)02-0043-04