计算机图形学

第一章绪论

计算机图形学主要研究内容:计算机中图形的表示方法,以及利用计算机进行图形的计算、处理和显示的相关原理和算法

计算机图形学之父:Ivan Sutherland

1950年第一台图形显示器作为美国MIT旋风I号的附件诞生了

印刷业常用的颜色模型是CMY

计算机显示设备一般使用RGB颜色模型

图形学最高级 Steven A. Coons奖

siggraph 是图形学组织及最高会议

图形学应用领域:可视化、真实感图形学实时绘制,计算机动画、用户接口、计算机艺术、自然景物仿真

第一次提出光投射的是 Whitted模型

半边数据结构要保存的信息:顶点几何信息 和 从此顶点出发的半边信息

定义纹理的两种方法:图像纹理 和 函数纹理

第二章 光栅图形学

关键字:扫描转换(光栅化)、区域填充、裁剪、反走样

2.1绘制一个像素的直线

2.1.1数值微分法 DDA

利用增量式的思想,在直线y = kx + b ,x每增加1,y每增加△k,

void DDA(int x0,int y0,int x1,int y1,int color)

{
float dx,dy,y,k;
dx = x1 - x0,dy = y1 - y0;
k = dy/dx;
y = y0;
for (x=x0;x!=x1;x+=1)
{
drawpixel(x,int(y+0.5),color);
y+=k;
}
}

注意:上述算法仅只用于|k|<=1的情况,当不符合时,需要将x,y的地位互换。

2.1.2 中点画线法

原理:x逐步递增,每次通过与中点的位置关系判断取上面那个点还是下面那个点

d = F(x,y) = ax+by+c (a = y0-y1 b =x1-x0 c = x0y1-x1y0)

F(x,y) = 0 ,线上

F(x,y) < 0,上方

F(x,y) > 0,下方

采用了增量式的思想,

​ 当d >= 0,d1 = F(xp+2,y+0.5) = a(xp+2) + b(yp+0.5)+c = d+a 增量为a,

​ 当d < 0, d2 = F(xp+2,y+1.5) = a(xp+2) + b(yp+1.5)+c = d+a+b ,增量为a+b

拜托浮点运算,用2d代替d

 5 void line1(int x0,int y0,int x1,int y1){6 7      int x,y,d0,d1,d2,a,b;8      y=y0;             9      a=y0-y1;          //直线方程中的a的算法
10      b=x1-x0;          //直线方程中的b的算法
11      d0=2*a+b;         //增量初始值
12      d1=2*a;           //当>=0时的增量
13      d2=2*(a+b);       //当<0时的增量
14      for(x=x1;x<=x2;x++){
15             putpixel(x,y,GREEN);   //打亮
16         if(d0<0){
17             y++;
18             d0+=d2;
19         }else{
20
21         d0+=d1;
22         }
23
24      }
25 }
2.1.3 Bresenham算法

原理:x逐步递增,每次判断增值是否大于0.5,来判断取上面的点还是下面的点

为了避免除法:e‘ = 2e *dx

void Bresenham(int x0,int y0,int x1,int y1,int color)
{
int x,y,dx,dy,e;
dx = x1-x0,dy = y1-y0,e = -dx;
x=x0,y=y0;
fpr(i=0;i<=dx;i++)
{
drawpixel(x,y,color);
x++,e+=2dy;
if(e>=0){y++;e-=2
dx;}
}
}

2.2 圆弧的扫描转换算法

2.2.1 圆的特征

八对称性,只要扫描转化1/8圆弧就能利用八对称性求出整个圆弧的像素集。

2.2.2 中点画圆法

原理:F = x² + y² - R² 圆上的点F =0, 圆外的点F >0,圆内的点F<0

类似与中点画线法,d = F(M) = F(xp+1,yp-0.5) = (xp+1)² + (yp-0.5)² - R²

d<0,取上面的点,下一个点为F(xp+2,yp-0.5),d2-d1 = 2xp+3

d>0,取下面的点,下一个点为F(xp+2,yp-1.5),d2-d1 = 2(xp-xy)+5

算法:

26 void MP_Circle(int xc , int yc , int r)

27 {

28 int x, y;

29 double d;

30

31 x = 0;

32 y = r;

33 d = 1.25 - r;

34 CirclePlot(xc , yc , x , y);

35 while(x <= y)

36 {

37 if(d < 0)

38 {

39 d = d + 2 * x + 3;

40 }

41 else

42 {

43 d = d + 2 * ( x - y ) + 5;

44 y–;45 }

46 x++;

47 CirclePlot(xc , yc , x , y);

48 }

49 }

2.3多边形扫描转换和区域填充

多边形表示方式:1.顶点表示 2.点阵表示

扫描转换:将顶点表示转化为点阵表示

2.3.1.1 扫描线算法

(1)求交 (2)排序 (3)配对 (4)填色

升级方法:1.增加活性边表 2.增量法计算 3.新边表

AET活性边表:(当前x坐标,△x ,ymax)

创建一个新边表,里面用ymin记录每一条扫描线第一次出现位置

NET新边表:(最小x坐标,△x ,ymax)

算法:

void polufill(polypon,color)
{
for(各个扫描线i)
{
初始化新边表表头指针NET[i];
把ymin=i的边放入NET[i];
}
y = 最低扫描线号;
初始化活性边表为空;
for(各条扫描线i)
{
把NET[i]中边结点用插入排序法插入AET,使之按x坐标递增顺序排序;
若允许多边形的边自交,用冒泡排序法对AET重新排序;
遍历AET,把配对交点区间(左开右闭)上像素(x,y),改颜色;
遍历AET,把ymax=i的点删去,并把ymax>i的点的x值递增△x
}
}

2.3.1.2 边界标志算法

有适合用硬件实现,不用维护边表和排序,所以比扫描线算法快1-2个数量级

先对多边形每条边进行直线扫描转换,将多边形边界经过的像素打上标记;

然后类似直线扫描转换来上色。

对每条扫描线,从左到右遍历像素x,维护一个变量inside,经过一个标记便取反,inside为true则上色;

算法:

{
对多边形poludef每条边进行直线扫描转换;
for(每条与多边形poludef相交的扫描线y)
{
inside = false;
for(扫描线上每个像素x)
{
if(像素x被打上边标记)
inside = !inside;
if(inside)
上色;
else
改为背景色;
}

​ }

}

2.3.2 区域填充算法

区域分为四连通区域和八连通区域,区域表示分为:内点表示和边界点表示

对于点阵表示的填充图形

2.3.2.1 递归算法

对于内点表示,从区域内一点(x,y)开始递归遍历4个方向的点,如果是内点则上色,不是则结束。

对于区域点表示,同上,如果不是区域点则继续,是则结束

2.3.2.2区域填充的扫描线算法

(1)初始化。堆栈为空,将种子点(x,y)入栈

(2)出栈。栈空则结束,否则取栈顶元素(x,y),以y为当前扫描线

(3)填充并确定种子点所在区域,从(x,y)出发,向左右分别找边界点xl,xr

(4)确定新的种子点。

2.4 字符

点阵字符压缩技术:黑白段压缩,部件压缩和轮廓字形压缩

2.5 裁剪

2.5.1.1 直线段裁剪

1.Cohen-Sutherland 裁剪算法

思想:对于每条线段p1p2分成3种情况

(1)p1p2完全在窗口内,取

(2)p1p2完全在窗口外,弃

(3)p1p2穿过窗口,将线段分成窗口外和窗口内,然后分别弃和取

算法书本p34页

区域编码思想:code1 = code2 =0 表示都在区域内则取

code1&code2 !=0 则表示都在区域外则弃

否则 求交点,再继续判断

2.5.2.2 中点分割裁剪算法

同直线段裁剪,先编码,再分3种情况处理。只是对于第三种情况,利用中点来分2段后递归求解

2.5.1.3 梁友栋-Barskey裁剪算法

p36页

upk <= qk

求出u1,u2

当pk<0 ,从外到内,取qk/pk与0的max,

当pk>0, 从内到外,取 qk/pk和1的min

最后u1>u2 弃,u1<u2,取

2.5.2 多边形裁剪

p37-38

一次用窗口的一条边裁剪一次多边形 不适合于凹窗口

2.6 反走样

用离散量表示连续量引起的失真现象称为 走样,减少或者消除这种效果的技术成为 反走样

方法:1.提供分辨率,像素点变多 2.区域采样 3.加权区域采样

2.7 消隐

2.7.1 消隐的分类

1.消隐对象分 线消隐 和 面消隐

2.消隐空间分类

物体空间的消隐算法(光线投射算法,Robrtys算法)、

图像空间的消隐算法(Z-buff算法,扫描线算法,Warnock算法)、

物体空间和图像空间的消隐算法(画家算法)

2.7.3 消除隐藏面

1.画家算法,一层又一层,从远到近,不断更新

2.Z-buff 设置一个Z缓冲区存放每个像素的深度,一个帧颜色缓存区存放颜色

p47页

第三章 几何造型技术

几何造型系统中有3种方法描述物体的三维模型:线框模型、曲面模型和实体模型

实体模型中基本表示方式:

3.1参数曲线和曲面

曲线

显示表示:y=f(x) 隐式表示:f(x,y)=0 参数方程:P(t) =[x(t),y(t)]

曲率 绕率

曲线间连接的光滑度的度量方式:参数连续和几何连续

3.1.3插值、拟合和光顺

插值:构造一条曲线顺序通过给定的一组数据点,称为对这些数据点的插值,构造的曲线称为插值曲线。

拟合:构造一条曲线使之在某种意义下最接近给定的数据点(未必要通过这些点),称为对这些数据点进行拟合,构成的曲线为拟合曲线。

光顺:曲线的拐点不要过多

对平面曲线而言,相对光顺条件如下:①具有二阶几何连续性G2 ②不存在多余拐点和奇异点 ③曲率变化较小

3.1.6连续性

1.函数的可微性 C^n或n阶参数连续性

2.几何连续性 G^n

Cn连续包含在Gn连续中

G0/C0连续 要求曲线在连接点处连接

G^1连续 要求曲线在满足G^0连续前提下,有公共的切矢量 Q‘ = αP’

G^2连续 要求曲线在满足G^1连续前提下,满足有公共的曲率矢Q’‘ = α²P’‘ + βP’

由此可见,C1连续则G1连续(α=1),C2连续则G2连续(α=1,β=0)

3.2 Bezier曲线和曲面p66

1.定义P(t) = ∑PiBi,n(t),t∈[0,1]

Bi,n (t) 是n次Bernstein基函数,性质:

正性 Bi,n(t) >0

权性:累加和为1

最大性:Bi,n(t)最大值在t=i/n上取到

Bezier函数的性质:

对称性:起点的性质和终点性质相同

凸包性(凸包:定义在一个点集上,2D上的定义是一堆点,以外围点构成的凸多边形)

几何不变性:几何特性不依赖坐标

变差缩减性:若Bezier为平面图形,平面上任意直线与P(t)交点个数不多于该直线与特征多边形交点个数

仿射不变形

割角算法:递归递进

Bezier曲线的拼接

G1连续的话 Pn-1,Pn=Q0,Q1 3点共线

G2连续的话,Pn-2 Pn-1 Pn=Q0,Q1,Q2五点共面

Bezier曲面

Pij(i=0,1,…,m;j=0,1,…,n)为(m+1)*(n+1)的空间点列

3.3 B样条曲线与曲面P78

P(t) = ∑PiNi,k(t)

欲确定第i个k阶B样条Ni,k(t),要用到ti,ti+1 到 ti+k 一共k+1个点,称[ti,ti+k]为Ni,k(t)的支撑区间

一组B样条基的节点矢量T=[t0,t1,…,tn+k]

类型画风

1)均匀B样条 ti+1-ti =常数>0

2)准均匀B样条曲线 两端节点具有重复度k

3)分段Bezier曲线 节点适量中两端节点具有重复度k,所有内点重复度为k-1

4)非均匀B样条曲线

de Castljau算法

3.3.2 B样条曲线的性质

1.局部性,P(t)最多和k个控制点有关

2.连续性

3.凸包性

4.变差缩减性

5.几何不变性

6.仿射不变性

B样条优于Bezier曲线之处:

与控制多边形的外观更接近,局部修改能力强,可以绘制任意形状,易于拼接,阶次低,计算简便

de Boor 算法!

3.6 形体在计算机内的表示

实体模型表示方法:分解表示,构造表示和边界表示

用八叉树表示形体

优点:形体表示的数据结构简单,简化了形体的集合运算,分析算法适合并行处理

3.9 三角网格

相比于点云表达 网格表达 支持真实感图形学绘制

半边数据结构 half-edge

半边结构每个顶点至少需要保存两部分信息:1.顶点的几何信息 2.从这个顶点出发的半边

1.是顶点的坐标 2.该半边的源顶点,统一三角形内下一个半边,同属一条边的对边,所属的面即三角形

3.9.4网格简化p118

减少一个网格的面片数量同时仍能表达原三维模型的过程

三种基本化简操作:

(1)顶点删除操作

(2)边压缩操作

(3)面片压缩

计算操作误差(权值:两条边的二面角,角度约小越易失)

将每个基本元素的权值按递增排序,每次取队首操作,并更新改变了的权值再插入队列中,直到满足需要

3.9.5 网格细分p120

1.增加顶点 Loop细分,在每条边上都加一个点,使得顶点数变成原来的4倍

2.顶点位置跳转

流水线Graphics Pipeline

输入 3D space的顶点 -> vector stream -> Triangle Stream(Rasterization光栅化) -> Fragment Stream(Z-buffer) -> Shaded Fragments(绘制,如明暗处理)

顶点着色器 像素着色器

第四章 真实感图形学

颜色3个特性:色调、饱和度、亮度

RBG

CMY印刷

HSV面向用户

4.3简单光照模型

4.3.2 phong 光照明模型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6MulZQLk-1640513327831)(C:\Users\自嘲丶\AppData\Roaming\Typora\typora-user-images\image-20211225172049861.png)]

1.理想漫反射 diffusion reflection

Id = Ip* Kd*cos(θ) cos(θ) = L * N

2.镜面反射光 specular reflection

Is = Ip* Ks* cos^n(α) ,cos α = R* V

3.环境光 ambient

Ie = Ia * Ka

4.phone光照明模型

I = Ia * Ka + Ip* Kd*cos(θ) + Ip * Ks cos^n(α)

有时候 H* N 近似 R* V

4.3.3 增量式光照明模型

1.双线性光强插值 Gouraud 明暗处理

基本算法描述:

(1)先计算多边形顶点的平均法向

(2)用phong光照明模型计算顶点的平均光强

(3)插值计算离散边的各点光强

(4)插值计算多边形内域中各点的光强

先计算顶点处的平均光强,再通过线性插值计算其他各点光强

缺点:没有镜面反射 优点::能有效的显示漫反射效果,计算量小,图形光滑

2.双线性法向插值 phong明暗处理的特点

(1)保留双线性插值,对多边形边上的点和内域各点采用增量法

(2)对顶点的法向量进行插值,而顶点的法向量用相邻多边形的法向量的平均值得到

(3)插值得到的法向量,计算各个像素的光亮度

(4)假定光源和视点在无穷远处,光强只是法向量的函数

1.先对顶点的法向量进行插值,再通过插值得到的法向量计算每个像素的光亮度

特点:可以产生正确的高光区域,但计算量大

4.7 整体光照明模型

4.7.1 光线跟踪算法

跟踪镜面反射和折射

算法 p150-151

RayTracing(start,direction,weight,color)

{

​ if(weight < minWeight)

​ color = black;

​ else

​ {

​ 计算光线与所有物体交点中离start最近的点;

​ if(没有交点)

​ color = black;

​ else

​ {

​ I1 = 在交点出用局部光照明模型计算的光强

​ 计算反射反向R

​ RayTracing(最近的交点,R,weight*wr,Ir)

​ 计算折射方向T

​ RayTracing(最近的交点,T,weight*wt,It)

​ color = I1 + KsIr + KtIt

​ }

​ }

}

光线跟踪算法的加速

包围盒技术 AABB p154

OBB定向包围盒,能旋转的AABB包围盒(利用PCA,得到正交向量,之后坐标转换,计算AABB,再转化回来)

属于空间剖分技术的光线跟踪加速方法:三维DDA,空间八叉树

附录A

A.3 齐次坐标

(x1,x2,…,xn)->(x1,x2,…,xn,h)

h=1表示点,h=0表示一个点沿着直线到无穷远过程

附录B 图形的几何变换p207

C.5 透视投影 p214-215
体光照明模型

4.7.1 光线跟踪算法

跟踪镜面反射和折射

算法 p150-151

RayTracing(start,direction,weight,color)

{

​ if(weight < minWeight)

​ color = black;

​ else

​ {

​ 计算光线与所有物体交点中离start最近的点;

​ if(没有交点)

​ color = black;

​ else

​ {

​ I1 = 在交点出用局部光照明模型计算的光强

​ 计算反射反向R

​ RayTracing(最近的交点,R,weight*wr,Ir)

​ 计算折射方向T

​ RayTracing(最近的交点,T,weight*wt,It)

​ color = I1 + KsIr + KtIt

​ }

​ }

}

光线跟踪算法的加速

包围盒技术 AABB p154

OBB定向包围盒,能旋转的AABB包围盒(利用PCA,得到正交向量,之后坐标转换,计算AABB,再转化回来)

属于空间剖分技术的光线跟踪加速方法:三维DDA,空间八叉树

附录A

A.3 齐次坐标

(x1,x2,…,xn)->(x1,x2,…,xn,h)

h=1表示点,h=0表示一个点沿着直线到无穷远过程

附录B 图形的几何变换p207

C.5 透视投影 p214-215

计算机图形学课堂笔记相关推荐

  1. GAMES101-现代计算机图形学学习笔记(作业07)

    GAMES101-现代计算机图形学学习笔记(作业07) Assignment 07 GAMES101-现代计算机图形学学习笔记(作业07) 作业 作业描述 思路 结果 原课程视频链接以及官网 b站视频 ...

  2. 计算机图形学 学习笔记(七):二维图形变换:平移,比例,旋转,坐标变换等

    接上文 计算机图形学 学习笔记(六):消隐算法:Z-buffer,区间扫描线,Warnock,光栅图形学小结 在图形学中,有两大基本工具:向量分析,图形变换.本文将重点讲解向量和二维图形的变换. 5. ...

  3. GAMES101-现代计算机图形学学习笔记(作业02)

    GAMES101-现代计算机图形学学习笔记(作业02) Assignment 02 GAMES101-现代计算机图形学学习笔记(作业02) 作业 作业描述 需要补充的函数 思路 结果 原课程视频链接以 ...

  4. GAMES101-现代计算机图形学学习笔记(作业01)

    GAMES101-现代计算机图形学学习笔记(作业01) Assignment 01 GAMES101-现代计算机图形学学习笔记(作业01) 作业 作业描述 需要补充的函数 思路 结果 原课程视频链接以 ...

  5. 计算机图形学 学习笔记(八):三维图形变换:三维几何变换,投影变换(平行/ 透视 投影)

    接上文 计算机图形学 学习笔记(七):二维图形变换:平移,比例,旋转,坐标变换等 通过三维图形变换,可由简单图形得到复杂图形,三维图形变化则分为三维几何变换和投影变换. 6.1 三维图形几何变换 三维 ...

  6. 计算机图形学 学习笔记(五):多边形裁剪(Suther land-Hodgeman),文字裁剪

    接上文 计算机图形学 学习笔记(四):直线裁剪算法:Cohen-Suther land,中点分割法,Liang-Barsky 光栅图形学算法 3.4 多边形裁剪 之前上一篇文章中,我们介绍了直线段的裁 ...

  7. 计算机图形学 学习笔记(四):直线裁剪算法:Cohen-Suther land,中点分割法,Liang-Barsky

    接上文 计算机图形学 学习笔记(三):多边形的区域填充算法,反走样算法 光栅图形学算法 本文主要讲解直线裁剪算法. 裁剪 使用计算机处理图形信息时,计算机内部存储的图形往往比较大,而屏幕显示的知识图形 ...

  8. 计算机图形学学习笔记——Whitted-Style Ray Tracing(GAMES101作业5讲解)

    计算机图形学学习笔记--Whitted-Style Ray Tracing GAMES101作业5讲解 遍历所有的像素生成光线 光线与平面求交 遍历所有的像素生成光线 关于作业五中如何遍历所有的像素, ...

  9. 计算机图形学 学习笔记(九):曲线曲面(一):参数曲线、参数几何代数形式

    接上文 计算机图形学 学习笔记(八):三维图形变换:三维几何变换,投影变换(平行/ 透视 投影) 计算机图形学三大块内容:光栅图形显示(前面已经介绍完了 1-8).几何造型技术.真实感图形显示.光栅图 ...

最新文章

  1. python项目之古诗文网
  2. leetcode article
  3. 索引sql server_SQL Server索引结构和概念
  4. 重新启动postgre报错时,解决方案 ( 由备份文件占用空间太大造成 ) (linux 命令 df -h 查看磁盘空间)
  5. Linux安装SmartSVN及破解
  6. linux查看磁盘使用情况及每个文件夹占用磁盘大小
  7. WPF 文字换行TextWrapping 显示不全用省略号TextTrimming 显示不全弹提示内容ToolTip
  8. 操作系统:Win10如何彻底卸载自带的Flash软件
  9. Vue 当一个页面上,需要编辑,审核,查看详情的时候,隐藏和展示
  10. 《软件测试》第九章 兼容性测试
  11. 重装也无法修复此计算机,win10系统重置此电脑失败怎么解决
  12. 计算机中的取余 ( % )
  13. 疯狂的世界,疯狂的人!
  14. 养老保险缴费率上调 谁来买单?
  15. 基于CNONIX国家标准的出版社ERP系统建设分享
  16. 用Python读红楼梦之——一、词云绘制
  17. InnoDB原理篇:聊聊数据页变成索引这件事
  18. argo 现水下永动机器人_【现水下永动机器人是怎么回事?水下永动机器人】_永动机 水下_全球新能源网...
  19. 刘二大人 PyTorch深度学习实践 笔记 P6 逻辑斯蒂回归
  20. 输出华氏-摄氏温度转换表

热门文章

  1. centos dhcp服务器文件,Centos8上搭建dhcp服务器
  2. 可以实现一个前端的 Excel 导入和导出功能吗?
  3. 关于fiddler抓取手机流量
  4. 2018黑马python视频教程15期基础班+就业版完整视频百度网盘免费获取
  5. 虚拟机和upload靶场环境搭建
  6. 房屋交接时需要注意些什么?
  7. FFmpeg Tutorial
  8. 软考证书的作用!!!
  9. java如何造假数据_如何让数据“造假”更快更真?
  10. 在线教育App和小程序模版源码功能讲解