第九章使用MFC实现真实感图形绘制

上传人:m**** 文档编号:561936620 上传时间:2022-11-02 格式:DOC 页数:55 大小:1.26MB
返回 下载 相关 举报
第九章使用MFC实现真实感图形绘制_第1页
第1页 / 共55页
第九章使用MFC实现真实感图形绘制_第2页
第2页 / 共55页
第九章使用MFC实现真实感图形绘制_第3页
第3页 / 共55页
第九章使用MFC实现真实感图形绘制_第4页
第4页 / 共55页
第九章使用MFC实现真实感图形绘制_第5页
第5页 / 共55页
点击查看更多>>
资源描述

《第九章使用MFC实现真实感图形绘制》由会员分享,可在线阅读,更多相关《第九章使用MFC实现真实感图形绘制(55页珍藏版)》请在金锄头文库上搜索。

1、第九章 使用 MFC 实现真实感图形绘制真实感图形绘制是计算机图形学的一个重要组成部分。 它综合利用数学、 物 理学、计算机科学和其他学科知识在计算机图形设备上生成象彩色照片那样的真 实感图形。 要用计算机图形设备绘制场景的真实感图形, 就必须首先在计算机中 建立该场景的模型, 用这个模型来反映场景的特点和属性。 这一模型通常是由一 批几何数据及数据之间的拓扑关系来表示的, 这就是造型技术, 它是真实感图形 绘制技术的重要组成部分。 有了三维场景的模型, 并给定了观察点和观察方向以 后,就可以通过几何变换和投影变换在屏幕上显示该三维场景的二维图像。 为了 使二维图像具有立体感, 并尽可能逼真地

2、显示出该物体在现实世界中被观察到的 形象,就需要运用适当的光照模型, 来模拟场景在现实世界中受到各种光源照射 时的效果,这就是真实感图形的画面绘制技术,也就是真实感图形的生成技术。用计算机在图形设备上生成连续色调的真实感图形大致可以分为以下四步: 第一步,用数学方法建立所需三维场景的几何描述, 并将它们输入至计算机。 这部分工作可由三维立体造型或曲面造型系统来完成。 场景的几何描述直接影响 了图形的复杂性和图形绘制的计算耗费, 因此选择合理的、 有效的数据表示和输 入手段是非常重要的。第二步,将三维几何描述转换为二维投影图。 这可以通过对场景的投影变换第三步,确定场景中的所有可见面, 这需要使

3、用隐藏面消除算法将被其他物 体遮挡的不可见面消去。第四步,计算场景中可见面的颜色, 严格地说, 就是根据基于光学物理的光 照明模型计算可见面投射到观察者眼中的光亮度大小和色彩分量, 并将它转换成 适合图形设备的颜色值,从而确定投影画面上每一象素的颜色,最终生成图形。前三步的相关知识在前面已经进行了介绍,本章将重点介绍如何通过 MFC 编程的方式, 利用光照模型计算场景中可见面的光亮度和颜色, 并绘制最终的真 实感图形。实际上,现在 OpenGL和DirectX等图形函数库提供了很多支持真实 感图形绘制的函数, 使用它们可以更轻松的完成真实感图形绘制。 本章仍采用最 基本的MFC编程方式来实现真

4、实感图形绘制,是为了让读者可以更好的体会和 理解真实感图形绘制中用到的光照模型等相关知识的原理。9.1 演示程序使用的场景造型场景造型又叫几何造型, 它是在计算机中建立的用于描述现实场景的几何模 型,它是真实感图形生成的一个重要部分。 在真实感图形中, 一个景物的场景造 型体现了该景物的几何特征和景物属性。 场景造型的复杂程度直接决定了最终绘 制的真实感图形的效果。本章的重点在于光照模型的实现,所以本章中的演示程序没有创建复杂场 景,只使用了一种景物球体。 演示程序根据球体的函数方程, 计算球体表面 的参数点坐标, 然后按这些参数点对球体表面作三角剖分, 最后利用光照模型对 剖分得到的三角面片

5、计算光照并进行绘制。9.1.1 球体造型x0r cos u cos wji jiu ,2 2jiw 0, 一2球体表面的函数方程式如下:y = y 0 r cos u cos wz = z0r sin u其中,坐标(x0, y0, z0 )为球心坐标,而坐标(x, y, z)为球面上的参数点坐 标,r为半径,u、w分别为纬度和经度参数变量。我们创建一个MFC项目RealityDemo,该应用程序作为本章中的演示程序。 在该应用程序中添加一个类 CObject3D,其基类为CObject。该类的实例对应场景 中的一个景物。为了定义景物,需要定义如下结构体:/三维空间中点struct Poi nt

6、3Ddouble x;double y;double z;;/三角面struct TriSurfaceint no;/所属景物序号Poi nt3D p1,p2,p3;三角面的顶点 double xn,yn ,z n;三角面的法向量;/景物光照参数struct Paramdouble krd;景物表面红色光漫反射率double kgd;景物表面绿色光漫反射率double kbd;景物表面蓝色光漫反射率double kra;景物表面红色光泛光反射率double kga;景物表面绿色光泛光反射率double kba;景物表面蓝色光泛光反射率double krs;景物表面红色光镜面反射率double

7、kgs;/景物表面绿色光镜面反射率double kbs;/景物表面蓝光镜面反射率int n;/景物表面镜面高光指数;Point3D定义了三维空间中的一点。而TriSurface则定义了一个三角面片。结 构体Param中的各成员变量指定了景物的光照参数,其具体含义将会在介绍光照 模型时说明。我们在CObject3D类中添加如下的成员变量和成员函数:public:/ 球体表面三角剖分后得到的三角面列表 CArray m_SurfaceList;Param m_Param;/球体表面光照参数Poi nt3D p3d101101;球体表面参数点数组int cou ntx,cou nty;生成的参数点在

8、经度和纬度上的数量 double bx,by,b z;/ 圆心坐标public:/创建指定球心和半径的球体void CreateBall(double x0, double y0, double z0, double r);void SetSurfaceList();/对球体表面进行三角剖分void SetFVector(TriSurface* surface);/设置三角面的法向量 void SetParam(Param param);/设置球体表面光照参数9.1.2 生成球体表面参数点成员函数CreateBall用于生成球体表面的参数点,并按这些参数点对球体表 面进行三角剖分,将剖分生成的

9、三角面片存入到列表m_SurfaceList中,其中三角剖分由成员函数 SetSurfaceList完成。CreateBall函数的实现代码如下:/创建一个球体void CObject3D:CreateBall(double x0, double y0, double z0, double r)int i=0,j;double pi = 3.1415926;bx = x0;by = y0;bz = z0;for (double u = -pi/2;upi/2+pi/32;u=u+pi/32)j = 0;for (double v = 0;v2*pi-pi/32;v=v+pi/32)p3dij.

10、x = x0 + r * cos(u) * cos(v);p3dij.y = y0 + r * cos(u) * sin(v); p3dij.z = z0 + r * sin(u);j+;i+;countx = i;county = j;SetSurfaceList();其中u和v的步长决定了产生的球体表面的参数点的数量。countx和county 需要在类的构造函数中设置初始值为0。程序中将生成的球体表面参数点存入到 p3d 数组中,这样做是为了方便对球体表面进行三角剖分。9.1.3 球体表面三角剖分对球体表面进行三角剖分采用如下方法。 设球体表面上一个参数点为 Pij , 则其经度上的下一

11、个参数点为 pi+1j ,而纬度上的下一个参数点为 pij+1 ,再 加上该点在对角线方向上的下一个参数点 pi+1j+1 ,这四个点构成的区域可以 剖分成两个三角面片。第一个三角面片的顶点为pij , pi+1j , pi+1j+1,第二个三角面片的顶点为pij , pij+1, pi+1j+1。在生成三角面片的同时需要 计算该三角面片的法向量, 因为在计算光照的时候需要用到此法向量。 平面上两 个向量的叉乘积即为平面的法向量, 其方向性满足右手定则, 计算的时候需要注 意法向量的方向应该是指向球外的。执行三角剖分的函数 SetSurfaceList和计算 法向量的函数SetFVector实

12、现代码如下:/ 球体表面进行三角剖分void CObject3D:SetSurfaceList()for (int i=0;icountx-1;i+)for (int j=0;jp2.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

13、) * (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用于设置景物的光照参数,其实现非常简单,代码如下:/ 设置光照参数void CObject3D:SetParam(Param param)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_

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号