本文转载自:http://blog.youkuaiyun.com/hcbbt/article/details/42779341
计算机图形学 复习笔记
(个人整理,仅做复习用 :D,转载注明出处:http://blog.youkuaiyun.com/hcbbt/article/details/42779341)
第一章 计算机图形学综述
-
研究内容
-
图形的概念:计算机图形学的研究对象
- 能在人的视觉系统中产生视觉印象的客观对象
- 包括自然景物、拍摄到的图片、用数学方法描述的图形等等
-
图形的要素
- 几何要素:刻画对象的轮廓、形状等
- 非几何要素:刻画对象的颜色、材质等
-
图形表示法
- 点阵表示
枚举出图形中所有的点,简称为图像。 - 参数表示
由图形的形状参数(方程或分析表达式的系数,线段的端点坐标等)+属性参数(颜色、线型等)来表示,简称为图形。
- 点阵表示
-
与相关学科的关系
- 图像变换 (图像处理)
- 图像生成 (计算机图形学)
- 模型(特征)提取 (计算机视觉,模式识别)
- 模型变换 (计算几何)
-
-
发展历史_软件发展及软件标准
- 通用标准
- GKS (第一个官方标准,1977)
- PHIGS
- 事实标准
- DirectX (MS)
- OpenGL(SGI)
- Adobe公司Postscript
- 通用标准
-
计算机图形学的应用
- 图形用户界面:介于人与计算机之间、人与机器的通信。
- CAD/CAM:设计、布局
- 科学计算可视化
- 事务管理
- 地理信息系统(GIS)
- 多媒体
- 娱乐
- 计算机艺术
- 虚拟现实
-
当前的研究动态
- 造型技术
- 真实感图形绘制技术
- 人机交互技术
- 与计算机网络技术的紧密结合
第二章 图形系统综述
-
视频显示设备
-
刷新式CRT
- 大部分视频监视器的操作是基于标准的阴极射线管(CRT)
- CRT 电子枪、聚焦系统、加速电极、偏转系统、荧光屏组成
- 荧光屏通过荧光物质收集电子束而发光。
- 持续发光时间:电子束离开某点后,该点的亮度值衰减到初始值1/10所需的时间
- 刷新频率:每秒钟重绘屏幕的次数:CRT产生稳定图像所需要的最小刷新频率=1秒/荧光物质的持续发光时间
- 像素:构成屏幕(图像)的最小元素
- 分辨率:CRT 在水平或竖直方向单位长度上能识别的最大像素个数,单位通常为 dpi
-
光栅扫描显示器
- 扫描行,在光栅扫描系统中,电子束横向扫描屏幕,一次一行,从顶到底依次进行,每一行称为一个扫描行;
- 帧,帧是指整个屏幕范围;
- 帧缓存或者刷新缓存,图形定义保存在称为刷新缓存或者帧缓存的存储器中,该存储器保存一组对应屏幕所有点的强度值,电子束在屏幕上逐点移动时从刷新缓存或者帧缓存取出强度值控制屏幕对应点的强度;
- 缓存深度或者位平面数,每像素的位数称为缓存深度或者位平面数;
- 位图,每像素一位的帧缓存通常称为位图;
- 像素图,每像素多位的帧缓存称为像素图;
- 水平回扫,刷新每条扫描线后,电子束返回到屏幕左端,称为电子束的水平回扫;
- 垂直回扫,在每帧的终止处,电子束返回到屏幕的左上角,开始显示下一帧,称为电子束的垂直回扫;
- 隔行扫描,首先从第0行开始,每隔一行扫描,将偶数行都扫描完毕垂直回扫后,电子束从第1行开始扫描所有奇数行。
-
随机扫描显示器
- 电子束只在屏幕上显示图形的部分移动。电子束逐条地跟踪图形的组成线条,从而生成线条图。
- 刷新显示文件:随机扫描系统的刷新平率依赖于显示的线数。
- 彩色CRT监视器
- 电子束穿透法:显示彩色图形的一种防复发式在屏幕上涂多层不同的荧光粉,发射颜色由电子束在荧光层中的穿透深度决定。
- 荫罩法:常用于光栅扫描系统,它能产生的彩色范围比电子束穿透法大得多
- 平板显示器
- 分为:发射显示器(不实用)和非发射显示器(液晶)
- 三维观察设备
- 3D眼镜
-
-
光栅扫描系统
- 优点:
- 成本低
- 易于绘制填充图形
- 色彩丰富
- 刷新频率一定,与图形的复杂程度无关
- 易于修改图形
- 缺点:
- 需要扫描转换
- 会产生混淆(走样)
- 普通显卡=视频控制器+缓存(显存)
- 图形加速卡=视频控制器+显存+显示处理器(GPU)
- 优点:
-
输入设备
- 二维:鼠标、坐标数字化仪、跟踪球、光笔、触摸屏、操纵杆、扫描仪..
- 三维:空间球、数据手套..
-
硬拷贝设备
- 长期保存图形
- 例:绘图仪,打印机
-
图形软件
- 坐标表示:
- 世界坐标系:通常世界坐标系是一个三维笛卡儿坐标系。它是一个全局坐标系统,一般为右手坐标系。
- 建模坐标系(局部坐标系):为了几何造型和观察物体方便起见,独立于世界坐标系定义的二维或三维笛卡儿坐标系称为局部坐标系。
- 设备坐标系或屏幕坐标系:屏幕坐标系也称为设备坐标系,它主要用于某一特定的计算机图形显示设备(如光栅显示器)的表面的点的定义。
- 建模坐标 -> 世界坐标 -> 规范化坐标 -> 设备坐标
- 图形的基本构造块称为输出图元
- 建模变换利用建模坐标给出的对象描述来构成场景
- 观察变换用来指定将要显示的视图,以及在输出显示区域出现的范围
- 主要任务:
- 建模(Modeling) 对象的顶点数据集
- 几何处理(Geometric Processing) 对象是顶点,包括:投影、图元装配、裁剪器、明暗处理
- 光栅化或扫描转换(Rasterization) 从裁剪后的对象生成片段
- 片元处理(Fragment Processing)
- 坐标表示:
-
OpenGL
-
OpenGL简介
核心库(GL):基本库。
实用函数库(GLU):处理专门操作的附加库。
实用函数工具包(GLUT):实用函数工具包。 -
OpenGL基本语法
XXX
-
第三章 输出图元
-
图元的生成(扫描转换):
- 从图元的参数表示形式(由图形软件包的使用者指定)到点阵表示形式(光栅显示系统刷新时所需的表示形式)的转换。
- 主要工作包括:确定像素集合及其颜色,显示图形对象。
-
画线算法
- 数字微分(DDA)画线算法
-
void lineDDA(int x0, int y0, int xEnd, int yEnd) {
-
int dx = xEnd - x0, dy = yEnd - y0, steps, k;
-
float xIncrement, yIncrement, x = x0, y = y0;
-
if ( abs(dx) > abs(dy)) //判断斜率是否大于
-
steps = abs(dx);
-
else
-
steps = abs(dy);
-
xIncrement = float(dx) / float(steps);
-
yIncrement = float(dy) / float(steps);
-
-
setPixel(round(x), round(y));
-
for (k = 0; k < steps; k++) {
-
x += xIncrement;
-
y += yIncrement;
-
setPixel(round(x), round(y));
-
}
-
}
-
- Bresenham画线算法
-
// 下面的是斜率 < 1.0 的程序
-
// 斜率 > 1.0 的只要交换 x x和 y 方向的规则即可
-
void lineBres(int x0, int y0, int xEnd, int yEnd) {
-
int dx = fabs(xEnd - x0);
-
int dy = fabs(yEnd - y0);
-
int p = 2 * dy - dx;
-
int twoDy = 2 * dy, twoDyMinusDx = 2 * (dy - dx);
-
int x, y;
-
-
if (x0 > xEnd) {
-
x = xEnd;
-
y = yEnd;
-
xEnd = x0;
-
} else {
-
x = x0;
-
y = y0;
-
}
-
setPixel(x, y);
-
-
while (x < xEnd) {
-
x++;
-
if (p < 0)
-
p += twoDy;
-
else {
-
y++;
-
p += twoDyMinusDx;
-
}
-
setPixel(x, y);
-
}
-
}
-
- 画线算法的讨论
- 线段端点的次序
- 线段的亮度
- 画线算法考核方式:
- 公式推导
- 给出具体的例子,如点 (1,2)->(8,10) 描出中间的点。
- 数字微分(DDA)画线算法
-
圆 圆弧 椭圆的生成
- 圆的生成
- 直接离散:离散点、离散角度
- 中点画圆法 :详细的演示
- F(X,Y)=X^2+Y^2-R^2
- 如果
F(X+1,Y+0.5)>=0
,则下一个点是(X+2,Y-0.5)
- 如果
F(X+1,Y+0.5)<0
,则下一个点是(X+2,Y-1.5)
- 设置D值,每次判断增量即可
- 正负法画圆
- 如果F(xi,yi)<0,说明点Pi在圆内,那么下一步应向圆外走
- 如果F(xi,yi)>0,说明点Pi在圆外,那么下一步应向圆内走
- 圆的生成
-
多边形填充区
- 多边形凹凸性判定:
- 延长线法:延长每边,观察如果顶点分布在延长线两侧,则为凹多边形
- 向量法
- 按逆时针方向计算多边形的边向量的叉积
- 记录叉积结果Z分量的符号。
- 如果Z分量变为负值,则多边形为凹多边形,可以沿叉乘向量对中的第一条边的延长线将多边形分解开
- 判断点与多边形的内外关系:
- 射线法(奇偶规则):由点出发向任意方向作射线,计算此射线与多边形所有交点个数,如果交点个数为奇数,则点在多边形内部,如果交点个数为偶数,则点在多边形外部.
- 非零环绕数规则:所有的边按照统一的方向统计有多少条是从同一侧面通过这条射线的,又有多少条是从射线另一侧通过的,之后相减,如果结果是零,表示之前任意选择的点在图形外部,其他一切非零数表示在内部
- 多边形网格表示的方法
- 显式表示
- 指向顶点表的指针
- 指向边表的指针
- 方程表示
- 多边形凹凸性判定:
第四章 图元的属性
-
颜色和查找表
- 颜色是所有图元的一个基本属性
- 在彩色光栅系统中,可选用的颜色数量依赖于帧缓存中提供的存储容量。
- 颜色信息有两种存储方法: 直接存储RGB编码。 存储颜色码(查找表)
- 使用彩色表可提供合理的同时显示的颜色数量
-
点的属性
- 颜色
- 大小
-
线的属性
- 线宽
- 画笔和画刷
- 线型
-
填充区属性
- 填充模式
- 颜色调和填充区域
-
通用扫描线填充算法
- 扫描线算法是按扫描线顺序,计算扫描线与多边形的相交区间,再用要求的颜色显示这些区间的象素,完成转换工作。区间的端点可以通过计算扫描线与多边形边界线的交点获得。
- 对于一条扫描线,多边形的扫描转换过程可以分为四个步骤:
- 求交:计算扫描线与多边形各边的交点;
- 排序:把所有交点按x值递增顺序排序;
- 配对:第一个与第二个,第三个与第四个等等;每对交点代表扫描线与多边形的一个相交区间,
- 着色:把相交区间内的象素置成多边形颜色,把相交区间外的象素置成背景色。
-
不规则边界区域填充方法
- 递归算法
-
void flood_fill_4(int x, y, old_color, fill_color) {
-
int current;
-
current = read_pixel(x, y);
-
if (current == old_color && current != fill_color) {
-
write_pixel(x, y, fill_color);
-
flood_fill_4(x - 1, y, old_color, fill_color); /* 左 */
-
flood_fill_4(x, y + 1, old_color, fill_color); /* 上 */
-
flood_fill_4(x + 1, y, old_color, fill_color); /* 右 */
-
flood_fill_4(x, y - 1, old_color, fill_color); /* 下 */
-
}
-
}
-
- 扫描线算法 演示
-
void Scanline(int x, int y) {
-
if (x < 0 || x >= ROW || y < 0 || y >= COL || vis[x][y])
-
return;
-
int xl = 0, xr = 0, i;
-
drawPoint(x, y, 2);
-
for (xl = x - 1; xl >= 0; xl--) {
-
if (!vis[xl][y])
-
drawPoint(xl, y, 2);
-
else
-
break;
-
}
-
for (xr = x + 1; xr < ROW; xr++) {
-
if (!vis[xr][y])
-
drawPoint(xr, y, 2);
-
else
-
break;
-
}
-
for (i = xl + 1; i < xr; i++) {
-
Scanline(i, y - 1);
-
Scanline(i, y + 1);
-
}
-
}
-
- 递归算法
-
反走样
- 走样
- 用离散量(像素)表示连续的量(图形)而引起的失真,叫混淆或叫走样(aliasing)。
- 光栅图形的走样现象:
- 阶梯状边界;
- 图形细节失真;
- 狭小图形遗失:动画序列中时隐时现,产生闪烁。
- 走样
第五章 几何变换
- 矩阵运算 数学基础
-
基本的二维几何变换
- 平移
x'=x+tx, y'=y+ty
- 旋转
x'=xcosθ-ysinθ, y'=xsinθ+ycosθ
- 缩放
x'=sxx, y'=syy
- 平移
-
矩阵表示和齐次坐标
- 齐次坐标:用n+1维表示n维向量
-
逆变换
- 平移变换 T(tx,ty)的逆矩阵为T(-tx,-ty)
- 旋转变换 R(θ)的逆矩阵为R(-θ)
- 缩放变换 S(sx,sy)的逆矩阵为S(1/sx,1/sy)
-
二维复合变换
- 矩阵乘法不可交换
- 复合二维变换的高效实现应该是:先用矩阵乘法将多个基本二维变换矩阵合并成一个复合二维变换矩阵,再计算变换后的坐标。
-
其它二维变换
- 对称变换
- 错切变换
-
二维坐标系间的变换
- 步骤:
- 将x’y’系统的坐标原点平移到xy系统的原点.
- 将x’轴旋转到x轴上.
M = R(- θ)*T(-x0,-y0)
- 步骤:
-
三维空间的几何变换
- 右手坐标系
- 三维平移
-
// x 轴
-
0 1 0 0
-
0 C -S 0
-
0 S C 0
-
0 0 0 1
-
// y 轴
-
C 0 S 0
-
0 1 0 0
-
-S 0 C 0
-
0 0 0 1
-
// z 轴
-
C -S 0 0
-
S C 0 0
-
0 0 1 0
-
0 0 0 1
-
- 三维旋转
- 将点 P1 平移到坐标原点
- 绕x轴旋转,将向量u变换到xz平面上为U’
- 绕y轴旋转,将单位向量u’‘变换到z轴正方向
- 绕z轴旋转角度θ
- 用前 3 步的逆变换将旋转轴变换回原来位置
R(θ)=T(x1,y1,z1)·Rx(α)T·Ry(β)T·Rz(θ)·Ry(β)·Rx(α)·T(-x1,-y1,-z1)
- 三维缩放
-
Sx 0 0 0
-
0 Sx 0 0
-
0 0 Sz 0
-
0 0 0 1
-
-
三维复合变换
- 矩阵连乘合并
- 最右边的矩阵是第一个作用于对象的变换,最左边的矩阵是最后一个
-
三维坐标系间的变换
- 用单位轴向量来实现:
-
Ux1 Ux2 Ux3 0
-
Uy1 Uy2 Uy3 0
-
Uz1 Uz2 Uz3 0
-
0 0 0 1
-
- 用单位轴向量来实现:
-
仿射变换
- 平移、旋转、缩放、反射和错切是二维仿射变换的特例
第六章 二维观察
-
二维观察流水线
- 世界坐标系中要显示的区域称为窗口(裁剪窗口)
- 窗口映射到显示器的区域称为视口。
- 窗口定义了显示的内容,而视口定义在什么位置显示。
- 通常将世界坐标系中一部分区域映射到设备坐标系的操作称为观察变换。
- 建模坐标 -> 世界坐标 -> 规范化坐标 -> 设备坐标
-
OpenGL二维观察函数
-
-
gluOrtho2D(xwmin, xwmax, ywmin, ywmax);
-
glViewport(xvmin, yvmin, width, height);
-
-
-
二维点的裁剪
- 满足
xwmin <= x <= xwmax;
ywmin <= y <= ywmax;
则保留该点.
- 满足
-
二维线的裁剪
- Cohen-Sutherland算法
- 基本思想:
- 若直线的两个端点P1P2完全在窗口内,则显示该线段P1P2,简称“取”之
- 若直线的两个端点P1P2明显在窗口外,则丢弃该线段,简称“弃”之
- 直线裁剪
- 区域码
-
位 4 3 2 1
-
坐标区 上 下 右 左
-
- 利用区域码判断非常方便,详细算法分析
- 基本思想:
- 中点分割算法
- 同样利用区域码
- 基本思想前两步跟 Cohen-Sutherland算法 一样:
- 3 中点分割的方法求出线段与窗口的交点:即从P0点出发找出距P0最近的可见点A和从P1点出发找出距P1最近的可见点B,两个可见点之间的连线即为线段P0P1的可见部分。
- Cohen-Sutherland算法和中点分割算法的比较
- Cyrus-Beck算法
- 将线段表示成参数方程的形式,求线段与窗口边界的交点的参数,确定了线段的可见部分之后再用交点的参数计算交点的坐标
- 适用于凸多边形裁剪窗口
- 梁友栋-Barsky算法
- 简化为
up<=q
的参数式再处理 - 详细算法分析 的后半部分
- 简化为
- NLN算法
- 基本思想:
- 向窗口的四个角点引射线再处理
- 基本思想:
- Cohen-Sutherland算法
第七章 三维观察
-
三维观察概念综述
- 投影
- 深度
- 可见线和可见面的判定
-
三维观察流水线
- 模型坐标->(建模变换)->世界坐标->(观察变换)->观察坐标->(投影变换)->投影坐标->(规范化变换和裁剪)->规范化坐标->(视口变换)->设备坐标
-
三维观察坐标参数
- 观察点(观察位置,视点,照相机位置)
- 观察向上向量
-
世界坐标系到观察 坐标系的变换
M = R * T
- T(-x0, -y0, -z0)
- R(uvn) (见’三维坐标系间的变换’)
-
投影变换
- 投影变换就是将维数为n的点变换成维数小于n的点。
- 类型:
- 平行投影
- 透视投影
- 球面投影
- 圆柱投影
-
正投影
- 轴侧正投影
-
斜投影
- 当投影路径与观察平面不垂直时,该映射称为斜平行投影
-
透视投影
- 灭点
第八章 三维对象的表示
-
多面体
- 多边形网格表示的方法
- 显式表示
- 指向顶点表的指针
- 指向边表的指针
- 方程表示
- 多边形网格表示的方法
-
OpenGL多面体函数
- 函数
-
// 三棱锥
-
glutWiredTetrahedron();
-
glutSolidTetrahedron();
-
// 立方体
-
glutWireCube(edgeLength);
-
glutSolidCube(edgeLength);
-
// 八面体
-
glutWireOctahedron();
-
glutSolidOctahedron();
-
// 12
-
glutWireDodecahedron();
-
glutSolidDodecahedron();
-
// 20
-
glutWireIcosahedron();
-
glutSolidIcosahedron();
-
- 函数
-
曲面
- 常用的曲面:二次曲面、超二次曲面、多项式和指数函数、样条曲面
-
二次曲面
-
-
x=rcosΦcosθ (-π/2 <=Φ<=π/2)
-
y= rcosΦsinθ ( -π<= θ<= π)
-
z= rsinθ
-
-
-
第九章 可见面判别算法
-
可见面判别(隐藏面消除)算法
- 分类:物空间和像空间
- 利用排序和连贯性来提高算法性能
-
Back-Face Detection 后向面判别
- 思想:
- Ax+By+Cz+D=0
- 如果点(x, y, z)为视线上的点,并且满足Ax+By+Cz+D <0
- 该平面为后向面
- 测试方法:多边形面法向量N * 视线向量V > 0,则为后向面
- 思想:
-
Depth-Buffer Method 深度缓冲算法
- 思想:对投影平面上每个像素所对应的表面深度进行比较
- 属于像空间算法
- 算法:
- 初始化帧缓存和深度缓存
depthBuff(x, y) = 1.0
,frameBuff(x, y) = backgndColor
- 处理场景中的每一物体:计算各点深度,若
z < depthBuff(x, y)
,就更新
- 初始化帧缓存和深度缓存
-
A-Buffer Method A-缓冲算法
- 基本方法是扩展深度缓冲器,使每个像素位置对应一个表面链表
- 每个单元包含两个域:深度域 、强度域
-
Scan-Line Method 扫描线算法
- 将3D对象各表面投影到投影平面,计算扫描线与投影多边形的相交区间。相交区间属于同一表面,直接显示该表面的颜色信息;而当出现重叠区间时,采用深度测试确定采用哪个表面的强度信息。
-
Depth-Sorting Method 深度-排序算法
- 若场景中任何多边形表面在深度上均不贯穿或循环遮挡,则各多边形的优先级顺序可完全确定
- 算法:
- 将表面按深度递减方向排序
- 由深度最大的表面开始,逐个对表面进行扫描转换
OPENGL部分
一道大题,主要考察大家对基本图形应用与OPENGL编程框架的掌握。
OPENGL语句,只需要理解,不需要记忆。