球体Phong光照模型课程设计报告_第1页
球体Phong光照模型课程设计报告_第2页
球体Phong光照模型课程设计报告_第3页
球体Phong光照模型课程设计报告_第4页
球体Phong光照模型课程设计报告_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计球体Phong光照模型(1)掌握双线性法矢插值模型;(2)掌握ZBuffer算法的思想;(3)掌握有效边表填充算法;2、绘制体心和坐标系中心重合的球体表面,使用Z-Buffer消隐算法进行消隐。3、使用单点光源对球体进行照射生成Phong光照模型,光源其余部分划分为四边形面片,先对球体网格模型进行背面剔除,然后使用深度缓冲算法进行消隐。计算面片各顶点的平均法矢量,然后采用双线性法失插值计算面片内各点的法矢量。最终根据每点的法矢量对光源的朝向,通过简单光照模型计算所获得的光强。面片使用有效边表算法填Gouraud双线性光强插值模型解决了相邻多边形之间的颜色突变问题,产生的真实感图形颜色过渡均匀,图形显得非常光滑,这是它的强插值,其镜面反射光效果不太理想,而且相邻多边形边界处的马赫带效应并不能完全消除。Phong模型提出的双线性法矢插值模型可以有效的解决确的高光区域。Phong模型在进行光强插值的时候,需要先对面片的每一个顶点计算平均法矢量,然后通过双线性法矢插值计算面片内每个点的法矢量,最后根据简单(1)计算面片顶点的平均法矢量。在CZBuffer类先对面片每个点的法矢量进行双线性插值获得面片内每一点的法在CTestView类的构造函数内设置光源个数为1,位于右上方,材质颜色为红色。5、绘制球面函数Normal3数组存储三角形面片的顶点法矢量,定义了Normal4数组存储四边形面片的在程序设计中,使用Phong双线性法矢量插值模型时,计算每个面片的顶点坐标,同时计算每个面片的顶点法矢量。在CZBuffer类内定义了双线性法矢量插值函数Interpolation()计算面片内的每个点的法矢量。根据面片内每一点的法矢量调用CLighting类的成员函数Lighing()计算该点的光强。并在MyView构造函数中调用了透视变化初始化函数InitParameter();构造顶点表函数ReadPoint();构造面表函数ReadFace();在OnDraw()函数中使用双缓冲函数,并使用绘制球面函数DrawObject()函数,画出球体模型。设计使用的类如下:成员函数:Normalize()将颜色分量red、green、blue规范化到[0,(3)定义边节点类:CAET和定义桶节点类:CBucket设置当前扫描线与有效边的交点的横坐标x定义扫描线ScanLine来求图形与有效边表的交点voidSetSpecular(CRGB);设置光源的镜面反射光voidSetPosition(double,double,double);设置光源的直角坐标系voidSetGlobal(double,double,double);设置光源的球坐标voidSetCoef(double,double,double);设置光强的衰减voidGlobalToXYZ();球坐得的光照函数。在该函数中分五步来实现网格顶点的光亮度,第一,累加漫反射光voidCreateBucket();在函数中使用CBucket类创建桶节点voidPhong(CDC*pDC,CPi3ViewPointvoidInitDeepBuffer(int,int,double);初始化深度缓存(2)程序中使用的重要函数及部分代码:在函数中定义了片面夹角为gafa=gbeta=10;纬度区域为N1=180/gafa=18,经度区域N2=360/gbeta=36;利用数组P[(N1-1)*N2+2]设置的球体共有616个顶点,经纬网格的夹角为10°。P[i*N2+j+1].x=r*sin(gafal)*sP[i*N2+j+1].z=r*sin(gafal)*c}计算南极点坐标(2)、构造面片表函数ReadFace()面片用二维数组表示,第一维按维度自北极向南极增加的方向定义,第二维在同一纬度带上z轴正向开始,按逆时针方向定义。球体共有N1*N2个面,北极和南极各有N2个面,其余部分有(N1-2)*N2个面片。具体实现代码和算法见源程序。构造北极三角形面片代码:for(intj=0;j<N2;j++){NorthIndex[0]=0;Northlndex[1]=j+1;NorthIndex[2]=tempj+1;for(intk=0;k<F[0][j].En;k++){F[0][j].p[k]=NorthIF[0][j].SetNormal(P[NorthIndex[0]],P[NorthIndex[1]],P[Nort构造球体四边形面片代码:{for(intj=0;j<N2;j++){BodyIndex[1]=(tempi-BodyIndex[2]=(tempi-1)*NBodyIndex[3]=(i-1)*Nfor(intk=0;k<F[i][j].En;k+{}F[i][j].SetNormal(P[BodyIndex[0]],P[BodyIndex[1]],P[BodyIn使用Z-Buffer算法对球面进行深度消隐,然后使用有效边表算法进行填充,为减少渲染的面片数,先使用凸多面体消隐算法对球体不可见面片进行剔除。然后使用Z-Buffer算法对可见面进行消隐,最后使用有效边表算法进行填充。在函数中,使用Phong双线性法矢量插值模型,计算每个面片上的矢法量。定义了Normal3数组存储三角形面片的顶点法矢量,定义了Norma14数组存储四边形面片的顶点法矢量。(4)、使用键盘方向键OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)消息响应窗口函数,代码如下:caseVKUP:使用Phi每次自减5,按向上键使球体向里旋转caseVK_DOWN:使用Phi每次自加5,按向下键使球体向外旋转每次自加5,按向左键使球体向左旋转caseVK_RIGHT:使用Theta每次自减5,按向左键使球体向右旋转Theta=Theta-5;bdefault:break;}(5)、使用鼠标左右点击窗口响应函数,对球体进行放大和缩小voidCMyView::OnLButtonDblClk(UINTnFlags,CPointpoint){R=R+30;在鼠标左击函数中视点半径每次增加30,使球体缩小CView::OnLButtonDb1CvoidCMyView::OnRButtonDb1Clk(UINTnFlags,CPointpoint){R=R-30;在鼠标右击函数中视点半径每次减少30,使球体增大CView::OnRButtonDblC(1)当球体半径r=150,面片夹角=10,纬度区间N1=18,经度区间N2=36时,回回(2)使用键盘方向向左旋转球体,Theta=Theta+10所示结果如图

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论