MFC图形学课程设计--彩色线框球_第1页
MFC图形学课程设计--彩色线框球_第2页
MFC图形学课程设计--彩色线框球_第3页
MFC图形学课程设计--彩色线框球_第4页
MFC图形学课程设计--彩色线框球_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、计算机图形学课程设计彩色线框球目录1.项目描述21.1 任务综述21.2 效果图22.原理分析33.算法设计53.1 球表面坐标计算53.2 保存球表面面片以及面片属性54.源代码清单65.项目总结115.1 存在问题115.2 项目改进115.3 总结111、项目描述1.1 项目综述真实感图形绘制是计算机图形学的一个重要组成部分。它综合利用数学、物理学、计算机科学和其他学科知识在计算机图像设备上生成像彩色照片那样的真实感图形。要用计算机图形设备绘制场景的真实感图形,就必须首先在计算机中建立该场景的模型,用这个模型来反映场景的特点和属性。有了三维场景的模型,并给定了观察点和观察方向以后,就可以

2、通过几何变换和投影变换在屏幕上显示该三维场景的二维图像。为了使二维图像具有立体感,并尽可能逼真地显示出该物体在现实世界中被观察到的形象,就需要运用适当的光照模型,来模拟场景在现实世界中受到的各种光源照射时的效果,这就是真实感图形的画面绘制技术,也就是真实感图形的生成技术。1.2 效果图2、原理分析用计算机在图形设备上生成连续色调的真实感图形大致可以分为以下四步:第一步,用数学方法建立所需三维场景的几何描述,并将它们输入至计算机。第二步,讲三维几何描述转换为二维投影图。这可以通过对场景的投影变换来完成。第三步,确定场景中的所有可见面,这需要使用消隐算法将被其他物体遮挡的不可见部分消去。第四步,计

3、算场景中可见面的颜色,严格地说,就是根据基于光学物理的光照明模型计算可见面投射到观察者眼中的光亮度大小和色彩分量,并将它转换成适合图形设备的颜色值,从而确定投影画面上每一像素的颜色,最终生成图形。球体表面的函数方程式如下:其中,坐标(x0,y0,z0)为球心坐标,而坐标(x,y,z)为球面上的参数点坐标,r 为半径,u、w 分别为经度和纬度参数变量。光照效果:为了模拟光源照射在景物表面所产生的光照效果,就需要用到光照模型,光照模型是生成真实感图形的基础。光照模型是根据光学物理的有关定律,计算景物表面上任一点投向观察者眼中的光亮度的大小和色彩组成的公式。从光源发出的光照射到景物表面时,会出现以下

4、四种情形:(1)经景物表面向外反射形成反射光;(2)若景物透明,则入射光会穿透该景物,从而产生透射光; (3)若景物透明,入射光在穿透景物时会产生散射光;(4)部分入射光将被景物吸收而转换成热。物体表面的反射光和透射光的光谱分布决定了景物表面呈现的 颜色,反射光和透射光的强弱则决定了景物表面的明暗程度。显然, 反射光和透射光决定于入射光的强弱、光谱组成以及景物表面对入 射光中不同波长光的吸收程度。例如,当一束白光照射在一个吸收 除红光以外所有不同波长光的不透明景物表面上时,景物呈红色。 但若用一束绿光或蓝光照射该景物,则它将呈黑色。物体表面的反射光可分为漫反射光和镜面反射光。漫反射光可以认为是

5、光穿过物体表面层被部分吸收后,重新发射出来的光。因此,漫反射光均匀地散布在各个方向,观察者不论站在哪一方位上,他所观察到的漫反射光的强度均相等。3、算法设计3.1 球表面坐标计算获得球体的中心坐标(x,y,z)和半径 r 后,然后设置经纬线步长,步长的大小决定了将球体分割成面片的数量,即决定了绘制后球体的表面光滑度。根据公式得知, 利用 u 和 w 进行循环,然后用一个数组可以保存这个球体表面的每一个坐标,即此公式中的 x,y,z。这个方法定义为 CreateBoll()。3.2 保存球表面面片以及面片属性为了绘制球体,我们这里选择三角面片剖分进行绘制。在这里我们要设置每一个面片的三个顶点的坐

6、标、面片的法向量、面片的光反射属性。对球体表面进行三角剖分可以采用如下方法:设球体表面上一个参数点为 Pij,则其经度上的下一个参数点为 Pi+1 j,而纬度上的下一个参数点为 Pij+1,再加上该点在对角线方向上的下一个参数点 Pi+1j+1,这四个点构成的区域可以剖分成两个三角面片。第一个三角面片的顶点为 Pij,Pi+1j, Pi+1j+1,第二个三角面片的顶点为 Pij,Pij+1,Pi+1 j+1。三角面片的法向量可以通过三个顶点确定的两个向量的叉积进行计算。确定了每一个三角面片的属性后,为了在后面的程序中调用面片绘制,在这里我们利用 CPtrArray 类来动态保存面片。4、源代码

7、清单CTestView:CTestView() / TODO: add construction code here x = 0; y = 0; z = 0; r = 200; rd = 255; gd = 0; bd = 0; ViewPoint = CP3(0,0,-6);CTestView:CTestView()BOOL CTestView:PreCreateWindow(CREATESTRUCT& cs) / TODO: Modify the Window class or styles here by modifying /the CREATESTRUCT cs return CVi

8、ew:PreCreateWindow(cs);void CTestView:OnMdraw() / TODO: Add your command handler code here rd = 255; gd = 0; bd = 0; CreateBoll(); DoubleBuffer(); m_FaceArr.RemoveAll();/计算球表面坐标void CTestView:CreateBoll() int i = 0,j; double step = 5; double angle = step * PI/180; cx = ROUND(180/step) + 1; cy = ROUN

9、D(360/step); for (double u = -PI/2; u PI/2 + angle ; u = u + angle) j = 0; for (double v = 0; v P2.x - F-P1.x; yu = F-P2.y - F-P1.y; zu = F-P2.z - F-P1.z; xv = F-P3.x - F-P1.x; yv = F-P3.y - F-P1.y; zv = F-P3.z - F-P1.z;(zu * xv - zv * xu) * (zu * xv - zv * xu) + d = sqrt(yu * zv - yv * zu) * (yu *

10、zv - yv * zu) +(xu * yv - xv * yu) * (xu * yv - xv * yu); F-fv.x = (yu * zv - yv * zu)/d; F-fv.y = (zu * xv - zv * xu)/d; F-fv.z = (xu * yv - xv * yu)/d;/设置球表面属性void CTestView:SetFace() for (int i = 0; i cx - 1; i+) for (int j = 0; j SetViewportExt(rect.Width(),-rect.Height();/xy 轴垂直向上原点CDC MemDC;/内

11、存DCCBitmap NewBitmap,*pOldBitmap;/内存中承载图像的临时位图MemDC.CreateCompatibleDC(pDC);/建立与屏幕pDC兼容的 pDC-SetViewportOrg(rect.Width()/2,rect.Height()/2);/屏幕中心为MemDC NewBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Heigh t();/创建兼容位图 pOldBitmap=MemDC.SelectObject(&NewBitmap);/将兼容位图选入 MemDC MemDC.FillSolidRec

12、t(rect,pDC-GetBkColor();/按原来背景填充客户区,否则是黑色MemDC.SetMapMode(MM_ANISOTROPIC);/MemDC 自定义坐标系 MemDC.SetWindowExt(rect.Width(),rect.Height(); MemDC.SetViewportExt(rect.Width(),-rect.Height(); MemDC.SetViewportOrg(rect.Width()/2,rect.Height()/2); DrawObject(&MemDC); pDC-BitBlt(-rect.Width()/2,-rect.Height()

13、/2,rect.Width(),rect.Height(),&MemDC,-rect.Width()/2,- rect.Height()/2,SRCCOPY);/将内存位图拷贝到屏幕 MemDC.SelectObject(pOldBitmap);/恢复位图ReleaseDC(pDC);/释放/返回两个向量的夹角的余弦double CTestView:GetVectorAngle(CP3 v1,CP3 v2) double cosnl; cosnl = (v1.x + v2.x + v1.y * v2.y + v1.z * v2.z)/ (sqrt(v1.x * v1.x + v1.y * v1

14、.y + v1.z * v1.z) * sqrt(v2.x * v2.x + v2.y * v2.y + v2.z * v2.z); return cosnl;/计算斜投影CPoint CTestView:Projection(CP3 P) CP2 ScreenP; /ScreenP.x = P.x - P.z/sqrt(2); /ScreenP.y = P.y - P.z/sqrt(2); /ScreenP.x = P.x; /ScreenP.y = P.y; ScreenP.x = P.x + P.z * 0.3; ScreenP.y = P.y; return CPoint(ROUND(

15、ScreenP.x),ROUND(ScreenP.y);void CTestView:DrawObject(CDC *pDC) for (int i = 0;i =0) CFace face = (CFaceAr*)m_FaceArr.GetAt(i)-m_face; DrawFace(pDC,face); /Invalidate(FALSE);void CTestView:DrawFace(CDC *pDC,CFace face)/* if (rd = 0) rd += 1;/else rd -= 1; if (gd = 0) gd += 1;/else gd -= 1; if (bd =

16、255) rd -= 1;/else rd += 1; if (gd = 255) gd -= 1;/else gd += 1; if (bd = 255) bd -= 1;/else bd += 1;*/rd -= 0.097;gd += 0.097;bd += 0.097;/绘制三角面/CBrush brush(RGB(int)rd,(int)gd,(int)bd); CPen pen(PS_SOLID,1,RGB(int)rd,(int)gd,(int)bd);pDC-SelectObject(&pen); /pDC-SelectObject(&brush);CPoint P3; /*P

17、0 = Projection(face.P1);/ CPoint(face.P1.x,face.P1.y); P1 = Projection(face.P2);/ CPoint(face.P2.x,face.P2.y); P2 = Projection(face.P3);/ CPoint(face.P3.x,face.P3.y);*/P0 = Projection(face.P1);/ CPoint(face.P1.x,face.P1.y);P1 = Projection(face.P2);/ CPoint(face.P2.x,face.P2.y);P2 = Projection(face.P3);/ CPoint(face.P3.x,face.P3.y);pDC-MoveTo(P0.x,P0.y);pDC-LineTo(P1.x,P1.y);pDC-LineTo(P2.x,P2.y);pDC-Polygon(P,3);t();5、项目总结5.1 存在问题现在的程序还存在以下问题:(1)当对窗口进行大小或者其他变动,图像会消失,没有重画。(2)目前视矢量是通过手动初始化,如果出现计算错误,就会导致球体绘制错误。5.2 项目改进1、增加 Phong 光照模型,增加镜面反射,使球体更加逼近真实感图形。2、增加球体旋转方法,使绘制出来的球可以自转。3、以上问题因时间问题未能解决与改

温馨提示

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

评论

0/150

提交评论