文章目录
- XJTUSE计算机图形学总结笔记
XJTUSE计算机图形学总结笔记
第一章 绪论
研究内容
图形系统的主要任务
利用计算机来显示、生成和处理图形。
计算机图形学的研究对象
图形的要素【填空题】
图形图像表示法
1️⃣ 点阵表示:点阵图
枚举出图形中所有的点,简称为图像(Image)。
2️⃣ 参数表示:矢量图
由图形的形状参数(方程或分析表达式的系数,线段的端点坐标等)+属性参数(颜色、线型等)来表示,简称为图形(Graphics)。

图形研究例子
图形的输入:如何开发利用图形输入设备及软件将图形输入到计算机中去,以便作各种处理
图形的处理:
几何变换 平移,缩放,旋转……
投影变换 平行投影,透视投影
运算(集合运算)交,并,差… 着色 形变……
图形的输出: 将图形特定的表示形式转换成图形输出系统便于接受的表示形式,并将图形在显示屏或打印机等输出设备上输出。
相关学科
发展历史
历史追溯
1950年,MIT,旋风一号(Whirlwind I)计算机图形显示器,类似于示波器的CRT来显示简单图形
50年代末期,MIT林肯实验室,在Whirlwind上开发SAGE空中防御系统,通过光笔在屏幕上指点与系统交互
1962年MIT林肯室验室Ivan.E.Sutherland的博士论文:Sketchpad:一个人机通信的图形系统。该系统确定了交互图形学作为一个学科分支
60年代:MIT、Bell Lab、 通用汽车公司、剑桥大学 开展大规模的研究
70年代进入技术实用化
80年代初,图形学依然是较小的学科,原因是图形硬件设备十分昂贵,且基于图形的应用相对较少
80年代中期以来,超大规模集成电路的发展,为图形学的飞速发展奠定了基础
硬件发展
图形显示器的发展
图形输入设备的发展
软件发展及软件标准
三种类型的计算机图形软件系统:
1️⃣ 用某种语言写成的子程序包
如:GKS (Graphics Kernel System) ,OpenGL
便于移植和推广、但执行速度相对较慢,效率低
2️⃣ 扩充计算机语言,使其具有图形生成和处理功能
如:Turbo Pascal、Turbo C,AutoLisp等。
简练、紧凑、执行速度快,但不可移植
3️⃣ 专用图形系统:效率高,但系统开发量大,可移植性差
通用标准:GKS (第一个官方标准,1977)、PHIGS
事实标准:DirectX (MS)、OpenGL(SGI)、Adobe公司Postscript
计算机图形学的应用
早期的计算机动画:基于“关键帧”的动画
最新:基于物理模型的计算机动画生成方法
当前研究动态
图形学的杂志和会议
杂志
图形设备
图形输出设备
图形输出包括图形的显示和图形的绘制
图形显示
彩色CRT显示器
CRT(CRT Cathode-Ray Tube,阴极射线管)组成:
工作原理: 荧光物质在高速电子的轰击下会发生电子跃迁(低能态到高能态),高能态很不稳定,返回低能态,发出荧光。
刷新频率
球面显示器与柱面显示器
球面管:**荫罩式结构,**呈略微凸起的球面状;
柱面管:**荫栅式结构,**在水平方向略微凸起,在垂直方向上却是笔直的,呈圆柱状(色彩鲜艳)
LCD(Liquid Crystal Display)显示器
使用液晶:液晶受到电压的影响时,改变物理性质而发生形变,通过它的光的折射角度就会发生变化
LED(Light Emitting Diode)显示器
点亮(不同电压,不同灰度),低电压维持。由细小氖气灯泡矩阵组成,由于氖泡有两种状态:开启、关闭,且状态可保持。高电压
有记忆功能,无需“刷新”、可动态修改图形
图形绘制
打印机【重点】
1️⃣ 针式打印机:依靠打印针击打色带在打印介质上形成色点的组合来实现规定字符和图像(24针)
控制驱动电路:
2️⃣ 喷墨打印机:打印头上的喷口将墨滴按特定的方式喷到打印介质上形成文字或图像, 分为热汽泡式和压电式
3️⃣ 激光打印机:采用电子成像技术,激光束扫描感光 鼓,将墨粉吸附到感光区域,再将墨粉转印到打印介质上,最后通过加热装置将墨粉熔化固定到打印介质上
图形处理器
图形系统结构的重要元件,连接计算机和显示终端的纽带
早期只包含简单的存储器和帧缓冲区,起了图形的存储和传递作用,操作须有CPU来控制
当前不仅存储图形,且能完成大部分图形函数,专业的图形卡已具有很强的3D处理能力,减轻了CPU的负担,提高了显示质量和显示速度
图形输入设备
最常用最基本的计算机输入设备——键盘和鼠标
跟踪球和空间球:根据球在不同方向受到的推或拉的压力来实现定位和选择
数据手套:通过传感器和天线来获得和发送手指的位置和方向的信息
第二章 光栅图形学
基本概念
扫描转换(光栅化):确定最佳逼近图形的像素几何,并用指定属性写像素的过程
区域填充:光栅化过程中确定区域对应的像素集,并用指定的属性或图案显示
裁减:确定一个图形的哪部分在窗口内显示
走样:由于显示器的空间分辨率有限,因像素逼近误差,使所画图形产生畸变(台阶、锯齿)的现象
反走样:减少或消除走样的技术:硬件、软件的方法
隐藏部分:当不透光的物体遮挡了来自某些物体部分的光线,使其无法到达观察者
消隐:把隐藏的部分从图中删除,消除歧义性
直线段的扫描转换算法
直线的扫描转换: 确定最佳逼近于直线的一组象素,且按扫描线顺序,对这些象素进行写操作
数值微分(DDA)法
已知过端点
P
0
(
x
0
,
y
0
)
,
P
1
(
x
1
,
y
1
)
P_0(x_0,y_0),P_1(x_1,y_1)
P0(x0,y0),P1(x1,y1)的直线段L:
y
=
k
x
+
b
y=kx+b
y=kx+b直线斜率为
k
=
y
1
−
y
0
x
1
−
x
0
k=\frac{y_1-y_0}{x_1-x_0}
k=x1−x0y1−y0
从
x
x
x的左端点
x
0
x_0
x0开始,向
x
x
x右端点步进。步长=1(个象素),计算相应的y坐标
y
=
k
x
+
b
y=kx+b
y=kx+b;取象素点(x, round(y)) 作为当前点的坐标
增量算法
在一个迭代算法中,每一步的x、y值是用前一步的值加上一个增量来获得
计
算
y
i
+
1
=
k
x
i
+
1
+
b
=
k
x
i
+
b
+
k
Δ
x
=
y
i
+
k
Δ
x
当
Δ
x
=
1
时
:
y
i
+
1
=
y
i
+
k
计算y_{i+1}=kx_{i+1}+b=kx_i+b+k\Delta x=y_i+k\Delta x\\ 当\Delta x=1时: y_{i+1}=y_i+k
计算yi+1=kxi+1+b=kxi+b+kΔx=yi+kΔx当Δx=1时:yi+1=yi+k
当x每递增1,y递增k(即直线斜率);
void DDALine(int x0,int y0,int x1,int y1,int color) { int x; float dx, dy, y, k; dx= x1-x0, dy=y1-y0; k=dy/dx, y=y0; for (x=x0; x<=x1, x++) {drawpixel (x, int(y+0.5), color); y=y+k; }}
在此算法中,y、k必须是float,且每一步都必须对y进行舍入取整,不利于硬件实现
中点画线法[重点]
将一个加法改为一个整数加法
基本思想
对于理想直线 L ( p 0 ( x 0 , y 0 ) , p 1 ( x 1 , y 1 ) ) L(p_0(x_0,y_0),p_1(x_1,y_1)) L(p0(x0,y0),p1(x1,y1)),采用直线 F ( x , y ) = a x + b y + c = 0 F(x,y)=ax+by+c=0 F(x,y)=ax+by+c=0表示。其中 a = y 0 − y 1 , b = x 1 − x 0 , c = x 0 y 1 − x 1 y 0 a=y_0-y_1, b=x_1-x_0, c=x_0y_1-x_1y_0 a=y0−y1,b=x1−x0,c=x0y1−x1y0
当前象素点为$(x_p, y_p) , 下 一 个 象 素 点 为 ,下一个象素点为 ,下一个象素点为P_1$ 或 P 2 P_2 P2 。设 M = ( x p + 1 , y p + 0.5 ) M=(x_p+1, y_p+0.5) M=(xp+1,yp+0.5)为 P 1 P_1 P1 与 P 2 P_2 P2之中点,Q为理想直线与 x = x p + 1 x=x_p+1 x=xp+1垂线的交点。将Q与M的y坐标进行比较。
构造判别式
$$
d=F(M)=F(x_p+1,y_p+0.5)=a(x_p+1)+b(y_p+0.5)+c\
其中a=y_0-y_1, b=x_1-x_0, c=x_0y_1-x_1y_0
$$
计算量:每一个象素的是四个加法,两个乘法。采用增量算法如下:
🏷 若当前象素处于 d ≥ 0 d\ge0 d≥0情况,则取正右方象素 P 1 ( x p + 1 , y p ) P_1 (x_p+1, y_p) P1(xp+1,yp), 要判下一个象素位置,应计算
$ d_1=F(x_p+2, y_p+0.5)=a(x_p+2)+b(y_p+0.5)=d+a$; 增量为a
🏷 若 d < 0 d<0 d<0时,则取右上方象素 P 2 ( x p + 1 , y p + 1 ) P_2 (x_p+1, y_p+1) P2(xp+1,yp+1)。要判断下一象素,则要计算
$ d_2= F(x_p+2, y_p+1.5)=a(x_p+2)+b(y_p+1.5)+c=d+a+b$;增量为a+b
即
进一步改进,实现整数运算
画线从
(
x
0
,
y
0
)
(x_0, y_0)
(x0,y0)开始,
F
(
x
0
,
y
0
)
=
0
F(x_0,y_0)=0
F(x0,y0)=0 ,d的初值
$$
d_0=F(x_0+1, y_0+0.5)=F(x_0, y_0)+a+0.5b =a+0.5b\
a=y_0-y_1, b=x_1-x_0
$$
可以用2d代替d来摆脱小数,提高效率。
令 d 0 = 2 a + b , d 1 = 2 a , d 2 = 2 a + 2 b d_0=2a+b, d_1=2a, d_2=2a+2b d0=2a+b,d1=2a,d2=2a+2b,我们有如下算法 。
void Midpoint Line (int x0, int y0, int x1, int y1, int color) { int a, b, d1, d2, d, x, y; a = y0 - y1, b = x1 - x0, d = 2 * a + b; d1 = 2 * a, d2 = 2 * (a + b); x = x0, y = y0; drawpixel(x, y, color); while (x < x1) { if (d < 0) { x++, y++, d += d2;//取右上方 } else { x++, d += d1;//取右方 } drawpixel (x, y, color); } /* while */} /* mid PointLine */
🏷 d只影响判断取哪一个点,并不影响坐标本身的值,所以乘上2不影响直线

Bresenham算法[重点 很有可能会考]
基本思想
–DDA算法采用点斜式,中点法采用隐式表示。
–中点法可以有整数算法。还有其它整数算法吗?
–过各行各列象素中心构造虚拟网格线:按直线从起点到终点顺序计算直线与各垂直网格线的交点,根据误差项符号确定该列象素中与此交点最近的象素
设直线方程为 y = k x + b 则 有 y i + 1 = y i + k ( x i + 1 − x i ) = y i + k y=kx+b\ 则有y_{i+1}=y_i+k(x_{i+1}-x_i)=y_i+k y=kx+b 则有yi+1=yi+k(xi+1−xi)=yi+k,其中k=dy/dx。 因为直线的起始点在象素中心,所以误差项d的初值 d 0 = 0 d_0=0 d0=0
X下标每增加1,d的值相应递增直线的斜率值k,即d=d+k。一旦d≥0.5,就把它减去1
为方便计算,令e=d-0.5,e的初值为-0.5,增量为k。
void Bresenhamline (int x0, int y0, int x1, int y1, int color) { int x, y, dx, dy; float k, e; dx = x1 - x0, dy = y1 - y0, k = dy / dx; e = -0.5, x = x0, y = y0; for (i = 0; i <= dx; i++) { drawpixel (x, y, color); x = x + 1,e = e + k; if (e >= 0) { y++, e = e - 1; } }}

可以改用整数以避免除法。由于算法中只用到误差项的符号,因此可作如下替换 e ′ = 2 × e × d x e'=2\times e\times dx e′=2×e×dx, e的初值为-0.5
void Bresenhamline (int x0, int y0, int x1, int y1, int color) { int x, y, dx, dy; float k, e; dx = x1 - x0, dy = y1 - y0, e = -dx; x = x0, y = y0; for (i = 0; i <= dx; i++) { drawpixel (x, y, color); x = x++,e = e + 2 * dy; if (e ? 0) { y++, e = e - 2 * dx; } }}
总结
🏷 DDA方法:根据直线方程 X→Y;
🏷 其它两种的原理:0<K<1时,下一像素只可能是当前像素的右点或右上点
🏷 如何决定取右点或右上点?构造判别式(二者区别)
圆弧的扫描转换算法
圆的特征:八对称性。只要扫描转换八分之一圆弧,就可以求出整个圆弧的象素集
void CirclePoints(int x, int y, int color) { drawpixel(x, y, color); drawpixel(y, x, color); drawpixel(-x, y, color); drawpixel(-y, x, color); drawpixel(x, -y, color); drawpixel(y, -x, color); drawpixel(-x, -y, color); drawpixel(-y, -x, color);}
以圆心在原点、半径R为整数的圆为例,讨论圆的生成算法。假设圆的方程为:$ X^2 + Y^2 = R^2$
圆弧扫描算法
Y = ± R 2 − X 2 Y=\pm \sqrt{R^2-X^2} Y=±R2−X2
在一定范围内,每给定 X值,可得一Y值

角度DDA法
$$
x_n+1 =x_n + dx\qquad y_n+1 =y_n + dy\
x = x_0 + Rcos\theta\qquad y = y0 + Rsin\theta\
dx =- Rsin\theta d\theta\qquad dy = Rcos\theta d\theta\
x_{n+1} = x_n + dx = x_n - Rsin\theta d\theta =x_n - (y_n - y_0 )d\theta\
y_{n+1} = y_n + dy = y_n + Rcos\theta d\theta =y_n + (x_n - x_0 )d\theta\
$$
确定x,y的初值及dq值后,即可以增量方式获得圆周上的坐标,然后取整可得象素坐标。
但要采用浮点运算、乘法运算、取整运算。
中点画圆法
考虑中心在原点,半径为R的第二个8分圆,构造函数 F ( x , y ) = x 2 + y 2 − R 2 F(x,y)=x^2+y^2-R^2 F(x,y)=x2+y2−R2
构造判别式(圆方程)
d
=
F
(
M
)
=
F
(
x
p
+
1
,
y
p
−
0.5
)
=
(
x
p
+
1
)
2
+
(
y
p
−
0.5
)
2
−
R
2
d=F(M)=F(x_p+1,y_p-0.5)=(x_p+1)^2+(y_p-0.5)^2-R ^2
d=F(M)=F(xp+1,yp−0.5)=(xp+1)2+(yp−0.5)2−R2
若 d<0, 则取P1为下一象素,而且再下一象素的判别式为
d
1
=
F
(
P
1
)
=
F
(
x
p
+
2
,
y
p
−
0.5
)
=
(
x
p
+
2
)
2
+
(
y
p
−
0.5
)
2
−
R
2
=
d
+
2
x
p
+
3
d_1=F(P_1)=F(x_p+2,y_p-0.5)=(x_p+2)^2+(y_p-0.5)^2-R ^2=d+2x_p+3
d1=F(P1)=F(xp+2,yp−0.5)=(xp+2)2+(yp−0.5)2−R2=d+2xp+3
若d>=0, 则应取P2为下一象素,而且下一象素的判别式为
d
2
=
F
(
P
2
)
=
F
(
x
p
+
2
,
y
p
−
1.5
)
=
(
x
p
+
2
)
2
+
(
y
p
−
0.5
)
2
−
R
2
=
d
+
2
(
x
p
−
y
p
)
+
5
d_2=F(P_2)=F(x_p+2,y_p-1.5)=(x_p+2)^2+(y_p-0.5)^2-R ^2=d+2(x_p-y_p)+5
d2=F(P2)=F(xp+2,yp−1.5)=(xp+2)2+(yp−0.5)2−R2=d+2(xp−yp)+5
第一个象素是(0,R),判别式d的初始值为
d
0
=
F
(
1
,
R
−
0.5
)
=
1.25
−
R
d_0=F(1,R-0.5)=1.25-R
d0=F(1,R−0.5)=1.25−R
优化过程
🏷 有浮点数,用e=d-0.25代替:
🏷 初始值: d 0 = 1.25 – R 对 应 于 e 0 = 1 − R d_0=1.25–R 对应于e_0=1-R d0=1.25–R对应于e0=1−R
🏷 判别式:d<0对应于e<-0.25(因为e的初值e0为整数,运算过程中的增量 2 ( x p − y p ) + 5 或 2 x p + 3 2(x_p-y_p)+5或2x_p+3 2(xp−yp)+5或2xp+3也为整数,故e始终为整数,所以e<-0.25 等价于e<0
经优化,程序不存在浮点数
void MidPointCircle(int r, int color) { int x, y, d; x = 0; y = r; e = 1 - r; // 初值e=1-r Circlepoints (x, y, color); // 画八分对称性的其他点 while (x <= y) { // 画到直线x=y结束 if (e < 0) e += 2 * x + 3; // 取右侧点 else { e += 2 * (x - y) + 5; // 取右下点 y--; } x++; Circlepoints (x, y, color); // 画八分对称性的其他点 }}

多边形的扫描转换与区域填充
多边形两种重要的表示方法:
点阵表示:用位于多边形内部的像素几何刻画
多边形的扫描转换:把多边形的顶点表示转换为点阵表示
出于简化的目的,这里讨论的多边形都是凸多边形
扫描线算法【需要完全掌握】
基本思想
按扫描线顺序,计算扫描线与多边形的相交区间,再用要求的颜色显示这些区间的象素,即完成填充工作
对于一条扫描线填充过程可以分为四个步骤:求交、排序、配对、填色
数据结构【要掌握】
🏷 活性边表(AET):把与当前扫描线相交的边称为活性边,并把它们按与扫描线交点x坐标递增的顺序存放在一个链表中,结点内容
🏷 新边表(NET):需为每条扫描线建立一个新边表,存放在该扫描线第一次出现的边。若某边的较低端点为ymin,则该边就放在扫描线ymin的新边表中:
假定当前扫描线与多边形某一条边的交点的X坐标为x,则下一条扫描线与该边的交点不要重计算,只要加一个增量△x。
设该边的直线方程为:ax+by+c=0; Δ x = − b a \Delta x=\frac{-b}{a} Δx=a−b
交点的取舍
1️⃣ 如扫描线与多边形相交的边分别处于扫描线的两侧,则计一个交点,如P5 , P6。
2️⃣ 如扫描线与多边形相交的边分处扫描线同侧,且yi<yi+1, yi<yi-1,则计两个交点,如P2 ;如yi>yi+1, yi>yi-1,则计0个交点,如P1
3️⃣ 如扫描线与多边形边界重合,则计一个交点,如边P3P4。
只需检查顶点的两条边的另外两个端点的y值。按这两个y值中大于交点y值的个数是0,1,2来决定。
算法过程
1️⃣创建新边表NET;
2️⃣ 把新边表NET[i]中的边结点,用插入排序法插入活性边表
AET,使之按X坐标递增顺序排序;
3️⃣ 遍历AET表,把配对交点之间的区间(左闭右开)上的各象素(X,Y),用drawpixel(x,y,color)改写象素颜色值;
4️⃣ 遍历AET表,把Ymax=i的结点从AET表中删除,并把Ymax>i 的结点的X值递增△X;
5️⃣ 重复各扫描线。
示例
点按照逆时针来构成边
优点:
缺点:
边界标志算法【了解】
基本思想
–帧缓冲器中对多边形的每条边进行直线扫描转换,亦即对多边形边界所经过的象素打上标志,然后再采用和扫描线算法类似的方法将位于多边形内的各个区段着上所需颜色
实现步骤
1️⃣ 扫描线依从左到右顺序访问该扫描线上的像素
2️⃣ 使用一个布尔量inside来指示当前点是否在多边形内的状态:初值为假,访问到边界像素时,取反
3️⃣ 对于被访问的像素,如inside为真,则填充颜色
void edgemark_fill(polydef, color)多边形定义 polydef; int color;{ 对多边形polydef每条边进行直线扫描转换; inside = FALSE; for (每条与多边形polydef相交的扫描线y ) for (扫描线上每个象素x ) { if (象素 x 被打上边标志) inside = ! (inside); if (inside! = FALSE) drawpixel (x, y, color); else drawpixel (x, y, background); }}
–用软件实现时,扫描线算法与边界标志算法的执行速度几乎相同
–由于边界标志算法不必建立维护边表以及对它进行排序,所更适合硬件实现,其执行速度比有序边表算法快一至两个数量级
区域填充算法【了解】
区域:已表示成点阵形式的填充图形,象素集
区域可采用两种表示形式:
1️⃣ 内点表示
2️⃣ 边界表示
区域填充:先将区域的一点赋予指定的颜色,然后将该颜色扩展到整个区域的过程
区域填充算法要求区域是连通的
4连通:两个像素点是上下或左右相连
8连通:两个像素点是上下或左右相连的,或者是对角线方向相连的
默认是四连通
种子填充算法
种子填充算法:设G为一内点表示的区域,(x,y)为区域内一点,old_color为G的原色。现取(x,y)为种子点对区域G进行填充:种子象素入栈,当栈非空时,执行如下三步操作:
1️⃣ 栈顶象素出栈
2️⃣ 将出栈象素置成new_color
3️⃣ 按右、上、左、下的顺序检查与出栈象素相邻的四个象素,若其中某个象素在边界内且未置成new_color ,则把该象素入栈
同一个像素可能入栈多次
解决方法:扫描线填充算法:一次填充种子所在行;适用于边界表示的4连通区域
扫描线算法
–首先填充种子点所在扫描线上的位于给定区域的一个区段
–然后确定与这一区段相连通的上、下两条扫描线上位于给定区域内的区段,并依次保存下来
–反复这个过程,直到填充结束
字符
字符:指数字、字母、汉字等符号
字库:为了在显示器等输出设备上输出字符,系统中必须装备有相应的字库
矢量型和点阵型
点阵字符
每个字符由一个位图表示,用矩阵(字符掩膜)表示
显示:从字库中将它的位图检索出来;将检索到的位图写到帧缓冲器中
字库的存储空间十分庞大,压缩技术:轮廓字形法
采用直线或Bezier曲线的集合描述字符的轮廓线,形成封闭的平面区域,外加控制信息构成字符的压缩数据
压缩比大,且能保证字符质量
矢量字符
矢量字符记录字符的笔画信息,具有存储空间小,美观、变换方便等优点
只需对其几何图素进行变换即可实现字符的旋转、放大、缩小等几何变换
显示:从字库中检索字符信息;取出端点坐标,对其进行适当的几何变换,再显示字符
裁剪
用计算机处理图形信息时,计算机内部存储的图形往往比较大,而屏幕显示的只是一部分。
裁剪:确定图形中哪些部分落在**显示区(剪裁窗口)**之内,以便只显示落在显示区内的那部分图形
先裁剪再扫描
分类:直线段裁,多边形裁剪。
•图形裁剪中最基本的问题:
–假设窗口为矩形,其左下角坐标为
(
x
L
,
y
B
)
(x_L,y_B)
(xL,yB),右上角坐标为
(
x
R
,
y
T
)
(x_R,y_T)
(xR,yT),对于给定点P(x,y),则P点在窗口内的条件是要满足下列不等式:
x
L
≤
x
≤
x
R
且
y
B
≤
y
≤
y
T
xL\le x\le xR\ 且\ yB\le y \le yT
xL≤x≤xR 且 yB≤y≤yT
否则,P点就在窗口外。

直线段裁剪
直接求交算法
直线与窗口边都写成参数形式,求参数值
将线段P0P1和矩形窗口的下边写成参数形式
P0P1与窗口的下边的交点满足
–求解得到交点对应参数对 ( t l i n e , t e d g e ) (t_{line,}t_{edge}) (tline,tedge),只有当它们落在[0,1]区间, ( t l i n e , t e d g e ) (t_{line,}t_{edge}) (tline,tedge)对应交点有效。
•裁剪线段与窗口的关系: 线段完全可见、显然不可见、其它
Cohen-Sutherland裁剪
基本思想
对于每条线段P1P2分为三种情况处理:
1️⃣ 若P1P2完全在窗口内,则显示该线段P1P2简称“取”之;
2️⃣ 若P1P2明显在窗口外,则丢弃该线段,简称“弃”之;
3️⃣ 若线段不满足“取”或 “弃”的条件,则在交点处把线段分为两段。其中一段完全在窗口外,可弃之。然后对另一段重复上述处理。
为快速判断,采用如下编码方法:

法则
1️⃣ 若P1P2完全在窗口内code1=0,且code2=0,则“取”;
2️⃣ 若P1P2明显在窗口外code1&code2≠0,则“弃” ;(按位取与)
3️⃣ 在交点处把线段分为两段。其中一段完全在窗口外,可弃之。然后对另一段重复上述处理
•如何判定应该与窗口的哪条边求交呢:编码中对应位为1的边.上下右左
if (LEFT & code != 0) { x = XL; y = y1 + (y2 - y1) * (XL - x1) / (x2 - x1);} else if (RIGHT & code != 0) { x = XR; y = y1 + (y2 - y1) * (XR - x1) / (x2 - x1);} else if (BOTTOM & code != 0) { y = YB; x = x1 + (x2 - x1) * (YB - y1) / (y2 - y1);} else if (TOP & code != 0) { y = YT; x = x1 + (x2 - x1) * (YT - y1) / (y2 - y1);}
特点:用编码方法可快速判断线段–完全可见和显然不可见。
特别适用二种场合:
•最坏情形,线段求交四次,
优点
缺点
中点分割裁剪算法
对线段端点进行编码,并把线段与窗口的关系分为:
–从P0点出发找出离P0最近的可见点,从P1点出发找出离P1最近可见点:两个可见点的连线就是原线段的可见部分。
二分寻找最近点
算法特点
梁友栋-Barsky算法
特点
Nicholls-Lee-Nicholl算法[考试不作要求]
通过在剪裁窗口周围创建多个区域,在求交点之前进行更多的区域测试,从而减少求交计算。
算法步骤
1️⃣ 从P1点向窗口的四个顶角点发出射线,这四条射线和窗口的四条边所在的直线一起将二维平面划分为更多的小区域;
2️⃣ 确定P2相对于的P1位置;
3️⃣ 计算直线段P1P2和窗口边界的交点

•端点与裁剪窗口的关系:
–端点P1相对于裁剪窗口有九个可能的区域位置,只需考虑其中三个区域,其它几个区域可以利用简单变换其变换到所考虑的三个区域中的任一个中。
总结
1️⃣ 直接求交法原理简单,效率低;
2️⃣ Cohen-Sutherland与中点法在区域码测试阶段能以位运算方式高效率地进行,因而当大多数线段能够简单的取舍时,效率较好。中点分割线法适合于用硬件实现;
3️⃣ 梁友栋—Barskey算法只能应用于矩形窗口的情形,但其效率比前两者要高,这是因为运算只涉及到参数,仅到必要时才进行坐标计算;
4️⃣ Nicholl-Lee-Nicholl算法仅适用于二维裁减。
多边形裁剪
多边形裁剪的解,不是它每条边裁剪的解的叠加
逐边裁剪算法
分割处理策略
流水线过程(左上右下)
基本思想
一次用窗口的一条边裁剪多边形。
窗口的一条边以及延长线构成的裁剪线把平面分成两个部分:可见一侧(包含裁减窗口的一侧);不可见一侧(不包含裁减窗口的一侧)。
多边形的各条边的两端点S、P。它们与裁剪线的位置关系只有四种[四个规则要记清楚]
1️⃣ 情况(1)仅输出顶点P;
2️⃣ 情况(2)输出0个顶点;
3️⃣ 情况(3)输出线段SP与裁剪线的交点I;
4️⃣ 情况(4)输出线段SP与裁剪线的交点I和终点P。
字符裁剪【填空题】
字符裁剪问题:字符和文本部分在窗内、部分在窗外时而出现的问题。
反走样【重点】
在光栅显示器上显示图形时,直线段或图形边界或多或少会呈锯齿状:
–图形信号是连续的,而在光栅显示系统中,采用离散的象素表示图形;
走样:用离散量表示连续量引起的失真现象
–阶梯状边界;
–图形细节失真;
狭小图形遗失:动画序列中时隐时现,产生闪烁
反走样:在图形显示过程中,用于减少或消除走样现象的方法或技术
反走样几种方法
提高分辨率
假如把显示器分辨率(水平、垂直)提高一倍
帧缓存容量则增加到原来的4倍,而扫描转换同样大小的图形却要花4倍时间
方法简单,但代价非常大,不经济
区域采样
改变直线段模型
方法步骤:
直线段对一个像素亮度的贡献:
缺点
加权区域取样
相交区域对象素亮度的贡献依赖于该区域与象素中心的距离。
权函数可以取高斯函数(左)或恒等函数(右)
1️⃣ 高斯函数
2️⃣ 取恒等函数时,加权区域采样方法退化为非加权区域采样方法

可采用离散计算方法
半色调技术
简单和加权区域取样技术的前提是多级灰度,利用多级灰度来提高视觉分辨率
❓ 如果只有两级灰度
对于给定的分辨率,通过将几个像素组合成一个单元来获得多级灰度;
例:在一个显示器中将四个像素组成一个单元,可产生5种光强。
用如下矩阵来表示
它表示黑色像素填入2´2个位置中的次序,每一级灰度再添上一个黑色像素就得到下一级灰度
以牺牲空间分辨率为代价的
消隐
基本概念
投影变换失去了深度信息,往往导致图形的二义性
消隐:为了消除二义性,必须在绘制时消除被遮挡的不可见的线或面,习惯上称作消除隐藏线和隐藏面;
经过消隐得到的投影图称为物体的真实图形。
消隐的对象是三维物体。三维体的表示主要有边界表示和构造实体几何表示等。
最简单的方法:用表面上的平面多边形表示。
消隐结果与观察物体有关,也与视点有关。
几个假设
1️⃣ 投影平面是oxy平面;
2️⃣ 投影方向为负z轴方向的平行投影;
3️⃣ 不能处理相互贯穿或循环遮挡的物体,此时应做特殊处理。
在实时模拟过程中,要求消隐算法速度快,通常生成的图形质量一般;
在真实感图形生成过程中,要生成高质量的图形,通常消隐算法速度较慢。
消隐算法的权衡:消隐效率、图形质量。
与消隐与密切相关的因素
提高消隐算法效率的常见方法
利用连贯性、包围盒技术、背面剔除、空间分割技术、物体分层表示
利用连贯性
利用连贯性:相邻事物的属性之间有一定的连贯性,其属性值通常是平缓过渡的,如颜色值、空间位置关系等
包围盒技术
一个形体的包围盒指的是包围它的简单形体
常用包围盒:长方体、球、圆柱

背面剔除
外法向:规定每个多边形的外法向都是指向物体外部的。
前向面:若多边形的外法向与投影方向(观察方向)的夹角为钝角(V· N<0),称为前向面。
后向面:若多边形的外法向与投影方向(观察方向)的夹角为锐角(V· N>0),称为后向面(背面)。
后向面总是看不见的,不会由于后向面的遮挡,而使别的棱成为不可见的。因此计算时,可以把这些后向面全部去掉,这并不影响消隐结果。
空间分割技术
将投影平面上的窗口分成若干小区域;为每个小区域建立相关物体表,表中物体的投影于该区域有相交部分;则在小区域中判断那个物体可见时,只要对该区域的相关物体表中的物体进行比较即可
物体分层表示
减少场景中物体的个数,降低算法复杂度
消隐的分类
按消隐对象和输出结果分类

根据消隐空间分类
1️⃣ 物体空间的消隐算法:以场景中的物体为处理单元;
for (场景中的每一个物体){ 将其与场景中的其它物体比较,确定其表面的可见部分; 显示该物体表面的可见部分;}
假设场景中有k个物体,平均每个物体表面由h个多边形构成,显示区域中有m*n个像素,则算法的复杂度为:O((kh)*(kh))
2️⃣ 图像空间的消隐算法:以窗口内的每个像素为处理单元;
for(窗口内的每一个像素){ 确定距视点最近的物体,以该物体表面的颜色来显示像素}
假设场景中有k个物体,平均每个物体表面由h个多边形构成,显示区域中有m*n个像素,则算法的复杂度为:O(mnkh)
•实际应用中通常会考虑画面的连贯性,所以图像空间算法的效率有可能更高。
3️⃣ 物体空间和图像空间的消隐算法:在物体空间中预先计算面的可见性优先级,再在图像空间中生成消隐图;
消除隐藏线
对造型的要求
坐标变换
最基本的运算
算法
1️⃣ 若线段的两端点及视点在给定平面的同侧,线段不被给定平面遮挡,转(7);
2️⃣ 若线段的投影与平面投影的包围盒无交,线段不被给定平面遮挡,转(7);
3️⃣ 求直线与相应无穷平面的交:
4️⃣ 求所剩线段的投影与平面边界投影的所有交点。若无交点,转(7)。
5️⃣ 以上所求得的各交点将线段的投影分成若干段,求出第一段中点。
6️⃣ 若第一段中点在平面的投影内,则相应的段被遮挡,否则不被遮挡;其他段的遮挡关系可依次交替取值进行判断。
7️⃣ 结束。
假设E为面F的一条边, 需判别F以外每一个面与E的遮挡关系。
假设消隐对象有n条边和m个面,当n和m很大时,两两求交的消隐方法工作量很大:
消除隐藏面(不太好出考题)
画家算法
列表优先算法:画家的作画顺序暗示出所画物体之间的相互遮挡关系。
基本思想
多边形排序算法
优点:简单(如何对场景中的物体按深度排序)。
缺点:只能处理互不相交的面,且深度优先级表中面的顺序可能出错
Z缓冲区算法
组成
算法思想
1️⃣ 将 Z 缓冲器中个单元的初始值置为最小值。
2️⃣ 多边形投影时,当要改变某个像素的颜色值时,首先检查当前多边形的深度值是否大于该像素原来的深度值:
Z-Buffer算法(){ 帧缓存全置为背景色 深度缓存全置为最小Z值 for(每一个多边形) { 扫描转换该多边形 for(该多边形所覆盖的每个象素(x,y) ) { 计算该多边形在该象素的深度值Z(x,y); if(Z(x,y)大于Z缓存在(x,y)的值) { 把Z(x,y)存入Z缓存中(x,y)处 把多边形在(x,y)处的颜色值存入帧缓存的(x,y)处 } } } }
需要计算的像素深度值次数 =多边形个数*多边形平均占据的像素个数
所有图像空间算法中最简单的一种隐藏面消除算法
优点:
缺点:
只用一个深度缓存变量zb的改进算法:需要开一个与图象大小相等的缓存数组ZB
{ 帧缓存全置为背景色 for (屏幕上的每个象素(i, j)) { 深度缓存变量zb置最小值MinValue for (多面体上的每个多边形Pk) { if (象素点(i, j)在Pk的投影多边形之内) { 计算Pk在(i, j)处的深度值depth; if (depth大于zb) { zb = depth; indexp = k; } } } if (zb != MinValue) 在交点 (i, j) 处用多边形Pindexp的颜色显示 }}
先像素后多边形
关键问题
1️⃣ 计算多边形 在点(i,j)处的深度。设多边形的平面方程为:
2️⃣ 判断象素点(i,j)是否在 的投影多边形之内(点与多边形的包含性检测)
射线法
由被测点P处向 y = - ¥方向作射线
弧长法(单位圆)
–以被测点为圆心作单位圆,计算其在单位圆上弧长的代数和
弧长累加方法:以顶点符号为基础。
注意:当边的终点Pi+1在起点Pi的相对象限时,弧长变化可能增加或减少p:
扫描线Z-buffer算法[了解就行]
Z 缓冲器算法中所需要的Z 缓冲器容量较大,可以将整个绘图区域分割成若干个小区域,然后一个区域一个区域地显示,以减少Z 缓冲器的单元数;
如果将小区域取成屏幕上的扫描线,就得到扫描线 Z 缓冲器算法。
算法思想
改进
水平方向:当沿扫描线x递增一个像素时,多边形所在平面在z坐标的增量,对方程ax+by+cz+d=0来说, Δ z a = − a / c \Delta z_a=-a/c Δza=−a/c
竖直方向
Δ z b \Delta z_b Δzb :当沿扫描线y递增一个像素时,多边形所在平面 z坐标的增量, Δ z b = − b / c \Delta z_b=-b/c Δzb=−b/c
下一条扫描线与边对左侧边交点处的深度值: z 1 = z 1 + Δ x 1 Δ z a + Δ z b z_1=z_1+\Delta x_1 \Delta z_a+\Delta z_b z1=z1+Δx1Δza+Δzb
数据结构
扫描线Z - buffer算法() { 建多边形y表;根据多边形顶点最小y值,将多边形置入多边形y表。 活化多边形表APT,活化边对表AET初始化为空。 For(每条扫描线i,i从小到大) { 1. 帧缓存CB置为背景色。 2. 深度缓存ZB (一维数组) 置为负无穷大。 3. 将对应扫描线i的,多边形Y表中的多边形加入到活化多边形表APT中。 4. 对新加入的多边形,生成其相应的边表。 5. 对APT中每一个多边形,若其边表中对应扫描线i增加了新的边,将新的边配对,加到活化边对表AET中。 6. 对AET中的每一对边: 6.1 对xl < j < xr 的每一个象素,按增量公式z = z + ? za计算各点depth 。 6.2 与ZB中的量比较,depth > ZB(j), 则令ZB(j) = depth,并确定颜色 值,写帧缓存。 7. 删除APT中多边形顶点最大y坐标为i的多边形,并删除相应的边。 8. 对AET中的每一个边对,作如下处理: 8.1 删除ylmax或yrmax 已等于i的边。若一边对中只删除了其中一边, 对该多边形的边重新配对。 8.2 用增量公式计算新的xl 、 xr 和zl }}
缺点
在每一个被多边形覆盖像素处需要计算深度值;
被多个多边形覆盖的像素需要多次计算深度值。
对比
缺点:
改进
在一条扫描线上,每个区间只计算一次深度,即区间扫描线算法,又称扫描线算法
区间扫描线算法
基本思想
把当前扫描线与各多边形在投影平面的投影的交点进行排序后,使扫描线分为若干子区间。只要在区间任一点处找出在该处z值最大的一个面,这个区间上的每一个象素就用这个面的颜色来显示。
注意:该算法要求多边形不能相互贯穿,否则在同一区间上,多边形深度值的次序会发生变化。
如何确定小区间的颜色可分为三种情况
类似于扫描线Z-Buffer算法中的数据结构
❓ 如何知道每一个区间中,有几个相关的多边形?是哪几个?
🏷 解决方案:活化多边形表中增加一个标志,flag=0, 每遇到它的边,flag取反。
for (绘图窗口内的每一条扫描线){ 求投影与当前扫描线相交的所有多边形 求上述多边形中投影与当前扫描线相交的所有边,将它们记录在活化边表AEL中 求AEL中每条边的投影与扫描线的交点; 按交点的u坐标将AEL中各边从左到右排序, 两两配对组成一个区间; for (AEL中每个区间) { 求覆盖该区间的所有多边形,将它们记入活化多边形表APL中; 在区间上任取一点,计算APL中各多边形在该点的深度值,记深度最大者为P; 用多边形P的颜色填充该区间 }}
算法的优点:将逐点(象素、Pixel)计算改为逐段计算,效率大大提高!
区域子分割算法
基本思想
首先将场景中的多边形投影到绘图窗口内,判断窗口是否足够简单,若是则算法结束;否则将窗口进一步分为四块。对此四个小窗口重复上述过程,直到窗口仅为一个像素大小。此时可能有多个多边形覆盖了该像素,计算它们的深度值,以最近的颜色显示该像素即可。
何谓窗口足够简单
窗口为空,即多边形与窗口的关系是分离的;
窗口内仅含一个多边形,即有一个多边形与窗口的关系是包含或相交。此时先对多边形投影进行裁剪,再对裁剪结果进行填充;
有一个多边形的投影包围了窗口,并且它是最靠近观察点的,以该多边形颜色填充窗口。
•分离和包围多边形的判别方法:射线检查法;转角累计检查法;区域检查法(考试不考)
光线投射算法
基本思想:
1️⃣ 考察由视点出发穿过观察屏幕一象素而射入场景的一条射线,则可确定出场景中与该射线相交的物体;
2️⃣ 在计算出光线与物体表面的交点之后,离象素最近的交点的所在面片的颜色为该象素的颜色;
3️⃣ 如果没有交点,说明没有多边形的投影覆盖此象素,用背景色显示它即可。
for屏幕上的每一象素 {形成通过该屏幕象素(u,v)的射线; for 场景中的每个物体 {将射线与该物体求交; if 存在交点 以最近的交点所属的颜色显示象素(u,v) else 以背景色显示象素(u,v) } }
光线投射算法与Z缓冲器算法相比,它们仅仅是内外循环颠倒了一下顺序,算法复杂度类似
几何造型技术
描述物体的三维模型: 线框模型、曲面模型、实体模型。
第三章——参数曲线和曲面
曲线曲面参数表示
非参数表示
显式表示:y=f(x),无法表示封闭或多值曲线,如圆。
隐式表示:f(x,y)=0,易于判断函数值与零的关系,确定点与曲线的关系。
存在下述问题:
参数表示
参数表示:曲线上任一点的坐标均表示成给定参数的函数。假定用t表示参数
平面曲线上任一点P: P ( t ) = [ x ( t ) , y ( t ) ] P(t)=[x(t),y(t)] P(t)=[x(t),y(t)]
空间曲线上任一三维点P: P ( t ) = [ x ( t ) , y ( t ) , z ( t ) ] P(t)=[x(t),y(t),z(t)] P(t)=[x(t),y(t),z(t)]
参数表示例子:
参数表示的优点:
曲线的基本概念
1️⃣ 三维曲线
用参数表示的三维曲线是一个有界的点集,可以表示成一个带参数的、连续的和单值的数学函数:
{
x
=
x
(
t
)
y
=
y
(
t
)
,
0
≤
t
≤
1
z
=
z
(
t
)
\left\{ \begin{array}{lc} x=x(t) \\ y=y(t),\quad 0\le t\le 1\\ z=z(t) \end{array} \right.
⎩⎨⎧x=x(t)y=y(t),0≤t≤1z=z(t)
2️⃣ 位置矢量
曲线上任一点的位置矢量可表示为: P ( t ) = [ x ( t ) , y ( t ) , z ( t ) ] P(t)=[x(t),y(t),z(t)] P(t)=[x(t),y(t),z(t)]
如存在k阶导数矢量,则: P k ( t ) = d k P d t k P^k(t)=\frac{d^kP}{dt^k} Pk(t)=dtkdkP
3️⃣ 切矢量
选择弧长s作为参数,则 $T=\frac{dP}{ds}=\underset{\Delta s \to0}{\lim}\frac{\Delta P}{\Delta s} $ 是单位切矢量
根据弧长微分公式有:
于是有 d P d s = d P d t . d t d s = P ′ ( t ) ∣ P ′ ( t ) ∣ \frac{dP}{ds}=\frac{dP}{dt}.\frac{dt}{ds}=\frac{P'(t)}{|P'(t)|} dsdP=dtdP.dsdt=∣P′(t)∣P′(t)
即T 为单位矢量
4️⃣ 法矢量
所有垂直于切矢量T 的矢量有一束,且位于法平面上
d T d s \frac{dT}{ds} dsdT是与T垂直的矢量;与 d T d s \frac{dT}{ds} dsdT平行的法矢称为曲线在该点的主法矢(N)
矢量积 B = T × N B=T\times N B=T×N 是第三个单位矢量,它垂直于T和N。把平行于矢量B的法矢称为曲线的副法矢量;
可以推导出:
T(切矢)、N(主法矢)和B(副法矢)构成了曲线上的活动坐标架;
N、B构成的平面称为法平面,N、T构成的平面称为密切平面,B、T构成的平面称为从切平面。
5️⃣ 曲率和挠率
圆的半径越小,曲率越大
插值、拟合和光顺(掌握概念)
1️⃣ 插值: 给定一组有序的数据点Pi构造一条曲线顺序通过这些数据点,所构造的曲线称为插值曲线。
2️⃣ 拟合:构造一条曲线使之在某种意义下最接近给定的数据点,所构造的曲线为拟合曲线。
3️⃣ 逼近:在计算数学中,逼近通常指用一些性质较好的函数近似表示一些性质不好的函数。在计算机图形学中,逼近继承了这方面的含义
4️⃣ **过拟合:**模型在训练集上效果很好,在测试集上效果差(不考)
5️⃣ 光顺(Fairing):指曲线的拐点不能太多。对平面曲线而言,相对光顺的条件是:
参数化
概念
过三点P0、P1和P2构造参数表示的插值多项式可以有无数条:
对于一条插值曲线,型值点 P 0 , P 1 , . . . , P n P_0,P_1,...,P_n P0,P1,...,Pn与其参数域 t ∈ [ t 0 , t n ] t\in[t_0,t_n] t∈[t0,tn]内的节点之间有一种对应关系:
对于一组有序的型值点,所确定一种参数分割,称之为这组型值点的参数化。
参数化常用方法
1️⃣ 均匀参数化(等距参数化);
节点在参数轴上呈等距分布, t i + 1 = t i + 正 常 数 t_{i+1}=t_i+正常数 ti+1=ti+正常数。
2️⃣ 累加弦长参数化;
$$
\left{
\begin{array}{lc}
t_0=0 \
t_i=t_{i-1}+|\Delta P_{i-1}|,\ i=1,2,…,n,\
\end{array}
\right.
\qquad \Delta P_i=P_{i+1}-P_i
$$
反映型值点按弦长的分布情况;
能克服均匀参数化所出现的问题。
3️⃣ 向心参数化法;
4️⃣ 修正弦长参数化法。
参数区间的规格化
我们通常将参数区间
[
t
0
,
t
n
]
[t_0,t_n]
[t0,tn]规格化为[0,1],
[
t
0
,
t
n
]
≠
[
0
,
1
]
[t_0,t_n]\not = [0,1]
[t0,tn]=[0,1],只需对参数化区间作如下处理:
t
0
=
0
,
t
i
=
t
i
t
n
,
i
=
0
,
1
,
.
.
.
,
n
t_0=0,\ t_i=\frac{t_i}{t_n},\ i=0,1,...,n
t0=0, ti=tnti, i=0,1,...,n
参数曲线的代数和几何形式(了解一下)
以三次参数曲线为例,讨论参数曲线的代数和几何形式
代数形式
上述代数式写成矢量式是
几何形式
对三次参数曲线,可用其端点位矢P(0)、P(1)和切矢P¢(0)、P‘(1)描述。
将P(0)、P(1)、P’(0)和P‘(1)简记为P0、P1、P‘0和P’1,代入
,得
令
简化为
上式是三次Hermite(Ferguson)曲线的几何形式
参数 F 0 , F 1 F_0,F_1 F0,F1专门控制端点的函数值对曲线的影响;
参数 G 0 , G 1 G_0,G_1 G0,G1专门控制端点的一阶导数值对曲线的影响。
连续性
设计制造时,组合多段曲线,因此需要解决曲线段之间的光滑连接问题。
曲线间连接的光滑度的度量(会考概念)
同阶参数连续性的要求比几何连续性高
引进几何连续的重要性
🏷 举例
举例说明
对于参数 t ∈ [ 0 , 1 ] t\in [0,1] t∈[0,1]的两条曲线P(t)和Q(t)
1️⃣ 若要求在结合处达到 C 0 C^0 C0连续或 G 0 G^0 G0连续,即两曲线在结合处位置连续: P ( 1 ) = Q ( 0 ) P(1)=Q(0) P(1)=Q(0)
2️⃣ 若要求在结合处达到
G
1
G^1
G1连续,就是说两条曲线在结合处在满足
G
0
G^0
G0连续的条件下,并有公共的切矢
Q
′
(
0
)
=
α
P
′
(
1
)
(
α
>
0
)
Q'(0)=\alpha P'(1)\qquad (\alpha >0)
Q′(0)=αP′(1)(α>0)
当
α
=
1
\alpha = 1
α=1时,
G
1
G^1
G1连续就成为
C
1
C^1
C1 连续
3️⃣ 若要求在结合处达到 G 2 G^2 G2连续,就是说两条曲线在结合处在满足 G 1 G^1 G1连续的条件下,并有公共的曲率矢:
这个关系可写为
β \beta β为任意常数,当 α = 1 , β = 0 \alpha =1 , \beta = 0 α=1,β=0时, G 2 G^2 G2连续就成了 C 2 C^2 C2连续
参数曲面基本概念
一张定义在矩形域上的参数曲面可以表示为
可记为
曲面上的点:将给定的参数值 u 0 , v 0 u_0,v_0 u0,v0代入参数方程,可得曲面上的点 P ( u 0 , v 0 ) P(u_0,v_0) P(u0,v0)
曲面上一点的切向量(切矢):
∂
P
(
u
,
v
)
∂
u
∣
u
=
u
0
,
v
=
v
0
∂
P
(
u
,
v
)
∂
v
∣
u
=
u
0
,
v
=
v
0
\frac{\partial{}P(u,v)}{\partial{}u}|u=u_0,v=v_0 \qquad \frac{\partial{}P(u,v)}{\partial{}v}|u=u_0,v=v_0
∂u∂P(u,v)∣u=u0,v=v0∂v∂P(u,v)∣u=u0,v=v0
曲面上一点的法向(法矢):

角点: P ( 0 , 0 ) , P ( 0 , 1 ) , P ( 1 , 0 ) , P ( 1 , 1 ) P(0,0),P(0,1),P(1,0),P(1,1) P(0,0),P(0,1),P(1,0),P(1,1)
边界线: P ( u , 0 ) , P ( u , 1 ) , P ( 0 , w ) , P ( 1 , w ) P(u,0),P(u,1),P(0,w),P(1,w) P(u,0),P(u,1),P(0,w),P(1,w)
第三章—Bezier 曲线与曲面(11分)
起源
由于几何外形设计的要求越来越高,传统的曲线曲面表示方法, 已不能满足用户的需求;
1962年,P.E.Bezier构造了一种以逼近为基础的参数曲线和曲面的设计方法,并用这种方法完成了UNISURF系统(1972年投入了应用);
Bezier方法将函数逼近同几何表示结合起来,使得设计师在计算机上就象使用作图工具一样得心应手。
优点
输入的控制点与生成曲线之间的关系明确;
能方便地改变曲线的形状和阶次;
无论是直线或曲线都能在数学上予以描述 (为计算机矢量图形学奠定了基础 )。
应用领域
1️⃣ 计算机辅助设计与制造(CAD/CAM)
2️⃣ 桥梁建筑物以及日用品的设计
3️⃣ 曲线字形轮廓描述
4️⃣ 地图图形管理系统
5️⃣ 移动机器人运动规划
Bezier 曲线的定义与性质
定义
给定空间n+1个点的位置矢量Pi(i=0,1,2,…,n),则Bezier参数曲线上各点坐标的插值公式是:

P i P_i Pi构成该Bezier曲线的特征多边形
B i , n ( t ) B_{i,n}(t) Bi,n(t)是n次Bernstein基函数:
举例
习题
1️⃣ 设有控制顶点为P0(0,0),P1(48,96),P2(120,120),P3(216,72)的三次Bézier曲线P(t),试计算P(0,4)的(x,y)坐标,并写出(x(t),y(t))的多项式表示。
2️⃣ 设一条三次Bézier曲线的控制顶点为P0,P1,P2,P3。对曲线上一点P(0.5),及一个给定的目标点T,给出一种调整Bézier曲线形状的方法,使得P(0.5)精确通过点T。
Bernstein基函数性质
1️⃣ 正性
2️⃣ 端点性质
3️⃣ 权性
4️⃣ 对称性
推导
5️⃣ 递推性
推导
即高一次的Bernstein基函数可由两个低一次Bernstein基函数线性组合而成。>
6️⃣ 导函数
推导
7️⃣ 最大值
8️⃣ 积分
9️⃣ 升阶公式
Bezier曲线的性质(选择)
1️⃣ 端点性质
曲线端点位置矢量
切矢量
二阶导矢
2阶导矢只与相邻的3个顶点有关,事实上,r阶导矢只与(r+1)个相邻点有关,与更远点无关
2️⃣ k阶导函数的差分表示
n次Bezier曲线的k阶导数可用差分公式为:
其中高阶向前差分矢量由低阶向前差分矢量递推地定义:
例如
题目
试证明n次Bezier曲线退化为(n-1)次Bezier曲线的条件为 Δ 0 P 0 = 0 \Delta ^0 P_0=0 Δ0P0=0 。
3️⃣ 对称性
由控制顶点 P i ∗ = P n − i , ( i = 0 , 1 , . . . , n ) P_i^*=P_{n-i},(i=0,1,...,n) Pi∗=Pn−i,(i=0,1,...,n)构造出的新Bezier曲线,与原Bezier曲线形状相同,走向相反。因为:
这个性质说明Bezier曲线在起点处有什么几何性质,在终点处也有相同的性质。
4️⃣ 凸包性
由于 ∑ n i = 0 B i , n ( t ) ≡ 0 \underset{i=0}{\overset{n}{\sum}}B_{i,n}(t)\equiv 0 i=0∑nBi,n(t)≡0,且 0 ≤ B i , n ( t ) ≤ 1 ( 0 ≤ t ≤ 1 , i = 0 , 1 , . . . , n ) 0\le B_{i,n}(t)\le 1(0\le t \le 1,i=0,1,...,n) 0≤Bi,n(t)≤1(0≤t≤1,i=0,1,...,n),这一结果说明当t在[0,1]区间变化时,对某一个t值,*P(t)*是特征多边形各顶点的加权平均,权因子依次是 B i , n ( t ) B_{i,n}(t) Bi,n(t) ;
在几何图形上,意味着Bezier曲线P(t)在 t ∈ [ 0 , 1 ] t\in [0,1] t∈[0,1]中各点是控制点Pi的凸线性组合,即曲线落在Pi构成的凸包之中 。
5️⃣ 几何不变性
某些几何特性不随坐标变换而变化的特性;
Bezier曲线位置与形状与其特征多边形顶点 P i ( i = 0 , 1 , . . . , n ) P_i(i=0,1,...,n) Pi(i=0,1,...,n) 的位置有关:
6️⃣ 变差缩减性(考点)
若Bezier曲线的特征多边形 P 0 P 1 . . . P n P_0P_1...P_n P0P1...Pn 是一个平面图形,则平面内任意直线与P(t)的交点个数不多于该直线与其特征多边形的交点个数;
反映了Bezier曲线比其特征多边形的波动还小
7️⃣ 仿射不变性
对于任意的仿射变换A:
即在仿射变换下, 的形式不变。
矩阵表示形式
Bezier曲线的递推算法(必考)
算法原理
de Casteljau(德卡斯特里奥)递推算法
便于计算Bezier曲线上的点

如图所示,设 P 0 、 P 0 2 、 P 2 P_0、P_0^2、P_2 P0、P02、P2是一条抛物线上顺序三个不同的点。过 P 0 P_0 P0和 P 2 P_2 P2点的两切线交于 P 1 P_1 P1点,在 P 0 2 P_0^2 P02点的切线交 P 0 P 1 P_0P_1 P0P1和 P 2 P 1 P_2P_1 P2P1于 P 0 1 P_0^1 P01和 P 1 1 P_1^1 P11,则如下比例成立:
证明过程
当 P 0 P_0 P0, P 2 P_2 P2固定,引入参数t,令上述比值为t:(1-t),即有:
t从0变到1,第(1)、(2)式就分别表示控制二边形的第一、二条边,它们是两条一次Bezier曲线。
将(1)、(2)式代入第(3)式得
当t从0变到1时,它表示了由三顶点P0、P1、P2三点定义的一条二次Bezier曲线;
这二次Bezier曲线可以定义为分别由前两个顶点(P0,P1)和后两个顶点(P1,P2)决定的一次Bezier曲线的线性组合。
依次类推,由四个控制点定义的三次Bezier曲线 可被定义为分别由(P0,P1,P2)和(P1,P2,P3)确定的两条二次Bezier曲线的线性组合
由(n+1)个控制点 P i ( i = 0 , 1 , . . . , n ) P_i(i=0,1,...,n) Pi(i=0,1,...,n)定义的n次Bezier曲线 P 0 n P_0^n P0n可被定义为分别由前、后n个控制点定义的两条(n-1)次Bezier曲线 P 0 n − 1 P_0^{n-1} P0n−1与 P 1 n − 1 P_1^{n-1} P1n−1的线性组合
由此得到Bezier曲线的递推计算公式:
当n=3时,算法递推出的 P i k P_i^k Pik呈直角三角形,对应结果如图所示。从左向右递推,最右边点 P 0 3 P_0^3 P03即为曲线上的点。

习题举例
1️⃣ 已知三次Bezier曲线上的4个点分别为Q0(50,0), Q1(100,0), Q2(0,50), Q3(0,100),它们对应的参数分别为0,1/3, 2/3,1,求Bezier曲线的控制顶点。[了解一下]
2️⃣ 计算以(30,0),(60,10),(80,30),(90,60),(90,90)为控制顶点的4次Bezier曲线在t=1/2处的值,并画出de Casteljau三角形
3️⃣ 给出三次Bezier曲线退化为二次Bezier,控制顶点P0,P1,P2,P3应该满足的条件。
4️⃣ 设一条二次Bezier曲线的控制顶点为P0,P1,P2,另一条二次Bezier曲线的控制顶点为Q0,Q1,Q2, P2 =Q0.写出两条曲线可以精确合并(表示)为一条二次Bezier曲线的条件。
Bezier曲线的拼接(了解)
几何设计中,一条Bezier曲线往往难以描述复杂的曲线形状。
两段Bezier曲线达到不同阶几何连续的条件
•给定两条Bezier曲线P(t)和Q(t),相应控制点为Pi(i=0,1,…,n)和Qj(*j=*0,1,…, m),且令 a i = P i − P i − 1 , b j = Q j − Q j − 1 a_i=P_i-P_{i-1},b_j=Q_j-Q_{j-1} ai=Pi−Pi−1,bj=Qj−Qj−1,如图所示,我们现在把两条曲线连接起来。
1️⃣ 达到 G 0 G^0 G0连续的充要条件是: P n = Q 0 P_n=Q_0 Pn=Q0;
2️⃣ 达到 G 1 G^1 G1连续的充要条件是: P n − 1 , P n = Q 0 , Q 1 P_{n-1},P_n=Q_0,Q_1 Pn−1,Pn=Q0,Q1三点共线,即: b 1 = α a n ( α > 0 ) b_1=\alpha a_n(\alpha>0) b1=αan(α>0)
3️⃣ 达到 G 2 G^2 G2连续的充要条件是: G 1 G^1 G1在连续的条件下,并满足方程
Bezier曲线的升阶与降阶(考过了)
Bezier曲线的升阶
定义
升阶:保持Bezier曲线的形状与方向不变,增加定义它的控制顶点数,提高该Bezier曲线的次数。
增加了控制顶点数,增加了对曲线进行形状控制的灵活性,还在构造曲面方面有着重要的应用:
应用升阶的方法,可以把低于最高次数的的曲线提升到最高次数,而获得相同的次数。
新控制顶点的计算
设给定原始控制顶点 P 0 , P 1 , . . . , P n P_0,P_1,...,P_n P0,P1,...,Pn,定义了一条n次Bezier曲线:
增加一个顶点后,仍定义同一条曲线的新控制顶点为 P 0 ∗ , P 1 ∗ , . . . , P n + 1 ∗ P_0^*,P_1^*,...,P_{n+1}^* P0∗,P1∗,...,Pn+1∗,则有
对上式左边乘以(t+(1-t)),得到
比较等式两边 t i ( 1 − t ) n + 1 − i t_i(1-t)^{n+1-i} ti(1−t)n+1−i项的系数,得到
其中 P − 1 = P n + 1 = ( 0 , 0 ) P_{-1}=P_{n+1}=(0,0) P−1=Pn+1=(0,0)
上述结果说明:
题目
推导Beizer曲线的升阶公式;给定三次Bezier曲线的控制顶点(0,0), (0,100), (100,0), (100,100),计算升阶一次后的控制顶点。
Bezier曲线的降阶
给定一条由原始控制顶点定义的n次Bezier曲线,要求找到一条由新控制顶点定义的n-1次Bezier曲线来逼近原始曲线。
新控制点的计算
–假定 P i P_i Pi是由 P i ∗ P_i^* Pi∗升阶得到,则由升阶公式有:
从前述方程可以导出两个递推公式
其中第一个递推公式在靠近P0处趋向生成较好的逼近,而第二个递推公式在靠近Pn处趋向生成较好的逼近
Bezier曲面(不考)
定义
设 P i j ( i = 0 , 1 , . . . , m ; j = 0 , 1 , . . . , n ) P_{ij}(i=0,1,...,m;j=0,1,...,n) Pij(i=0,1,...,m;j=0,1,...,n)为 ( m + 1 ) × ( n + 1 ) (m+1)\times (n+1) (m+1)×(n+1)个空间点列,则 m × n m\times n m×n次张量积形式的Bezier曲面定义为:
其中 B i , m ( u ) , B j , n ( v ) B_{i,m}(u),B_{j,n}(v) Bi,m(u),Bj,n(v)是Bernstein基函数。
依次用线段连接点列 P i j ( i = 0 , 1 , . . . , m ; j = 0 , 1 , . . . , n ) P_{ij}(i=0,1,...,m;j=0,1,...,n) Pij(i=0,1,...,m;j=0,1,...,n)中相邻两点所形成的空间网格,称之为特征网格。
矩阵表示式是
在一般实际应用中m,n 不大于4
性质
除变差缩减性质外,Bezier曲线的其它性质可推广到Bezier曲面:
曲面特征网格的四个角点正好是Bezier曲面的四个角点,即
曲面特征网格最外一圈顶点定义曲面的四条边界;
曲面的拼接
设两张m×n次Bezier曲面片
分别由控制顶点Pij和Qij定义。

递推算法
第三章——B样条曲线与曲面
Bezier曲线缺陷:
B样条曲线:为克服Bezier曲线的缺陷,Gordon等人拓展了Bezier曲线,从外形设计的需求出发,希望新曲线易于进行局部修改、更逼近特征多边形、低阶次曲线
于是,用k阶B样条基函数替换了Bernstein基函数,构成了称之为B样条曲线的新型曲线。
B样条的递推定义与性质
基本概念
半开区间 [ t i , t i + 1 ] [t_i,t_{i+1}] [ti,ti+1] 是第i+1个节点区间;
集合T称为节点矢量;
重节点:如果一个节点ti出现r次 (即 t i = t i + 1 = . . . = t t + r − 1 , r > 1 t_i=t_{i+1}=...=t_{t+r-1},r>1 ti=ti+1=...=tt+r−1,r>1),ti 是重复度为r的多重节点
定义
P i ( i = 0 , 1 , . . . , n ) P_i(i=0,1,...,n) Pi(i=0,1,...,n)是控制多边形的顶点
N i , k ( t ) ( i = 0 , 1 , . . . , n ) N_{i,k}(t)(i=0,1,...,n) Ni,k(t)(i=0,1,...,n)称为k阶(k-1次)B样条基函数
多种基函数的定义:
de Boor-Cox递推定义
第i个k阶(基函数度数)B-样条基函数 N i , k ( t ) N_{i,k}(t) Ni,k(t)
约定 0 0 = 0 \frac{0}{0}=0 00=0
通常称为de Boor-Cox递归公式;
如果次数为零(k= 1),这些基函数都是阶梯函数。
特殊观察
1️⃣ 基函数 N i , k ( t ) N_{i,k}(t) Ni,k(t)在 [ t i , t i + k ) [t_i,t_{i+k}) [ti,ti+k)上非零;
2️⃣ 在任何一个节点区间 [ t i , t i + 1 ) [t_i,t_{i+ 1}) [ti,ti+1), 最多有k个(k-1)次基函数非零: N i − k + 1 , k ( t ) , N i − k + 2 , k ( t ) , . . . , N i , k ( t ) N_{i-k+1,k}(t),N_{i-k+2,k}(t),...,N_{i,k}(t) Ni−k+1,k(t),Ni−k+2,k(t),...,Ni,k(t)
性质
N i , k ( t ) N_{i,k}(t) Ni,k(t)是t的k阶多项式
1️⃣ 局部支撑性: N i , k ( t ) N_{i,k}(t) Ni,k(t)是在 [ t i , t i + k ) [t_i,t_{i+k}) [ti,ti+k)上的非零多项式
2️⃣ 权性(单位分解 )
3️⃣ 微分公式
4️⃣ 非负性:对所有的i,k和t, N i , k ( t ) N_{i,k}(t) Ni,k(t)是非负的
5️⃣ 重要结论
基函数 N i , k ( t ) N_{i,k}(t) Ni,k(t)是(k-1)次多项式的复合曲线,连接点在 [ t i , t i + k ) [t_i,t_{i+k}) [ti,ti+k)上的节点处;
在重复度r的节点处,基函数 N i , k ( t ) N_{i,k}(t) Ni,k(t)是 C k − r − 1 C^{k-r-1} Ck−r−1连续的;
如果节点数目是(m+1),函数的阶数是k,控制点的个数是(n+1),则m=(n+k),即节点数等于控制点数+阶数
❓ 五个控制顶点的三次B样条曲线由几个节点构成
B样条曲线类型的划分
两个标准:首末节点是否重合和节点的分布情况。
1️⃣ 首末节点是否重合
开曲线:曲线不会与控制折线的第一边和最后一边接触;图1
闭曲线:第1个节点和最后1个节点是重复节点。
2️⃣ 节点的分布情况
假定控制多边形的顶点为 P i ( i = 0 , 1 , . . . n ) P_i(i=0,1,...n) Pi(i=0,1,...n),阶数为k(次数为k-1),则节点矢量为 T = [ t 0 , t 1 , . . . , t n + k ] T=[t_0,t_1,...,t_{n+k}] T=[t0,t1,...,tn+k]
均匀样条曲线
准均匀样条曲线
分段Bezier曲线
一般的非均匀B样条曲线
B样条曲线的性质
局部性
1️⃣ k阶B样条曲线上参数为 t ∈ [ t i , t i + 1 ] t\in [t_i,t_{i+1}] t∈[ti,ti+1]的一点至多与k个控制顶点 P j ( j = i − k + 1 , . . . i ) P_j(j=i-k+1,...i) Pj(j=i−k+1,...i)有关,与其它控制顶点无关;
2️⃣ P i P_i Pi只影响在区间 [ t i , t i + k ) [t_i,t_{i+k}) [ti,ti+k)上的曲线P(t);
3️⃣ 基函数 N i , k ( t ) N_{i,k}(t) Ni,k(t)在区间 [ t i , t i + k ) [t_i,t_{i+k}) [ti,ti+k)上都是次数不高于(k-1)的多项式。
❓ 改变一条以P0,P1,…,P9为控制顶点的4阶B样条曲线的一个顶点P5,有几段曲线的形状会改变?
开曲线定义域
有k个基函数的支持,定义域是 [ t k − 1 , t n + 1 ] [t_{k-1},t_{n+1}] [tk−1,tn+1](k-1是次数,n+1是控制顶点数)
举例
使用节点向量T={0,0.25,0.5,0.75,1},如果基函数是2阶的(即k=2),那么有三个基函数N0,2(t),N1,2(t)和N2,2(t);
第一个和最后一个节点区间只有一个非零基函数,而第二和第三节点区间(即[0.25,0.5)和[0.5,0.75))有两个非零基函数。
节点区间[0,0.25)和[0.75,1)没有基函数的“完全支持”。
一般来说,区间 [ t 0 , t k − 1 ) [t_0,t_{k-1}) [t0,tk−1)和 [ t n + 1 , u n + k ] [t_{n+1},u_{n+k}] [tn+1,un+k]不会有基函数的“完全支持”,当B样条曲线是开曲线时被忽略。
凸包性
贝塞尔曲线是B样条曲线的特例
分段参数多项式
P(t)在每一区间上都是次数不高于k-1的参数t的多项式,因此P(t)是参数t的次数不高于k-1的分段多项式。
连续性
导数公式
变差缩减性
仿射不变性
即在仿射变换下,P(t)的表达式具有形式不变性。
如果一个仿射变换应用于B样条曲线,得到的结果可以从它的控制点的仿射像构建得到。
几何不变性
由于定义式所表示的B样条曲线是参数形式,因此,B样条曲线的形状和位置与坐标系选择无关。
直线保持性
控制多边形退化为一条直线时曲线也退化为一条直线
习题
1️⃣ 五个控制顶点的三次B样条曲线由几个节点构成
2️⃣ 一条以P0,P1,P2,P3,P4为控制顶点的4阶(三次)B样条曲线,其节点向量为{0,0,0,1,2,3,4,4, 4},则其定义域为?
3️⃣ 由五个控制顶点所决定的3次B样条曲线,由几段3次B样条曲线段光滑连接而成?
4️⃣ 改变一条以P0,P1,…,P9为控制顶点的4阶B样条曲线的一个顶点P5,有几段曲线的形状会改变?
De Door算法(了解)
de Boor 算法的递推关系如图
三次B样条的Bezier表示(了解)
节点插入算法
进一步改善B样条曲线的局部性质,提高曲线的形状控制的灵活性,可实现对曲线的分割等
给定一条k阶B样条曲线$P(t)=\underset{i=0}{\overset{n}{\sum}}P_i N_{i,k}(t) , B 样 条 基 由 节 点 矢 量 ,B样条基由节点矢量 ,B样条基由节点矢量T={[t_0,t_1,…,t_{n+k}]}$完全决定
插入一个节点
新节点矢量T1决定了一组新B样条基 N i , k 1 ( t ) , i = 0 , 1 , . . . , n + 1 N_{i,k}^1(t),i=0,1,...,n+1 Ni,k1(t),i=0,1,...,n+1。原始的曲线可用这组新的B样条基与未知新顶点 P i 1 P_i^1 Pi1表示

未知新顶点的计算公式(Boehm)

算法过程
B样条曲线的优点
优点:
可以是贝塞尔曲线;满足贝塞尔曲线有的所有重要性质;提供了比贝塞尔曲线更灵活的控制
B样条曲线仍然是多项式曲线,而多项式曲线不能表示许多有用的简单的曲线比如圆和椭圆。
B样条曲面
第四章——真实感图形学
生成三维场景的真实图形的步骤:
真实感图形学:
应用:
特点:
影响真实感图形的因素:
如已知场景的光照明效果的物理模型,则可用计算机模拟真实世界。
观察者对图像光函数的亮度响应,通常采用光场的瞬时光亮度计量:
I ( x , y , t , λ ) I(x,y,t,\lambda) I(x,y,t,λ)表示成像平面的空间辐射能量;
V s ( λ ) V_s(\lambda) Vs(λ)代表相对光效函数,即人视觉的光谱响应。
生成具有真实感的图像,关键在于 I I I的计算:核心在于如何仿真光源发出的光线在物体间的传播
的照明效果包括反射、透射、折射、表面纹理和阴影等。
光照明模型:已知物体物理形态和光源性质的条件下,能计算出场景光照明效果的数学模型。
第四章——颜色视觉
要产生具有高度真实感的图像,颜色是最重要的因素。
颜色是外来的光刺激作用于人的视觉器官而产生的主观感觉,影响的因素有:
基本概念
光源(了解)
点光源,如果光源大小比场景中的物体小得多,可以假定光线是从一个点向四周均匀发散的,最简单的模型。
线光源,可以看作是多个点光源在一维空间上的合成,例如模拟荧光灯管这类长条形的光源。
面光源,即可以看作线光源在高一维空间的合成,也可看作点光源在二维空间的合成。它可以用来模拟发光的块状物体。
颜色类型
非彩色:黑色、白色和各种不同深浅的灰色;
彩色:指黑白系列以外的各种颜色
颜色的属性
非彩色只有一个属性:明度(图)
彩色具有三属性:(常称颜色的心理三属性)
颜色的三个视觉特性(心理学属性)——HSV
色调(Hue) ;
饱和度(Saturation) ;
亮度(Value)。
颜色的物理特性
主波长(Dominant Wavelength):产生颜色光的波长,对应于视觉感知的色调;
纯度(Purity):对应于饱和度;
明度(Luminance):对应于光的亮度。
色调
一种颜色区别于其他颜色的因素
单色光:对应着它的波长;
复色光:比例最大的单色光的波长(主波长);
人眼可分辨的光谱色有100多种,谱外色30多种,共计130多种。
色调环
同类色:相距15°以内;
邻近色:相距15°~45°以内;
对比色:位于100°~197°之间;
互补色:相距180°。

辨认阈限
人的视觉在辨认波长的微小变化方面的能力。
在可见光谱的两端,人眼对波长变化的反应能力近乎迟钝,特别是在波长大于655nm及小于430nm的区域,人眼几乎无法分辨颜色上的差别。
亮度
人眼所能感受到色彩的明暗程度,是与人的心理、生理有关的一个属性。
单色光:光线越强,其色彩越明亮;
物体表面的光辐射率越高,亮度越高;发光体的明度越高,亮度越高。
白颜料是反射率极高的物质:如果在其它颜料中加入白色,可以提高混合色的亮度;加入黑色,可以降低混合色的亮度。
饱和度
颜色的纯度
单色光的饱和度最高;
复色光的波长范围越窄,光色越饱和;
色料中含灰分的比例低,则其饱和度高;
物体色饱和度取决于表面反射光谱色的选择性
颜色三属性的相互关系
色调:色刺激的光谱组成及光谱功率分布峰值的位置;
亮度:色刺激的光强;
饱和度:最强波长的功率对其它波长占优势的程度;
三者相互独立的但并不单独存在,其变化是相互联系、影响的
两者只有在适当亮度下才能充分表现出来。
颜色纺锤体
颜色三特性的空间表示:
平面圆形上的色调和饱和度不同,而亮度相同
光的物理知识
光是人的视觉系统能够感知到的电磁波
光可以由它的光谱能量分布 P ( λ ) P(\lambda) P(λ)来表示
能否用光谱能量的分布定义颜色? 不能
异谱同色:两种光的光谱分布不同而颜色相同的现象
颜色视觉理论
颜色视觉是真实感图形学的生理基础,颜色科学中最基本、最重要的理论。
混合性:太阳光通过棱镜后分散成光谱上的颜色光带,证明白光由很多颜色光混合而成。
颜色视觉理论:三色学说;四色学说(对立颜色学说);现代阶段学说。
三色学说
三色学说的形成:
Maxwell用旋转圆盘证实了Yaung假设。
1862年,Helmhotz提出三色学说。
三色原理:用三种原色能够产生各种颜色
(近代)三色学说
视网膜上含有三种不同类型的锥体细胞,分别含有感红、绿和蓝三种视色素,具有各自的光谱吸收率;
三种色素按各自的吸收特性吸收外界光辐射后,产生光化学反应,刺激视神经,通过神经中枢传递给大脑产生综合颜色感觉。
三色学说解析:
三色学说
四色学说
1864年由赫林提出,颜色对立学说**。**
四种心理原色:红、绿、黄、蓝。其它色由这四色混合而成,这四色中的任何一个都不能由其它色混合得到。
三对独立视色素:红-绿、黄-蓝、黑-白。它们的代谢作用包括建设(同化)和破坏(异化)两种对立的过程。红和绿视色素组合只能得到灰色或白色感觉,即绿刺激抵消红刺激的作用。
解释颜色混合现象:当两种颜色为对立色时,混合时得到白色,这是因为它们对某一对视素的两种对立过程形成平衡的结果。
能解释负后像现象:当某一色彩刺激停止时,与该色彩相关的视素的对立过程开始活动,因而产生该颜色对立色,即补色。
解释色盲现象:色盲是缺乏一对或两对视色素的结果。即使缺乏两对视色素,导致全色盲,仍然有黑白视色素,有黑白感觉。
不能解释近代色度学基础:即不能说明三原色能混合一切色的现象。
现代阶段学说
将颜色视觉的形成分为两个阶段
优点:统一了三色和四色学说。视网膜阶段解释三色学说,视神经传输阶段解释四色学说。
色光混合定律
1854年H.Grassman总结出颜色混合的基本规律,格拉斯曼定律。
人的视觉只能分辨颜色的三种变化:明度、色调、饱和度;
在由两个成份组成的混合色中,如果一个成份连续变化,混合色的外貌也连续变化。导出补色律和中间色律。
等效率:外貌相同的色光,无论它们的光谱组成是否一样,在颜色混合中具有相同的效果。导出
亮度相加定律:混合色光的总亮度等于组成混合色的各颜色光亮度的总和。
代替律
颜色混合三定律:补色律、中间色律、代替律统称为颜色混合三定律。
加色法混合:混合色的光谱能量分布是每个组成色的光谱能量分布的简单相加,故称为色光相加混合。
减色法混合:
几种颜色视觉现象
恒常性:外界条件发生一定范围的变化后,视觉对物体的颜色感觉仍保持相对稳定的特性;
适应性:由于环境光对眼睛的持续作用,致使眼睛对环境光产生一定的抵消作用,而使颜色视觉发生变化的现象;(负后像)
对比性:眼睛同时接受相邻不同颜色的刺激,造成颜色视觉发生变化的现象。
CIE色度图(了解)
CIE:国际照明委员会
三色学说解释了颜色混合现象:任何颜色可用红、绿、蓝按照不同比例混合来得到。
颜色匹配-如何由三原色混合复现给定颜色?
CIE选取标准红、绿和蓝(700, 546, 435.8)。
光的颜色匹配式子:
c
=
r
R
+
g
G
+
b
B
c=rR+gG+bB
c=rR+gG+bB
权值r**、g、**b为颜色匹配中所需要的三色光的相对量(三刺激的值)
RGB系统
1931年CIE给出等能标准三原色匹配任意颜色的光谱三刺激值曲线。(CIE-RGB系统)
CIE-RGB曲线一部分三刺激值是负数:
XYZ系统
1931年CIE规定了三种假想的标准原色(X, Y, Z),构造了CIE-XYZ系统
颜色匹配函数的三刺激值为正值。
CIE-XYZ系统的光颜色匹配函数的定义如下:
c
=
r
X
+
g
Y
+
b
Z
c=rX+gY+bZ
c=rX+gY+bZ
任何颜色都能由标准三原色混合匹配;
解决了颜色匹配问题。
色度图
三维颜色空间:由三原色的单位向量所定义
CIE-XYZ系统
色度图:截面与三个坐标平面的交线构成一个等边三角形。
颜色(刺激向量)与色度图有唯一交点,空间坐标(x,y,z)表示为该颜色在标准原色下的三刺激值,称为色度值:

两个独立变量,可进行投影。
翼形轮廓线代表所有可见光波长的轨迹,即可见光谱曲线。
沿线的数字表示该位置的可见光的主波长。
中央的C对应于近似太阳光的标准白光,C点接近于但不等于x=y=z=1/3的点。
红色区域位于图的右下角,…,连接光谱轨迹两端点的直线称为紫色线。
CIE色度图用途
定义一个颜色域:通过调整混合比例,任意两种颜色。
I和J加在一起能够产生它们连线上的颜色。
加入第三种颜色K,就产生三者构成的三角形区域的颜色。
应用较复杂,需要引入其它颜色系统-颜色模型
常用颜色模型
颜色模型:某个三维颜色空间中的一个可见光子集,包含某个颜色域的所有颜色:
常用的颜色模型
两种原色混合系统
基于Red、Green和Blue三原色定义RGB加色系统;
基于青(Cyan)、品红(Magenta)和黄(Yellow)CMY减色系统;
两种系统的颜色互为补色:青-红、品红-绿、黄-蓝,习惯上把红绿蓝作为原色
RGB颜色模型
基于红绿蓝三原色定义加色系统;
采用三维直角坐标系,RGB立方体;
每个彩色点采用(R,G,B)表示,[0,1]或[0,255]。
所覆盖的颜色域取决于显示设备荧光点的颜色特性,与其它硬件无关。

CMY颜色模型
基于青、品红、黄的减色系统;
常用于从白光中滤去某种颜色;
对RGB模型的直角坐标系的子空间作下述变换即可获得CMY颜色模型直角坐标系的子空间:
C=1-R、M=1-G、Y=1-B
印刷硬拷贝设备的颜色处理:在白纸面上涂黄色和品红色,纸面上将呈现红色, 因为白光被吸收了蓝光和绿光,只能反射红光
RGB颜色模型与CMY颜色模型都是面向硬件模型。
HSV颜色模型
HSV**(**Hue Saturation Value)颜色模型是面向用户模型,该模型对应于圆锥形:
圆锥的顶面对应于V=1(亮度)
色度H由绕V轴的旋转角给定
饱和度S取值从0到1,由圆心向圆周过渡。
HSV模型对应画家的配色的方法:用改变色浓和色深的方法从某种纯色获得不同色调的颜色
第四章——简单光照明模型
光源
光源向四周所辐射光的光谱分布
空间的光亮度分布
材质
对于一个半透明的物体表面,部分入射光会被反射,部分则被折射。
光照射到物体表面,可能被吸收、反射和透射
光照明模型:模拟物体表面的光照明物理现象的数学模型。
简单光照明模型
发展历程
相关物理知识
光的传播
反射定律:入射角等于反射角,而且反射光线、入射光线与法向量在同一平面上。

折射定律:折射线在入射线与法线构成的平面上,折射角与入射角满足
η
1
η
2
=
s
i
n
φ
s
i
n
θ
\frac{\eta_1}{\eta_2}=\frac{sin \varphi}{sin \theta}
η2η1=sinθsinφ
能量关系:在光的反射和折射现象中,能量是守恒的,能量的分布情况满足这样的一个式子:
I
i
=
I
d
+
I
s
+
I
t
+
I
v
I_i =I_d+I_s+I_t+I_v
Ii=Id+Is+It+Iv
I
i
I_i
Ii为入射光强,由直接光源或间接光源引起;
I d I_d Id为漫反射光强,由表面不光滑引起;
I s I_s Is为镜面反射光强,由表面光滑性引起;
I t I_t It为透射光,由物体的透明性引起;
I v I_v Iv为被物体所吸收的光,由能量损耗引起
光的度量
立体角:面元ds向点光源P所张的立体角为:
d
ω
=
d
s
r
2
d \omega =\frac{ds}{r^2}
dω=r2ds
r为点光源到面元中心的垂直距离

点发光强度
Phong光照明模型
光照到物体表面时,物体对光会发生反射、透射、吸收、衍射、折射和干涉。
简单光照明模型模拟物体表面对光的反射作用
Phong模型中的几何量示意图

理想漫反射
理想漫反射:当光源来自一个方向时,由于物体表面粗糙不平,导致反射光均匀向各方向传播,而与视点无关。
假设入射光强$I_p , 物 体 表 面 上 点 P 的 法 向 为 N , 从 点 P 指 向 光 源 的 向 量 为 L , 两 者 夹 角 为 ,物体表面上点P 的法向为N,从点P 指向光源的向量为L,两者夹角为 ,物体表面上点P的法向为N,从点P指向光源的向量为L,两者夹角为\theta$ ,由Lambert余弦定律,漫反射光强为:

K d K_d Kd是与物体有关的漫反射系数 0 < K d < 1 0<K_d<1 0<Kd<1
当L,N为单位向量时,漫反射光强可表示为:

有多个光源时,上式可进一步表示为

反射光颜色:由入射光颜色和物体表面颜色共同决定;
在RGB颜色模型下, 有三个分量,分别代表三原色的漫反射系数,通过调整它们来设定物体的颜色;
可以把入射光强I设为三个分量 I r , I g , I b I_r,I_g,I_b Ir,Ig,Ib,通过这些分量的值来调整光源的颜色
镜面反射光
理想镜面:反射光集中在一个方向并遵循反射定律。
光滑表面:反射光集中在一个范围内,且由反射定律决定的反射方向光强最大。对于同一点,不同位置观察到的镜面反射光强不同。
镜面反射光强:

若规范所有向量,则镜面反射光强为:

其中
多个光源时,镜面反射光强为:

镜面反射光将会在反射方向附近形成很亮的光斑,称为高光现象;
镜面反射光产生的高光区域只反映光源的颜色;
镜面反射系数 是一个与物体的颜色无关的参数;
只能通过改变物体的漫反射系数来控制物体的颜色。
环境光
环境光:光源间接对物体施加的明暗影响,是在物体和环境之间多次反射,最终达到平衡时的一种光
同一环境下的环境光光强均匀分布,即在任一方向上的分布相同;
在简单光照明模型中,近似表示为:
I
e
=
I
a
.
K
a
I_e=I_a.K_a
Ie=Ia.Ka
Phong光照明模型:由物体表面上一点P反射到视点的光强
I
I
I为环境光的反射光强
I
e
I_e
Ie、理想漫反射光强
I
s
I_s
Is和镜面反射光
I
d
I_d
Id的总和
I
=
I
a
K
a
+
I
p
K
d
(
L
.
N
)
+
I
p
K
s
(
R
.
V
)
n
I=I_aK_a+I_pK_d(L.N)+I_pK_s(R.V)^n
I=IaKa+IpKd(L.N)+IpKs(R.V)n

Phong模型:对物体表面上的每个点P,均需计算光线的反射方向R,再由R计算(R•V)。假设:
光源在无穷远处,即L为常向量;
视点在无穷远处,即V为常向量;
(H•N)近似(R•V) ,H为L与V的平分向量: H = L + V ∣ L + V ∣ H=\frac{L+V}{|L+V|} H=∣L+V∣L+V。
对所有的点总共只需计算一次H的值
结合RGB颜色模型,Phong光照明模型


Phong光照明模型:真实感图形学中提出的第一个有影响的光照明模型,生成图像的真实度已达到可以接受的程度。
由于是经验模型,Phong模型存在不足:
增量式光照明模型
由于光源和视点均被假定为无穷远,Phong模型光强计算公式是物体表面法向量的函数。
用多边形表示的物体
增量式光照明模型:
两个主要算法(要会实质和步骤)
Gouraud双线性光强插值
Gouraud于1971年提出,又被称为Gouraud明暗处理;
思想:计算多边形各顶点的光强,再用双线性插值,求出多边形内部各点的光强
实质是:双线性光强插值
算法步骤的基本描述
顶点的计算
与某个顶点相邻的所有多边形的法向平均值近似作为该顶点的近似法向量;
顶点A相邻的多边形有k个,它的法向量计算为:
计算出的平均法向一般与该多边形物体近似曲面的切平面比较接近。
顶点平均光强计算
用Phong光照明模型及平均法向量计算在顶点A处的光强;
Gouraud提出明暗处理方法时,还未出现Phong模型,采用:

双线性光强插值:线性插值与扫描线算法相互结合,用增量算法实现各点光强的计算
由顶点的光强插值计算各边的光强,然后由各边的光强插值计算出多边形内部点的光强:
增量算法
双线性光强插值
Phong双线性法向插值
实质是双线性法向插值,计算量比Gouraud大
以时间为代价,可以部分解决上述的弊病;
将镜面反射引进到明暗处理中,解决了高光问题
Phong双线性法向插值特点
方法与光强插值类似,其中的光强项用法向量项来代替。基本公式:
增量插值计算也类似,用法向代替光强。
两种模型的评价
两类模型的特点:
增量式光照明模型的不足:
阴影
阴影
相关术语
接受物:可能接受光源照射的物体 。
本影:任意一点均无法观察到光源任何部分。
半影:任意一点可观察到部分光源。
阴影:即任意一点不能完全地观察到整个光源。
遮挡物:可遮挡光源中任意一点的物体。
Hard 阴影 vs Soft阴影
Hard阴影:点光源照射下,阴影问题是个二值状态
Soft阴影:几乎不存在真正意义上的点光源
阴影分类
自身阴影:光源被景物遮挡而在该景物本身;
投影阴影:在其后面产生的较暗的区域。
自身阴影
点光源下,生成产生具有自身阴影的步骤:
1️⃣ 将视点移到光源位置,将景物的面分成向光面和背光面;
2️⃣ 将视点移到原来的观察位置,对景物的向光面和背光面进行消隐,选用一种光照模型计算景物各面的亮度
3️⃣ 如果面在阴影区域,那么该面的光强就只有环境光那一项,其他的那几项光强都为零,否则就用正常的模型计算光强。
阴影算法与消隐算法相似:
从原理上,自身阴影面的求取只要简单地对消隐算法作出一点改造:
投影阴影
投射阴影的区域和形态与光源及景物的形状有很大的关系;
在光源的照射下,景物A在屏幕上产生了3个区域:本影区、半影区和无影区。
投射阴影区域:实际上是将光源作为观察方向时景物在与光源反向的某一平面上的落影区;
投射平面可以是场景中另一景物的表面或是一个非场景范畴的基面,如建筑物所在的地平面或屏幕等。
经典的三种本影阴影方法
1️⃣ 投影阴影;
2️⃣ 阴影图(Shadow Map)的方法;
3️⃣ 阴影体(Shadow Volume)的方法。
第四章——纹理和纹理映射
本节了解即可
简单光照明模型的缺陷
只能模拟光滑景物表面:
如何解决计算机生成真实感图象缺乏现实物体表面细节的问题
纹理:物体表面的细小结构。
纹理:
常见的纹理:
纹理概述
使用纹理需要考虑的三个问题:
1️⃣ 怎样才能产生纹理效果?
2️⃣ 纹理定义:
3️⃣ 映射:把纹理图象值映射到三维物体表面的技术
三个空间
二维纹理映射
颜色纹理:实际上是二维数组,元素是一些颜色值(纹理元素或纹理像素)
定义方法
1️⃣ 连续法——函数纹理
2️⃣ 离散法——图像纹理
合成纹理
根据给定一个图像示例,合成一种新的纹理;
由于计算机视觉和图形学领域的许多学者均关注于合成纹理方法的研究,因此出现了许多实用的算法。
在计算机图形学中,纹理合成方法可分为两类:
基于图像块的纹理合成方法。
映射
纹理映射的实质是建立两个映射关系
映射方法
圆柱面映射
圆柱面的参数方程
圆柱面上一点(x,y,z)的参数即纹理坐标:

球面映射
球面参数方程
球面上一点(x,y,z)的参数即纹理坐标
滤波
多个纹理元素只覆盖一个像素单元
最简单的解决方法是点取样,使用最邻近纹理元素:把当前象素单元的最中心所对应的纹理空间的点的值,作为象素的纹理值;这种方式会导致严重的走样。
对纹理进行放大,由于采样区域的局限性,所获取的纹理样本通常为小块纹理,将导致映射后表面纹理模糊不清;
若采用重复映射技术,则可能出现表面纹理接缝走样等问题。
为了得到比较合理的像素颜色值
几何纹理
桔子的模型:
几何纹理
1978年,Blinn提出产生几何纹理,模拟凸凹不平的物体表面的方法(凹凸映射,Bump mapping)
基本思想:生成图像时,对曲面的法向量进行扰动。
设物体表面上任意一点P(u,v)沿该点处的法向量方向位移F(u,v)个单位长度(N附加一微小增量),从而生成一张新的表面
新法向量的计算:
通过对两个偏导数求叉积得到:
F相对很小, FuFv忽略不计,有:
几何纹理的实现
扰动后的法向量单位化,用于计算曲面的明暗度,产生凹凸不平的几何纹理;
几何纹理函数:用二维数组记录各象素的值,图案中较暗颜色对应较小F值,较亮颜色对应较大F值;
F的偏导数的计算,可以用中心差分实现。