版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1/1第九章使用MFC实现真实感图形绘制-自然科学
第九章使用MFC实现真实感图形绘制
真实感图形绘制是计算机图形学的一个重要组成部分。它综合利用数学、物理学、计算机科学和其他学科学问在计算机图形设备上生成象彩色照片那样的真实感图形。要用计算机图形设备绘制场景的真实感图形,就必需首先在计算机中建立该场景的模型,用这个模型来反映场景的特点和属性。这一模型通常是由一批几何数据及数据之间的拓扑关系来表示的,这就是造型技术,它是真实感图形绘制技术的重要组成部分。有了三维场景的模型,并给定了观看点和观看方向以后,就可以通过几何变换和投影变换在屏幕上显示该三维场景的二维图像。为了使二维图像具有立体感,并尽可能逼真地显示出该物体在现实世界中被观看到的形象,就需要运用适当的光照模型,来模拟场景在现实世界中受到各种光源照耀时的效果,这就是真实感图形的画面绘制技术,也就是真实感图形的生成技术。
用计算机在图形设备上生成连续色调的真实感图形大致可以分为以下四步:第一步,用数学方法建立所需三维场景的几何描述,并将它们输入至计算机。这部分工作可由三维立体造型或曲面造型系统来完成。场景的几何描述直接影响了图形的简单性和图形绘制的计算耗费,因此选择合理的、有效的数据表示和输入手段是特别重要的。
其次步,将三维几何描述转换为二维投影图。这可以通过对场景的投影变换来完成。
第三步,确定场景中的全部可见面,这需要使用隐蔽面消退算法将被其他物体遮挡的不行见面消去。
第四步,计算场景中可见面的颜色,严格地说,就是依据基于光学物理的光照明模型计算可见面投射到观看者眼中的光亮度大小和颜色重量,并将它转换成适合图形设备的颜色值,从而确定投影画面上每一象素的颜色,最终生成图形。
前三步的相关学问在前面已经进行了介绍,本章将重点介绍如何通过MFC编程的方式,利用光照模型计算场景中可见面的光亮度和颜色,并绘制最终的真实感图形。实际上,现在OpenGL和DirectX等图形函数库供应了许多支持真实感图形绘制的函数,使用它们可以更轻松的完成真实感图形绘制。本章仍采纳最基本的MFC编程方式来实现真实感图形绘制,是为了让读者可以更好的体会和理解真实感图形绘制中用到的光照模型等相关学问的原理。
9.1演示程序使用的场景造型
场景造型又叫几何造型,它是在计算机中建立的用于描述现实场景的几何模型,它是真实感图形生成的一个重要部分。在真实感图形中,一个景物的场景造型体现了该景物的几何特征和景物属性。场景造型的简单程度直接打算了最终绘制的真实感图形的效果。
本章的重点在于光照模型的实现,所以本章中的演示程序没有创建简单场景,只使用了一种景物——球体。演示程序依据球体的函数方程,计算球体表面的参数点坐标,然后按这些参数点对球体表面作三角剖分,最终利用光照模型对剖分得到的三角面片计算光照并进行绘制。
9.1.1球体造型
球体表面的函数方程式如下:
x?x0?rcosucoswy?y0?rcosucoswz?z0?rsinuu?[??2,]?2]w?[0,?2
其中,坐标(x0,y0,z0)为球心坐标,而坐标(x,y,z)为球面上的参数点坐标,r为半径,u、w分别为纬度和经度参数变量。
我们创建一个MFC项目RealityDemo,该应用程序作为本章中的演示程序。在该应用程序中添加一个类CObject3D,其基类为CObject。该类的实例对应场景中的一个景物。为了定义景物,需要定义如下结构体:
//三维空间中点structPoint3D{doublex;doubley;doublez;};
//三角面
structTriSurface{
intno;//所属景物序号
Point3Dp1,p2,p3;//三角面的顶点doublexn,yn,zn;//三角面的法向量};
//景物光照参数structParam{
doublekrd;//景物表面红色光漫反射率doublekgd;//景物表面绿色光漫反射率doublekbd;//景物表面蓝色光漫反射率doublekra;//景物表面红色光泛光反射率doublekga;//景物表面绿色光泛光反射率doublekba;//景物表面蓝色光泛光反射率doublekrs;//景物表面红色光镜面反射率doublekgs;//景物表面绿色光镜面反射率doublekbs;//景物表面蓝光镜面反射率intn;//景物表面镜面高光指数};
Point3D定义了三维空间中的一点。而TriSurface则定义了一个三角面片。结构体Param中的各成员变量指定了景物的光照参数,其详细含义将会在介绍光照模型时说明。
我们在CObject3D类中添加如下的成员变量和成员函数:
public:
//球体表面三角剖分后得到的三角面列表CArraym_SurfaceList;Paramm_Param;//球体表面光照参数
Point3Dp3d[101][101];//球体表面参数点数组
intcountx,county;//生成的参数点在经度和纬度上的数量doublebx,by,bz;//圆心坐标public:
//创建指定球心和半径的球体
voidCreateBall(doublex0,doubley0,doublez0,doubler);voidSetSurfaceList;//对球体表面进行三角剖分
voidSetFVector(TriSurface*surface);//设置三角面的法向量voidSetParam(Paramparam);//设置球体表面光照参数9.1.2生成球体表面参数点
成员函数CreateBall用于生成球体表面的参数点,并按这些参数点对球体表面进行三角剖分,将剖分生成的三角面片存入到列表m_SurfaceList中,其中三角剖分由成员函数SetSurfaceList完成。CreateBall函数的实现代码如下:
//创建一个球体
voidCObject3D::CreateBall(doublex0,doubley0,doublez0,doubler){
inti=0,j;
doublepi=3.1415926;bx=x0;by=y0;bz=z0;
for(doubleu=-pi/2;ucountx=i;county=j;
SetSurfaceList;}
其中u和v的步长打算了产生的球体表面的参数点的数量。countx和county需要在类的构造函数中设置初始值为0。程序中将生成的球体表面参数点存入到p3d数组中,这样做是为了便利对球体表面进行三角剖分。
9.1.3球体表面三角剖分
对球体表面进行三角剖分采纳如下方法。设球体表面上一个参数点为P[i][j],则其经度上的下一个参数点为p[i+1][j],而纬度上的下一个参数点为p[i][j+1],再加上该点在对角线方向上的下一个参数点p[i+1][j+1],这四个点构成的区域可以剖分成两个三角面片。第一个三角面片的顶点为p[i][j],p[i+1][j],p[i+1][j+1],其次个三角面片的顶点为p[i][j],p[i][j+1],p[i+1][j+1]。在生成三角面片的同时需要计算该三角面片的法向量,由于在计算光照的时候需要用到此法向量。平面上两个向量的叉乘积即为平面的法向量,其方向性满意右手定则,计算的时候需要留意法向量的方向应当是指向球外的。执行三角剖分的函数SetSurfaceList和计算法向量的函数SetFVector实现代码如下:
//球体表面进行三角剖分
voidCObject3D::SetSurfaceList{
for(inti=0;ip2.x-surface->p1.x;yu=surface->p2.y-surface->p1.y;zu=surface->p2.z-surface->p1.z;xv=surface->p3.x-surface->p1.x;yv=surface->p3.y-surface->p1.y;zv=surface->p3.z-surface->p1.z;
d=sqrt((yu*zv-yv*zu)*(yu*zv-yv*zu)+
(zu*xv-zv*xu)*(zu*xv-zv*xu)+(xu*yv-xv*yu)*(xu*yv-xv*yu));surface->xn=(yu*zv-yv*zu)/d;surface->yn=(zu*xv-zv*xu)/d;surface->zn=(xu*yv-xv*yu)/d;}
在计算三角面片的法向量时计算的是单位法向量。在CObject3D类中还有一个函数SetParam用于设置景物的光照参数,其实现特别简洁,代码如下:
//设置光照参数
voidCObject3D::SetParam(Paramparam){
m_Param.kra=param.kra;m_Param.kga=param.kga;m_Param.kba=param.kba;m_Param.krd=param.krd;m_Param.kgd=param.kgd;m_Param.kbd=param.kbd;m_Param.krs=param.krs;m_Param.kgs=param.kgs;m_Param.kbs=param.kbs;m_Param.n=param.n;}
我们创建景物时,首先需要实例化CObject3D对象,然后调用CreateBall函数创建球体景物,其实质是生成该球体的三角剖分面片列表,然后设置该球体的光照参数。此时就可以使用光照模型来计算球体表面的光照并进行绘制了。同样的,我们也可以创建其它外形的景物,其过程大体如下:获得景物表面的参数点,然后进行三角剖分,计算三角面片的法向量,最终设置景物的光照参数。
9.2局部光照模型
为了模拟光源照耀在景物表面所产生的光照效果,就需要用到光照模型,光照模型是生成真实感图形的基础。光照模型是依据光学物理的有关定律,计算景物表面上任一点投向观看者眼中的光亮度的大小和颜色组成的公式。光照模型分为局部光照模型和整体光照模型。
局部光照模型仅考虑光源直接照耀在景物表面所产生的光照效果,景物表面通常被假定为不透亮 ,且具有匀称的反射率。局部光照模型能表现由光源直接照耀在漫射表面上形成的连续明暗色调、镜面上的高光以及由于景物相互遮挡而形成的阴影等,具有肯定的真实感效果。而整体光照模型除了考虑上述因素外,还要考虑四周环境对景物表面的影响,如消失在镜面上的其他景物的印象,通过透亮 面可观看到后面的景物等。本节我们将实现的是局部光照模型。9.2.1局部光照模型概述
从光源发出的光照耀到景物表面时,会消失以下四种情形:(1)经景物表面对外反射形成反射光;
(2)若景物透亮 ,则入射光会穿透该景物,从而产生透射光;(3)若景物透亮 ,入射光在穿透景物时会产生散射光;(4)部分入射光将被景物汲取而转换成热。
明显,刺激人眼产生视觉效果的主要是反射光和透射光,如图9.1所示。
物体表面的反射光和透射光的光谱分布打算了景物表面呈现的颜色,反射光和透射光的强弱则打算了景物表面的明暗程度。明显,反射光和透射光打算于入射光的强弱、光谱组成以及景物表面对入射光中不同波长光的汲取程度。例如,当一束白光照耀在一个汲取除红光以外全部不同波长光的不透亮 景物表面上时,景物呈红色。但若用一束绿光或蓝光照耀该景物,则它将呈黑色。
若已知入射光在每一波长上的强弱和物体表面在各波长上对光的汲取率,即给出入射光的光谱分布以及物体表面的反射率和透射率的光谱分布,我们就能依据环境的光源布置和景物表面的材料属性正确计算出景物表面反射光和透射光的光强和颜色。物体表面的反射光可分为漫反射光和镜面反射光。漫反射光可以认为是光穿过物体表面层被部分汲取后,重新放射出来的光。因此,漫反射光匀称地散布在各个方向,观看者不论站在哪一方位上,他所观看到的漫射光的强度均相等。镜面反射光则是物体的外表面对入射光的直接反射。镜面反射光亮度沿镜面反射主方向最强,在该主方向四周则渐渐衰减,形成肯定的空间分布,因而,观看者只有位于肯定方向上,才能看到光明的镜面反射光。以上就是构成局部光照模型的基本思想。依据这个思想,可以得到基本的光照模型。局部光照模型通常假定光源为点光源,物体为非透亮 体。因此,透射光和散射光可忽视不记。计算光照时只需计算反射光。
常用的局部模型有Lamber漫反射光照模型和Phong局部光照模型。9.2.2Lambert漫反射光照模型概述
自然界的绝大多数景物为抱负漫反射体,Lambert余弦定律总结了一个抱负漫反射物体在点光源照耀下的反射规律,这就是Lambert漫反射模型。依据Lambert定律,一个抱负漫反射物体表面上反射出来的漫反射光的强度同入射光与物体表面法向量之间的余弦成正比,即:
I?kdIlcosθ
其中,I为景物表面在被照耀点P处的漫反射光的光亮度,Il为点光源所发出的入射光亮度,kd为景物表面的漫反射率,?为入射光与表面法向量之间的夹角,如图9.2所示。
若景物表面在被照耀点P处的单位法向量为N,P到点光源的单位向量为L,则上式可表达为如下的向量形式:
I?kdIl(N?L)
明显,当点光源离被照耀表面很远时,上式中的向量L变化很小,因而可将L看作为一常向量。我们称此时的点光源为方向光,它由一向量完全确定。可知,当入射角?大于?时,光源位于物体背面,因而该光源对被照耀点的光亮度贡
2献为零,而当入射角?为零度时,光源垂直照耀在景物表面上,此时反射光的强度最大。由不同材料构成的景物表面具有不同的漫反射率,漫反射率的大小标志了景物表面对四周反射光线的力量的大小。在入射光强度相同的状况下,漫反射率越大的景物,看上去越亮。
在实际场景中,物体不仅接收光源发出的光,还会接收到从四周环境投射来的光,如房间的墙壁、天空等。在图形学中,称这部分光为环境光或泛光。环境光是一种分布光源,精确模拟它特别耗时。在局部光照模型中,常假定环境反射光是匀称入射的漫反射光,并用一常数来表示其强度。这样,Lambert漫反射光照模型可写成:
I?kaIa?kdIl(N?L)
其中,Ia为入射的泛光光强,ka为景物表面对泛光的漫反射系数。在上面的公式里没有反映出光的距离衰减效应。光的传播以距离平方衰减,即某处入射光的强度与该点和光源间的距离平方成反比。为了模拟光的距离衰减效应,可以采纳线形衰减模型:
I?kaIa?kdIld?k(N?L)
其中,d为光源到景物的距离,k为一任意常数。
通常可采纳以下的Lambert漫反射模型来模拟光的各种距离衰减效果:
I?kaIa?fkd(N?L)
??1?f?max,1??c?cd?cd2?23?1?其中,f为光源强度衰减因子,c1、c2和c3为用户确定的常数。上述模型可以推广到多光源情形,只需将这些点光源对景物表面的光亮度贡
献逐个累加起来。此时,Lambert漫反射模型为:
MI?kaIa?kd?i?1fiIli(N?Li)
其中,fi,Ili,Li分别为第i个光源强度衰减因子、光强和单位入射方向的向量。
9.2.3Lambert漫反射光照模型的实现
在应用程序项目中添加一个新类CReality,我们在该类中实现光照模型。为了定义光源的相关属性,需要定义如下结构:
//光源参数
structLightParam{
doublem_distance;//光源距离doublec1;//距离衰减系数c1doublec2;//距离衰减系数c2doublec3;//距离衰减系数c3
doubleirl;//入射光红颜色重量强度doubleigl;//入射光绿颜色重量强度doubleibl;//入射光蓝颜色重量强度doublexn,yn,zn;//入射单位方向向量doublef;//距离衰减};
该结构中的各个成员变量打算了光源的相关属性。
为了实现Lambert漫反射模型,需要在CReality类中添加如下的成员变量和成员函数:
public:
CArraym_SurfaceList;//景物表面三角面列表CArraym_ParamList;//景物表面参数列表CArraym_LightList;//光源参数列表doublelxn,lyn,lzn;//视点向量intm_count;//景物数量
doubleira;//泛光中红色光重量的强度doubleiga;//泛光中绿色光重量的强度doubleiba;//泛光中蓝色光重量的强度public:
voidAddObject3D(CObject3D*pObject);//添加景物voidAddLight(LightParamlightParam);//添加光源//设置泛光强度
voidSetIA(doubler,doubleg,doubleb);//计算传入两个向量夹角余弦值
doubleGetVectorPM(doublexn1,doubleyn1,doublezn1,doublexn2,doubleyn2,doublezn2);
//计算投影点
CPointProjection(Point3Dpoint3d);//Lambert漫反射光照模型实现函数voidLambert(CDC*pDC);
voidClear;//清除当前景物和光源
成员变量和成员函数的含义可以看相应的解释。下面分别介绍每个成员函数的实现。
函数AddObject3D用于添加要计算光照的景物,其实现代码如下:voidCReality::AddObject3D(CObject3D*pObject){
m_count++;
for(inti=0;im_SurfaceList.GetSize;i++){TriSurfacesurface=(TriSurface)pObject->m_SurfaceList.GetAt(i);//背向视点方向的面不行见if(GetVectorPM(surface.xn,surface.yn,surface.zn,lxn,lyn,lzn)>=0){surface.no=m_count;//设置当前面对应的光照参数m_SurfaceList.Add(surface);}}
//设置景物参数
m_ParamList.Add(pObject->m_Param);}
实现代码中需要说明的是,对于景物表面进行三角剖分得到的三角面片来说,假如该面片的单位法向量与视线的单位方向向量的夹角余弦值小于0,表示该面片背向于观看者,所以不用计算其光照。
函数AddLight用于添加光源,其实现代码如下:voidCReality::AddLight(LightParamlightParam){
//计算距离衰减
doublef=1.0/(lightParam.c1+lightParam.c2*lightParam.m_distance+lightParam.c3*lightParam.m_distance*lightParam.m_distance);
if(f1)f=1.0;lightParam.f=f;
//添加到光源列表中
m_LightList.Add(lightParam);}
在添加光源的同时,将光源的距离衰减值计算了出来。
函数SetIA用于设置泛光强度,其三个参数代表了泛光中三个颜色重量的强度,其实现代码如下:
voidCReality::SetIA(doubler,doubleg,d
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二四年度无形资产买卖未过户协议
- 钢琴服务合同范本
- 2024年度旅游度假产品代理销售合同
- 二零二四年度智能停车场解决方案合同
- 个人债权债务转让协议范文
- 音响订立合同范本
- 2024年度医疗美容服务机构合作经营合同
- 2024年度仓储物流合作合同:存货质押借款条款
- 决算审核合同范本
- 2024年度国际煤炭交易代理与合作合同
- 《设备润滑与管理》课件
- 2024光伏发电并网服务合同
- 2024-2030年中国畜禽宰杀行业市场运营模式及未来发展动向预测报告
- 初中德育工作总结:活动与创新
- 诚实课件教学课件
- 广东省深圳市龙岗区多校2024-2025学年一年级(上)期中语文试卷(含答案部分解析)
- 2024-2025学年度第一学期期中学业质量监测
- 2024至2030年中国轻质墙板数据监测研究报告
- 乡村振兴课件教学课件
- 中医药适宜技术推广实施方案(3篇)
- 人教版三年级上册《生命-生态-安全》全册教案(及计划)
评论
0/150
提交评论