计算机图形学.ppt_第1页
计算机图形学.ppt_第2页
计算机图形学.ppt_第3页
计算机图形学.ppt_第4页
计算机图形学.ppt_第5页
已阅读5页,还剩87页未读 继续免费阅读

下载本文档

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

文档简介

计算机图形学 教材 计算机图形学 杨钦 徐永安 翟红英编著 清华大学出版社出版 ISBN7 302 10434 4 TP7086 教学内容 算法 原理 OpenGL基础知识授课对象 专科授课老师 杨朝霞 第一章绪论 本章内容 1 1计算机图形学的发展历史1 2计算机图形学的研究内容1 3计算机图形学的应用领域 1 1计算机图形学的发展历史 开创阶段 50年代初 50年代末 1950年 MIT采用原理类似于示波器阴极射线管 CRT 作为旋风一号的图形显示器 1958年 滚筒式绘图仪和平板式绘图仪研制成功 50年代末 SAGE空中防御指挥系统采用光笔作为输入设备 标志着交互式图形技术的诞生 迅速发展阶段 60年代初 60年代末 计算机图形学之父 Ivan E Sutherland60年代中期出现随机扫描显示器 大公司纷纷开展图形学科学研究 出现各种系统软件和应用软件 降低成本阶段 60年代末 70年代初 60年代末存储管显示器出现 大大降低图形硬件系统成本 70年代初 出现一批通用的 可移植的软件系统 发展成熟阶段 70年代初 80年代初 光栅扫描显示器得到推广 出现许多新型的图形输入设备 如各类图形输入板 坐标数字化仪 跟踪球 鼠标器等 GKS PHIGS等国际标准的建立 推广应用阶段 80年代中 90年代中 图形工作站的出现 如Apollo Sun HP等 目前 九十年代中至今 微机和软件系统的普及使得图形学的应用领域日益广泛 图形学已经同模式识别 人工智能 数据库等众多领域结合 形成一些交叉学科 如工程数据库 多媒体等 液晶显示器和等离子显示器的普及 1 2计算机图形学的研究内容 图形的输入 研究如何输入图形或图形数据到计算机中 图形的表示 研究如何在计算机内存和外存中表达和存储图形 图形的处理 研究如何将某种形式表达的图形转换成另一种表达形式 图形的显示与输出 研究如何将计算机中以某种形式表达的图形生成可见的图像 1 3计算机图形学的应用领域 图形用户界面计算机辅助设计与制造科学计算可视化地理信息系统娱乐计算机艺术虚拟现实逆向工程 第二章计算机图形系统 本章内容 图形显示设备 介绍像素 三基色的概念 计算机图像软件图形标准OpenGL介绍 图形显示设备 像素 见书本第8页 三基色 在颜色系统中 一般采用三基色 即红red 绿green 蓝blue 来表示颜色 计算机图形软件 通用编程软件包如OpenGL DirectX等专业应用图形软件包如AutoCAD 3DSMAX等 图形标准 官方标准化组织发布的图形标准 如GKS PHIGS等 被工业界普遍使用 已经成为事实上的标准 如SGI等公司开发的OpenGL 微软公司开发的DirectX OpenGL介绍 OpenGL原先是SiliconGraphicsIncorporated SGI公司 开发的图形接口 OpenGL已成为开放式三维图形接口OpenGL是一个到图形硬件的软件接口OpenGL是一个独立于硬件的高效接口 OpenGL的主要功能 绘制模型 各种变换 着色模式 光照处理 纹理映射 选择和反馈 位图和图像 制作动画 Windows下OpenGL编程常用的函数库 OpenGL图形库 函数以gl开头 可以实现比较简单的绘制功能 这些函数可以运行在现在任何主流操作系统中 OpenGL实用库 函数以glu开头 其函数功能更高级一些 如绘制复杂的曲线曲面 高级坐标变换 多边形分割等 这些函数可以运行在现在任何主流操作系统中 OpenGL辅助库 函数以aux开头 它们是一些特殊的函数 包括简单的窗口管理 输入事件处理 某些复杂三维物体绘制等函数 它只能在Win32平台下运行 OpenGL实用工具开发库 函数以glut开头 它们提供更为复杂的绘制功能 Windows专用函数库 以wgl开头 负责OpenGL与Windows窗口系统的连接 如何在windows下利用VisualC 6 0调用OpenGL 1 安装VC 6 0 如需详细的帮助文件 还需安装MSDN 2 将opengl32 lib glu32 lib glaux lib文件放到vc下的Lib目录里 如 c ProgramFiles MicrosotVisualStudio VC98 Lib 3 将gl h glu h glaux h文件放到vc下的Include GL目录里 如 c ProgramFiles MicrosotVisualStudio VC98 Include GL 4 将opengl32 dll glu32 dll文件放到system目录里 如 C WINDOWS system32注 这些文件一般都已存在 微软已捆绑 注 若想使用glut库 则相应的glut32 lib glut h glut32 dll文件要分别放入上面所说的目录里 这三个文件系统不自带 5 在程序的开头include头文件 gl h glu h glaux h glut h 如果需要的话 6 链接器中加入对应的库文件 opengl32 lib glu32 lib glaux lib glut32 lib 如果需要的话 附 OpenGL框架 1 创建 得到一个带WinMain函数的Project 这里命名为OpenGL框架 2 编写OpenGL框架 3 效果图 这时voidDrawOpenGL 函数中尚未添加任何内容 该函数的功能是绘制图形 注 若OpenGL框架不能正常运行 解决办法如下 执行opengl95 exe 得到一系列文件 将其中的两个dll文件均copy到OpenGL框架目录下的Debug和Release目录里 若想了解某个函数的功能 可查找帮助文件 参考书 计算机图形学实验教程 OpenGL版 李胜睿等编著 机械工业出版社OpenGL官方站点 www opengl org红皮书 蓝皮书 上面站点有下载 第三章基本光栅图形生成技术 本章学习内容 3 1光栅图形学概述3 2 1直线段的生成算法 只介绍DDA算法 3 3区域的填充3 4文字的生成3 6用OpenGL生成基本图形 3 1光栅图形学概述 光栅化 连续到离散的过程 在绘制具有连续性质的图形时 需要确定最佳逼近它们的像素 这个过程称为光栅化 扫描转换 当光栅化按照扫描线 行扫描线或列扫描线 的顺序进行时 它被称为扫描转换 点的扫描转换 几何定义的点 x y 实数域像素点 x y 整数域点的扫描转换方法 1 x floor x y floor y floor的返回值为小于等于参数值的最大整数 2 x round x y round y round的返回值为大于等于参数值的最小整数 3 2 1直线段的生成算法 扫描转换直线段 是指计算出落在直线段上或充分靠近它的一串像素 并以此像素集近似代替原连续直线段在屏幕上显示的过程 本节我们只讨论具有1个像素宽度的直线段的扫描转换 即当该线段的斜率落在 1到1之间时 它在每个列扫描线上仅有一个像素 当该线段的斜率的绝对值大于1时 它在每个行扫描线上仅有一个像素 为了讨论方便 我们将像素看作是中心为网格点 x y 的圆点 像素间的距离是均匀的 像素相互不重叠 斜率在 1到1之间 每个列扫描线上仅有一像素 斜率绝对值大于1 若每个列扫描线上仅有一像素 出现断裂 斜率绝对值大于1 每个行扫描线上仅有一像素 为了简化讨论 假定直线段的顶点落在像素点上 即顶点坐标为整数坐标 设直线段L的两个端点为则直线方程可写为y kx b 其中k为斜率 b为截距 生成直线段的DDA算法 该算法将斜率分成两种情况 对的情况 假定这样对该直线段是按照列扫描线从左 到右 每次加1的顺序进行扫描转换 假设列扫描线与直线段的交点为 我们知道则这条列扫描线上距离直线段最近的像素点为 那么下一条列扫描线上距离直线段最近的像素点为 这是因为 对的情况 可以将直线方程写为 然后按照行扫描线的顺序进行扫描转换 原理仍然类似于的情况 例子 用DDA算法扫描转换连接两点P0 0 0 和P1 5 2 的直线段 解 由于k 2 5 0 4 1 因此采用列扫描线进行扫描转换 x从0到5 每次加1 y的初值为0 每次加0 4 然后对y四舍五入 即round y 结果见下表 3 3区域的填充 本节研究如何用一种颜色或图案来填充一个二维多边形区域 多边形区域的两种表示方法 顶点表示和点阵表示 本节介绍扫描线算法和简单的种子填充算法 前者适用于顶点表示的多边形区域 后者适用于点阵表示的多边形区域 3 3 1扫描线算法 基本原理 利用扫描线的连贯性 填充每一条扫描线 按行扫描线顺序或列扫描线顺序 这里取前者 位于多边形内部的区段 二 对于一条行扫描线 多边形的填充过程 求交 计算行扫描线与多边形各边的交点 排序 把所有交点按x值递增顺序排序 配对 第一个交点与第二个 第三个与第四个 依次类推 每对交点代表行扫描线与多边形的一个相交区间 填色 把相交区间内的像素置成多边形颜色 相交区间外的像素置成背景色 扫描线与多边形交于顶点的处理情况 将多边形的每条边看成是下端闭上端开 注 这样一来 水平边在算法中不起作用 在预处理中可将它们去掉 四 由扫描线y e和多边形各边的交点递推出扫描线y e 1与多边形各边的交点 五 数据结构 边的分类表NET 也叫新边表 和活性边表AET 基本元素为边结构 其定义为typedefstruct intymax floatx deltax structEdge nextEdge Edge 其中 ymax 表示边的上端点的y坐标 x 在NET中表示边的下端点的x坐标 在AET中表示当前扫描线与边的交点的x坐标 deltax 表示边的斜率的倒数 nextEdge 表示指向下一条边的指针 注 这里4个参数的位置与书本上略有不同 书上第1个参数为x 第2个为deltax 第3个为ymax 六 例 七 扫描线算法描述 建立NET 将扫描线纵坐标y的初值置为NET中非空元素的最小序号 置AET为空 执行下列步骤直至NET和AET都为空 1 如果NET中的第y类非空 则将其中的所有边取出并插入AET中 2 如果有新的边插入AET 则对AET中各边排序 按x值由大到小的顺序 3 对AET中的边两两配对 将每对边中x坐标按规则取整 获得有效的填充区段 再填充 4 将当前扫描线纵坐标y值递增1 即y y 1 5 对AET中满足y ymax边删去 因为每条边被看作下闭上开的 6 对AET中剩下的每一条边的x递增deltax 即x x deltax 3 3 2种子填充算法 这里的区域是指已经表示成点阵形式的填充图形 该算法是对区域重新着色的过程 是指将区域内的一点 称为种子点 赋予指定的颜色 然后将该颜色扩展到整个区域 区域的表示和类型内点表示 指区域内的所有像素着同一颜色 边界表示 指区域的边界点着同一颜色 4连通区域 8连通区域 注 书本第44页图3 12中的第3个图为8连通区域 第4个图为4连通区域 4连通一定是8连通 简单的种子填充算法 也叫递归填充算法 内点表示的4连通区域的递归填充算法voidFloodFill4 intx inty intoldColor intnewColor if GetPixel x y oldColor PutPixel x y newColor FloodFill4 x y 1 oldColor newColor FloodFill4 x y 1 oldColor newColor FloodFill4 x 1 y oldColor newColor FloodFill4 x 1 y oldColor newColor 2 边界表示的4连通区域的递归填充算法voidBoundaryFill4 intx inty intboundaryColor intnewColor intcolor GetPixel x y if color boundaryColor 3 4文字的生成 点阵字符的显示 首先从字库中将它的位图检索出来 然后将检索到的位图写到帧缓冲器中 矢量字符的显示 首先从字库中将它的信息检索出来 然后取出端点坐标 对其进行适当的几何变换 再根据各端点的标志显示出字符 3 6用OpenGL生成基本图形 OpenGL提供了描述点 线 多边形的绘制机制 它们通过glBegin 和glEnd 函数配对来完成 glBegin 的参数有多种选择 分别对应着不同的点 线 多边形 glEnd 无参数 只是标志着所绘制图形的结束 glBegin 和glEnd 之间的内容决定了图形的形状 是由顶点坐标函数glVertex 来定义 3 6 1用OpenGL生成点 例1 二维点glBegin GL POINTS glVertex2f 0 0 0 0 glVertex2f 0 0 2 0 glVertex2f 2 0 0 0 glVertex2f 3 0 3 0 glEnd 例2 三维点glBegin GL POINTS glVertex3f 0 0 0 0 7 0 glVertex3f 0 0 2 0 7 0 glVertex3f 2 0 0 0 7 0 glVertex3f 3 0 3 0 7 0 glEnd 用glBegin GL POINTS 和glEnd 配对完成 glPointSize 用来设置点的显示大小 注意 位置要放在glBegin 前面 程序 voidDrawOpenGL glClear GL COLOR BUFFER BIT GL DEPTH BUFFER BIT glLoadIdentity glTranslatef 1 5f 1 0f 7 0f glPointSize 5 0 glBegin GL POINTS glColor3ub 255 0 0 glVertex3f 0 0 0 0 7 0 glColor3ub 255 250 0 glVertex3f 0 0 2 0 7 0 glColor3ub 255 0 250 glVertex3f 2 0 0 0 7 0 glColor3ub 255 250 240 glVertex3f 3 0 3 0 7 0 glEnd glFlush 刷新命令队列 确保所有命令都被执行 效果图 3 6 2用OpenGL生成直线 例1 glBegin GL LINES glVertex2f 0 0 0 0 glVertex2f 0 0 2 0 glVertex2f 2 0 0 0 glVertex2f 3 0 3 0 glEnd 在例1中共生成2条线段 若GL LINES换成GL LINE STRIP 则生成一条由3条线段连成的折线 若换成GL LINE LOOP 则生成一条由4条线段连成的闭合折线 glBegin 的参数可以选GL LINES GL LINE STRIP GL LINE LOOP 线宽 glLineWidth 线型 glLineStipple 在使用前 必须先用glEnable GL LINE STIPPLE 启动 glDisable GL LINE STIPPLE 用来关闭该功能 效果图 利用生成直线的函数 可以生成曲线 3 6 2用OpenGL生成多边形 例1 glBegin GL TRIANGLES glVertex2f 0 0 0 0 glVertex2f 0 0 2 0 glVertex2f 2 0 0 0 glVertex2f 3 0 3 0 glEnd 在例1中 只画出1个三角形 第4个顶点不起作用 如果参数改为GL TRIANGLE STRIP和GL TRIANGLE FAN 则均画出2个三角形 第1个三角形都一样 但第2个不同 见效果图 glBegin 的参数可以选GL POLYGON GL TRIANGLES GL TRIANGLE STRIP GL TRIANGLE FAN GL QUADS GL QUAD STRIP 效果图 OpenGL绘制的多边形的区域内部在缺省情况下是被指定的颜色填充 颜色用glColor 指定 利用生成多边形的函数 可以生成三维图形 如四面体 六面体或曲面等 关于三维图形 涉及到面的正反及面的法向量 具体内容放到第4章介绍 本章回顾 本章我们介绍了DDA算法 扫描线算法 种子填充算法 文字显示的原理以及OpenGL的一些基本内容 本章内容是关于图形显示的 第四章图形变换 本章讲述的内容 几何变换坐标变换显示变换裁剪OpenGL坐标变换机制 4 1几何变换 几何变换是构造和修改图形的一种方法 通常用矩阵来刻画几何变换 称为变换矩阵 图形由一系列顶点的位置矢量来表示 对图形作几何变换既是把变换矩阵作用到图形一系列顶点的位置矢量上 从而得到新的顶点序列 连接新的顶点序列即可得到变换后的图形 几何变换是在同一坐标系下进行的 基本几何变换 平移变换 缩放变换 旋转变换 z x y 平移变换 相对于原点的平移 点P x y z 沿x轴方向平移距离 沿y轴方向平移距离 沿z轴方向平移距离 变成点P x y z 这一变换过程可表示为 缩放变换 相对于原点的缩放 几何图形的三维缩放变换是通过对构成图形的各个点同时进行坐标值的缩放来实现的 设点P沿x y z轴缩放的比例分别为Sx Sy Sz 则缩放变换这一过程可表示为 旋转变换 围绕坐标轴的旋转 旋转角度有正有负 正代表正向旋转 负代表负向旋转 在右手坐标系中 旋转轴相应的旋转正向x轴从y轴到z轴y轴从z轴到x轴z轴从x轴到y轴即从旋转轴的正向看向原点 旋转正向是逆时针方向 在左手坐标系中从旋转轴的正向看去 旋转正向是顺时针方向 这样定义旋转方向的原因是为了保证无论在右手坐标系中还是在左手坐标系中 所用的旋转矩阵是相同的 点P绕z轴旋转 角 这一过程可表示为 点P绕x轴旋转 角 这一过程可表示为 点P绕y轴旋转 角 这一过程可表示为 二 组合变换举例 先对点P做缩放变换 得到点P 然后对点P 做旋转变换 得到P 则P R P R S P R S P2 先对点P做平移变换 得到点P 然后对点P 做旋转变换 得到P 则P R P R P T R P R T3 观察两个例子我们发现在第1个例子中 组合变换仍可以用一个矩阵 由R S得到 来刻画 4 如果引入齐次坐标 则第2个例子也会具有类似于第1个例子的结果 三 齐次坐标 齐次坐标表示就是用n 1维向量表示n维向量 三维空间中的点 x y z 的齐次坐标表示为 x y z 是任一不为0的数 齐次坐标表示是不唯一的 所以通常 x y z 的齐次坐标表示为 x y z 1 齐次坐标下的平移变换矩阵 变换过程可表示为 齐次坐标下的缩放变换矩阵 变换过程可表示为 齐次坐标下的绕x轴旋转变换矩阵 变换过程可表示为 齐次坐标下的绕y轴旋转变换矩阵 变换过程可表示为 齐次坐标下的绕z轴旋转变换矩阵 变换过程可表示为 观察齐次坐标表示下的图形的基本几何变换 为讨论方便 这里变换矩阵统一用A表示 我们发现这些变换均可以用A乘以图形的位置矢量 这里指的是齐次坐标形式 来刻画 若位置矢量是列向量形式 后面若不加说明 均指这种形式 则A左乘位置矢量 前面我们给出的公式即属于这种类型 若位置矢量是行向量形式 则A的转置右乘位置矢量 为讨论方便 在前面的公式中我们均是对一个点来做变换 下面我们以一个例子来说明如何对一个图形来做几何变换 例 现将三角形A 1 1 1 B 1 5 5 C 5 5 5 沿着x y z轴分别平移2 4 6 求平移后的三角形A B C 解 将三角形ABC用齐次坐标表示下的矩阵来表示 则平移过程可刻画为 计算得因此平移后的三角形A B C 的顶点坐标分别为 3 5 7 3 9 11 7 9 11 四 组合变换举例 1 由于引入齐次坐标表示 所有的组合变换矩阵均可以用一个矩阵来刻画 这个矩阵是由几个基本几何变换矩阵相乘得来 因此对图形作组合变换就类同于基本几何变换 即先求出组合变换矩阵 然后再乘以图形的矩阵表示 2 例 求相对于点P的缩放变换矩阵A 解 这一变换可分解为三个基本变换 先平移 T1 再缩放 S 最后再平移 T2 因此A T2 S T1 这里点的位置矢量必须是列向量形式 如果是行向量 则A T1 S T2 4 2坐标变换 坐标变换是根据图形在一个坐标系下的坐标求出该图形在另一个坐标系下的坐标 坐标变换是在两个坐标系之间进行的 问题描述 有甲乙两个坐标系 已知某一图形在甲坐标系中的坐标值 求其在乙中的位置 一般做法 在甲坐标系下 求把乙的坐标轴变换成甲的坐标轴的变换矩阵 用该矩阵乘以图形在甲中的坐标 均指齐次坐标表示 就可以得到图形在乙中的坐标 该矩阵就是所求的坐标变换矩阵 下面举几个例子 例1 x o y 坐标系的原点o 在xoy坐标系下的坐标为 2 4 对应的坐标轴互相平行 点P在xoy坐标系下的坐标为 4 5 求点P在x o y 坐标系下的坐标 解 从x o y 到xoy的变换矩阵为T 2 4 点P 4 5 在x o y 中的坐标矢量 齐次表示 为 T2 2 4 例2 x o y 坐标系与xoy坐标系原点重合 对应的坐标轴夹角为45 点P在xoy中的位置同例1 求P变换到x o y 中的坐标变换矩阵 解 将x o y 坐标系逆时针旋转45 就和xoy重合 则坐标变换矩阵为 R 4 注 在二维坐标系下 绕原点逆时针旋转为旋转正向 例3 x o y 坐标系的原点o 在xoy坐标系下的坐标为 2 4 对应的坐标轴夹角为45 点P在xoy中的位置同例1 求P变换到x o y 中的坐标变换矩阵 解 先平移x o y 使o 和o重合 再将x o y 逆时针旋转45 就和xoy重合 则坐标变换矩阵为 R 4 T 2 4 三维坐标系的推广比较适合于给出了旋转角度或很容易求出旋转角度的情况在新坐标系的旋转角度没有给出且不易计算时 一般会给出新坐标系的原点坐标和三个坐标轴的单位矢量 均指在旧坐标系下 o uvw坐标系的原点o 在oxyz中的位置是 x y z 三个坐标轴在oxyz中的单位矢量是 u ux uy uz v vx vy vz w wx wy wz 则将图形在oxyz

温馨提示

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

评论

0/150

提交评论