计算机图形学复习下

计算机图形学复习下

四、二维变换

番外:数学基础
数学
在这里插入图片描述
4.1齐次坐标

由n+1维向量表示一个n维向量,其中h称为哑坐标。
   (x,y)<=(xh,yh,h)   h不等于0
1、h可以取不同的值,同一点的齐次坐标不是唯一的。
如普通坐标系下的点(2,3)变换为齐次坐标可以是(4,6,2)(6,9,3)等。
 2、 普通坐标与齐次坐标的关系为“一对多”
 由普通坐标*h→齐次坐标
 由齐次坐标÷h→普通坐标
 3、 当h=1时产生的齐次坐标称为“规格化坐标”。
   (x,y)<=(x,y,1)

齐次坐标的优点:

1. 将各种变换用阶数统一的矩阵来表示。
2. 便于表示无穷远点。
3. 变换具有统一表示形式的优点

4.2基本几何变换

基本几何变换都是相对于坐标原点和坐标轴进行的几何变换。

使用齐次坐标前:在这里插入图片描述
使用齐次坐标后:
在这里插入图片描述
多边形的变换
在这里插入图片描述
在这里插入图片描述
4.3复合变换

多个变换的组合;
可通过单个变换矩阵来计算矩阵乘积;
连续变换时,先计算变换矩阵,再计算坐标;

相对任一参考点(xF,yF)作二维几何变换,其变换过程为:

(1) 平移;
(2) 针对原点进行二维几何变换;
(3) 反平移。

在这里插入图片描述
相对任意方向的二维几何变换,其变换的过程是:

(1) 旋转变换;
(2) 针对坐标轴进行二维几何变换;
(3) 反向旋转。

例子:任一图形关于任意的反射轴y=a+bx的反射变换
在这里插入图片描述
在这里插入图片描述
4.4变换的性质

1.直线的中点不变性;
2.平行直线的不变性;
3.相交不变性:两条直线相交,交点变换后仍是交点;
4.仅包含旋转、平移和反射的仿射变换维持角度和长度的不变性;
5.比例变换可改变图形的大小和形状;
6.错切变换引起图形角度关系的改变,甚至导致图形发生畸变。

五、二维观察

基本概念

用户坐标系(world coordinate system,WC):用户定义自己的图形时所采用的坐标系。笛卡儿坐标系,坐标为实数,范围从负无穷到正无穷。  
设备坐标系(device coordinate system,DC):图形输出设备(如显示器、绘图机)上的坐标系;是一个二维平面坐标系;定义域是整数域且有界
窗口区(window):在计算机图形学中,将在用户坐标系中需要进行观察和处理的一个坐标区域称为窗口(Window)。
视图区(viewport):将窗口映射到显示设备上的坐标区域称为视区(Viewport)。

在二维观察中,需要对窗口进行裁剪,即只保留窗口内的那部分图形,去掉窗口外的图形。

假设窗口是标准矩形,即边与坐标轴平行的矩形,由上(y=wyt)、下(y=wyb)、左(x=wxl)、右(x=wxr)四条边描述。

5.1直线段的裁剪

(1)编码裁剪算法(Cohen-Sutherland算法)
(2)中点分割算法
(3)Liang-Barsky算法

算法基本思想:

对每条直线段p1(x1,y1)p2(x2,y2)分三种情况处理:
(1)  直线段完全可见,“简取”之。
(2)  直线段完全不可见,“简弃”之。
(3) 直线段既不满足“简取”的条件,也不满足“简弃”的条件,需要对直线段按交点进行分段,分段后重复上述处理。 

(1)编码裁剪算法(Cohen-Sutherland算法)

编码:

对于任一端点(x,y),根据其坐标所在的区域,赋予一个4位的二进制码D3D2D1D0。

编码规则如下:

若x<wxl,则D0=1,否则D0=0;
若x>wxr,则D1=1,否则D1=0;
若y<wyb,则D2=1,否则D2=0;
若y>wyt,则D3=1,否则D3=0。

在这里插入图片描述
裁剪:

裁剪一条线段时,先求出端点p1和p2的编码code1和code2,然后:
(1)若code1|code2=0,对直线段应简取之。
(2)若code1&code2≠0,对直线段可简弃之。
若上述判断条件不成立,则需求出直线段与窗口边界的交点。假定直线的端点坐标为(x1,y1)和(x2,y2)
左、右边界交点的计算:y = y1 + k(X - x1);
上、下边界交点的计算:x = x1 + (Y-y1)/k。
k=(y2-y1)/(x2-x1)。

算法的步骤:

(1) 输入直线段的两端点坐标:p1(x1,y1)、p2(x2,y2),以及窗口的四条边界坐标:wyt、wyb、wxl和wxr。
(2)  对p1、p2进行编码:点p1的编码为code1,点p2的编码为code2。
(3)若code1|code2=0,对直线段应简取之,转(6);否则,若code1&code2≠0,对直线段可简弃之,转(7);
    当上述两条均不满足时,进行步骤(4)。
(4)  确保p1在窗口外部:若p1在窗口内,则交换p1和p2的坐标值和编码。
(5)  按左、右、上、下的顺序求出直线段与窗口边界的交点,并用该交点的坐标值替换p1的坐标值。
也即在交点s处把线段一分为二,并去掉p1s这一段。考虑到p1是窗口外的一点,因此可以去掉p1s。转(2)。
(6)  用直线扫描转换算法画出当前的直线段p1p2。
(7)  算法结束。 

核心代码:

int encode(float x,float y)//每个点的编码
{
	int code;
	int c=0;
	if(x<xl)
		c=c|LEFT;
	else if(x>xr)
		c=c|RIGHT;
	if(y<yb)
		c=c|BOTTOM;
	else if(y>yt)
		c=c|TOP;
	code=c;
	return code;
}

int Cohen(float x1,float y1,float x2,float y2,int color)//具体剪切算法
{
	setlinecolor(WHITE);  
	line((int)x1,(int)y1,(int)x2,(int)y2);
	int code1,code2,code;
	float x,y;
	code1=encode(x1,y1);
	code2=encode(x2,y2);
	while((code1!=0) || (code2!=0))  
	{
		if((code1&code2)!=0)   
			return 0;
		code=code1;          
		if(code1==0)            
			code=code2;
		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);
		}
		if(code==code1)
		{
			x1=x;y1=y;code1=encode(x,y);  
		}
		else
		{
			x2=x;y2=y;code2=encode(x,y);    
		}
	}
		setlinecolor(color);
		line((int)x1,(int)y1,(int)x2,(int)y2);
		return 0;
}

算法特点:

1.实现了对完全可见和不可见直线段的快速接受和拒绝;
2.求交过程复杂,并且包含浮点运算,不利于硬件实现。
3.适合特大或特小窗口。

(2)中点分割算法

算法基本思想:

设要裁剪的线段是P0P1。中点分割算法可分成两个平行的过程进行,
即从P0点出发找出离P0最远的可见点(下图中的B点),
和从P1点出发找出离P1最远的可见点(下图中的A点)。
这两个可见点的连线就是原线段的可见部分。

在这里插入图片描述
二分逼近思想找端点的最远可见点:

(1)取中点Pm = (P0+P1) / 2
(2)判断中点和窗口间的关系:
     若Pm在窗口内,则用P1Pm代替P0p1;
     若Pm和P1在窗口同侧外面,则用P0Pm代替p0P1;
     若Pm和p1在窗口异侧,则用p1Pm代替P0P1。
(3)再对新的P0 P1重复(1)(2)
 直到长度小于给定的常数ε为止。

算法的步骤:

(1)以P1出发,检测点P2是否在窗口内,若是,即是所求点;若不是,转(2)
(2)检测点P1P2是否在同一外侧,若是,则不在窗口内;返回;不是,转(3)
(3)求出该直线段的中点P3。检测P3与P1P2的关系:
    若中点P3在窗口内,用P3代替P1;重复步骤(3);
    若中点P3不在窗口内,判断P3与P2的关系,
    若P3、P2在同侧外面,则用P3代替P2,即丢掉P2P3段;
    若不在同侧外面,则用P3代替P1,重复步骤(3)。
    直到满足误差条件,则该中点就是该线段落距离P1最远的可见点。
(4)重复步骤(2)-(3),求出另一个端点P2的最远可见点坐标。

核心代码:

bool judge(double xx,double yy)//判断(xx,yy)是否是距离边界最近的点
{
	if(fabs(xx-xl)<1 || abs(xx-xr)<1 || abs(yy-yb)<1 || abs(yy-yt)<1)
		return false;
	else
		return true;
}
bool center1(double x1,double y1,double x2,double y2,int *x,int *y)
{
	int code1,code2,code;
	double xx,yy;
	encode(x1,y1,&code1);
	encode(x2,y2,&code2);
	if(code1==0)
	{
		*x=x1;*y=y1;   
	}
	else if((code1&code2)!=0)
	{
		return false;    
	}
	else
	{
		do{
			xx=(x1+x2)/2.0;   
		    yy=(y1+y2)/2.0;
			encode(x1,y1,&code1);
			encode(x2,y2,&code2);
			encode(xx,yy,&code);
			if(code==0)    
			{
				x2=xx;
				y2=yy;
				encode(x2,y2,&code2);    
			}
			else
			{
				if((code&code1)!=0) 
				{
					x1=xx;
					y1=yy;
					encode(x1,y1,&code1);
				}
				else
				{
					x2=xx;
					y2=yy;
					encode(x2,y2,&code2);
				}
			}*x=xx;*y=yy;
		}while(judge(xx,yy));	
	}
	return true;
}

(3)Liang-Barsky算法

算法基本思想:

设要裁剪的线段是P0P1。 
P0P1和窗口边界交于A,B,C,D四点,见图。
算法的基本思想是从A,B和P0三点中找出最靠近P1的点,图中要找的点是B。
从C,D和P1中找出最靠近P0的点。图中要找的点是P1 点。
那么P1B就是P0P1线段上的可见部分。

在这里插入图片描述
线段的参数表示:

x=x0+u△x       y=y0+u△y        0<=u<=1
△x=x1-x0       △y=y1-y0

窗口边界的四条边分为两类:始边和终边:
在这里插入图片描述
求交:

求出P0P1与两条始边的交点参数u0, u1 , 令ul=max(u0 ,u1,0),则ul即为三者中离P1最近的点的参数
求出P0P1与两条终边的交点参数u2, u3, 令uu=min(u2,u3,1) ,则uu即为三者中离P0最近的点的参数
若uu > ul,则可见线段区间 [ul , uu]
若ul > uu ,则线段不可见。

在这里插入图片描述
裁剪条件:(点在窗口内)

(1)
xL<=x0+u△x <=xR
yB<=y0+u△y <=yT
△x =x1-x0 △y =y1-y0
(1)化简得(2)
(2)
-u△x <= x0-xL   u△x <= xR-x0
-u△y <= y0-yB   u△y <= yT-y0
假设:
 p1=  - △x         q1= x0-xL 
 p2 =  △x          q2= xR-x0
 p3 =  - △y        q3= y0-yB 
 p4 =  △y          q4= yT-y0
 即u*pk<=qk(k=1,2,3,4)

裁剪情况:

情形一 pk=0:

(1)    Δx=0,p1=p2=0(如下图a)
若q1<0或q2<0,则可删除直线段
若q1>=0且q2>=0,则进一步判断
           u=qk/pk(k=3,4)
令 u1=max(0,u|pk<0)
   u2=min(1,u|pk>0)
若u1>u2,则可删除直线段
若u1<=u2,将u1,u2代入直线方程,得到直线段的两个可见端点。

(2) Δy=0, p3=p4=0(如下图b)
若q3<0或q4<0,则可删除直线段
若q3>=0且q4>=0,则进一步判断
           u=qk/pk(k=1,2)
令 u1=max(0,u|pk<0)
   u2=min(1,u|pk>0)
若u1>u2,则可删除直线段
若u1<=u2,将u1,u2代入直线方程,得到直线段的两个可见端点。

在这里插入图片描述

情形二 pk≠0

    u=qk/pk(k=1,2,3,4)
令 u1=max(0,u|pk<0,u|pk<0)
   u2=min(1,u|pk>0, u|pk>0)
若u1>u2,则可删除直线段
若u1<=u2,将u1,u2代入直线方程,得到直线段的两个可见端点。

算法的步骤:

(1)输入直线段的两端点坐标以及窗口的四条边界坐标。
(2)若Δx=0,则p1=p2=0。进一步判断是否满足q1<0或q2<0,若满足,则该直线段不在窗口内,转(7)。
否则,满足q1>0且q2>0,则进一步计算u1和u2。转(5)。
(3)若Δy=0,则p3=p4=0。进一步判断是否满足q3<0或q4<0,若满足,则该直线段不在窗口内,转(7)。
   否则,满足q1>0且q2>0,则进一步计算u1和u2。转(5)。
(4)若上述两条均不满足,则有pk≠0(k=1,2,3,4)。此时计算u1和u2。
(5)求得u1和u2后,进行判断:若u1>u2,则直线段在窗口外,转(7)。
   若u1<u2,利用直线的参数方程求得直线段在窗口内的两端点坐标。
(6)利用直线的扫描转换算法绘制在窗口内的直线段。
(7)算法结束。

核心代码:

bool ClipT(double p,double q,double &t0,double &t1)
{
	double r;
	if(p<0)
	{
		r=(double)q/(double)p;
		if(r>t1)
			return false;
		else if (r>t0)
		{
			t0=r;
			return true;
		}
	}
	else if (p>0)
	{
		r=(double)q/(double)p;
		if(r<t0)
			return false;
		else if(r<t1)
		{
			t1=r;
			return true;
		}
	}
	else if(q<0)
		return false;
	return true;
}
void liang(double x1,double y1,double x2,double y2)
{
	double dx,dy,umin,umax;
	umin=0;umax=1;
	dx=x2-x1;
	if(ClipT(-dx,x1-xl,umin,umax)) 
		if(ClipT(dx,xr-x1,umin,umax))
		{
			dy=y2-y1;
			if(ClipT(-dy,y1-yb,umin,umax))                                
				if(ClipT(dy,yt-y1,umin,umax))   	                         	
				      line((int)(x1+umin*dx),(int)(y1+umin*dy),(int)(x1+umax*dx),(int)(y1+umax*dy));
		}
}

(4)直线段裁剪算法的比较

Cohen-Sutherland算法创新性地提出了直线端点的编码规则;但需要计算直线和窗口的交点;
中点分割算法避免了求交,只需计算中点坐标即可完成,但需递归过程;
Liang-Barsky通过参数t的计算,把二维裁剪问题转化成为一维裁剪问题,故效率最高。

5.2多边形的裁剪

(1)逐边裁剪算法 (Sutherland-Hodgman算法)
(2)双边裁剪算法(Weiler-Athenton算法)

(1)逐边裁剪算法 (Sutherland-Hodgman算法)

分割处理策略:将多边形关于矩形窗口的裁剪分解为多边形关于窗口四边所在直线的裁剪。

基本思想:一次用窗口的一条边裁剪多边形。

(1)为窗口各边界裁剪的多边形存储输入与输出顶点表。
   在窗口的一条裁剪边界处理完所有顶点后,其输出顶点表将用窗口的下一条边界继续裁剪。
(2)窗口的一条边以及延长线构成的裁剪线,该线把平面分成两个部分:可见一侧;不可见一侧。
(3)多边形的各条边的两端点S、P。它们与裁剪线的位置关系只有四种。(如下图)
情况(1)仅输出顶点P;
情况(2)输出0个顶点;
情况(3)输出线段SP与裁剪线的交点I;
情况(4)输出线段SP与裁剪线的交点I和终点P

在这里插入图片描述
实例:

注意:
(1)交点是边与裁剪线的交点
(2)边的顶点是有序的

在这里插入图片描述
算法特点:

(1)上述算法仅用一条裁剪边对多边形进行裁剪,得到一个顶点序列,作为下一条裁剪边处理过程的输入。
(2)可推广到任意凸多边形裁剪窗口
(3)对凸多边形应用本算法可以得到正确的结果,但是对凹多边形的裁剪将如图所示显示出一条多余的直线。
(4)解决这个问题有多种方法,
   一是把凹多边形分割成若干个凸多边形,然后分别处理各个凸多边形。
   二是修改本算法,沿着任何一个裁剪窗口边检查顶点表。

(2)双边裁剪算法(Weiler-Athenton算法)

主多边形:被裁剪多边形,记为A ;
裁剪多边形:裁剪窗口,记为B ;

主多边形和裁剪多边形把二维平面分成两部分。
内裁剪:A∩B 图元位于窗口之内的部分;
外裁剪:A-B 图元位于窗口之外的部分;

裁剪结果区域的边界由A和B的部分边界构成;
在交点处边界发生交替,即由A的边界转至B的边界,或由B的边界转至A的边界;

Weiler-Atherton多边形裁剪基本思想:

从被裁剪多边形的一个入点开始,碰到入点,沿着被裁剪多边形按顺时针方向搜集顶点序列;
遇到出点时,则沿着裁剪窗口按顺时针方向搜集顶点序列。
如此交替地沿着两个多边形的边线行进,直到回到起始点。
若存在分裂的多边形,需将搜集过的入点的入点记号删去,以免重复跟踪。将所有的入点搜集完毕后算法结束。

被裁剪多边形和裁剪窗口的交点成对出现。这些交点分成两类:“入”点,如图中a、c、e;“出”点,如图中b、d、f。
在这里插入图片描述
算法实现步骤:

1、顺时针输入被裁剪多边形顶点序列Ⅰ放入数组1中。
2、顺时针输入裁剪窗口顶点序列Ⅱ放入数组2中。
3、求出被裁剪多边形和裁剪窗口相交的所有交点,并给每个交点打上“入”、“出”标记。
   将交点按顺序插入序列Ⅰ得到新的顶点序列Ⅲ,并放入数组3中;
   同样也将交点按顺序插入序列Ⅱ得到新的顶点序列Ⅳ,放入数组4中;
4、初始化输出数组Q,令数组Q为空。接着从数组3中寻找“入”点。如果“入”点没找到,程序结束。
5、如果找到“入”点,则将“入”点放入S中暂存。
6、将“入”点录入到输出数组Q中。并从数组3中将该“入”点的“入”点标记删去。
7、沿数组3顺序取顶点:
   如果顶点不是“出点”,则将顶点录入到输出数组Q中,流程转第7步。
   否则,流程转第8步。
8、沿数组4顺序取顶点:
   如果顶点不是“入点”,则将顶点录入到输出数组Q中,流程转第8步。
   否则,流程转第9步。
9、如果顶点不等于起始点S,流程转第6步,继续跟踪数组3。否则,将数组Q输出;
10、流程转第4步,寻找可能存在的分裂多边形。满足“入”点没找到的条件时,算法结束。

Weiler-Atherton裁剪算法特点:

1、裁剪窗口可以是矩形、任意凸多边形、任意凹多边形。
2、可实现被裁剪多边形相对裁剪窗口的内裁或外裁,即保留窗口内的图形或保留窗口外的图形,
   因此在三维消隐中可以用来处理物体表面间的相互遮挡关系。
3、裁剪一次完成,与裁剪窗口的边数无关。

六、三维变换及三维观察

6.1三维齐次坐标变换矩阵
在这里插入图片描述
相对于任一参考点F(xf,yf,zf)作比例、对称等变换的过程分为以下三步:

(1)将参考点F移至坐标原点;
(2)针对原点进行三维几何变换;
(3)进行反平移。

6.2三维复合变换
例子:绕任意轴的三维旋转变换
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

针对任意方向轴的三维旋转变换可用五个步骤来完成:

(1)使任意方向轴的起点与坐标原点重合,此时进行平移变换。
(2)使方向轴与某一坐标轴重合,此时需进行旋转变换,且旋转变换可能不止一次。
(3)针对该坐标轴完成变换。
(4)用逆旋转变换使方向轴回到其原始方向。
(5)用逆平移变换使方向轴回到其原始位置。

6.3投影变换——平面几何投影变换
在这里插入图片描述
在这里插入图片描述
(1)平行投影

投影中心与投影平面之间的距离为无限;
可分成两类:正投影和斜投影;
当投影面与某一坐标轴垂直时,得到的投影为三视图;否则,得到的投影为正轴测图;
斜投影图,即斜轴测图,是将三维形体向一个单一的投影面作平行投影,但投影方向不垂直于投影面所得到的平面图形。

三视图的计算步骤:

(1) 确定三维形体上各点的位置坐标
(2) 引入齐次坐标,求出所作变换相应的变换矩阵
(3) 将所作变换用矩阵表示,通过运算求得三维形体上各点(x,y,z)经变换后的相应点(x',y')或(y',z') 
(4) 由变换后的所有二维点绘出三维形体投影后的三视图。

(2)透视投影

透视投影变换:所有点沿着一组汇聚到一个称为投影中心的位置的线进行投影。
视点:投影中心。
投影面:位于视点与立体之间的平面。

6.4三维裁剪

三维裁剪保留所有在观察空间内的图形以便在输出设备中显示,所有在观察空间外的图形被丢弃。
三维直线段的裁剪
多边形面的裁剪

七、消隐

7.1基本概念

消隐的对象:

三维物体;
三维体的表示主要采用边界(多边形)表示;

消隐结果:

与观察物体有关,也与视点位置和方向有关;

在这里插入图片描述
按消隐对象分类:

1.线消隐
消隐对象是物体上的边,消除的是物体上不可见的边。  
2.面消隐 
消隐对象是物体上的面,消除的是物体上不可见的面。
	 Z缓冲器算法
	 区间扫描线算法
     深度排序算法
	 光线投射算法

消隐算法的分类:

图像空间的消隐算法:以窗口内的每个像素为处理单元;如Z-buffer、区间扫描线算法
物体空间的消隐算法:以场景中的物体为处理单元;如深度排序算法

基本的原则

排序:各景物表面按照距离视点远近排序的结果,用于确定消隐对象之间的遮挡关系。
连贯性:连贯性是指所考察的物体或视区内的图像局部保持不变的一种性质,用于提高排序效率。
物体连贯性               面的连贯性
区域连贯性               扫描线连贯性
深度连贯性

7.2深度缓存器(Z-Buffer)算法

组成:

帧缓冲器 -- 保存各像素颜色值;
Z 缓冲器  -- 保存各像素处物体深度值;
Z 缓冲器中的单元与帧缓冲器中的单元一一对应.

算法思想

(1)先将 Z 缓冲器中个单元的初始值置为最小值
(2)多边形投影时,当要改变某个像素的颜色值时,首先检查当前多边形的深度值是否大于该像素原来的深度值(保存在该像素所对应的Z缓冲器的单元中)
A:如果大于,说明当前多边形更靠近观察点,用它的颜色替换像素原来的颜色;同时保存深度值
B:否则说明在当前像素处,当前多边形被前面所绘制的多边形遮挡了,是不可见的,像素的颜色值不改变

在这里插入图片描述
特点:

Z缓冲器算法是所有图像空间算法中最简单的隐藏面消除算法。
它在象素级上以近物取代远物,与形体在屏幕上的出现顺序无关。

优点:1)简单稳定,利于硬件实现
      2)不需要整个场景的几何数据
缺点: 1)需要一个额外的Z缓冲器
	  2)在每个多边形占据的每个像素处都要计算深度值,计算量大     

7.3区间扫描线算法

基本思想

多边形P1、P2的边界在投影平面上的投影将一条扫描线划分成若干个区间[0,u1][u1,u2][u2,u3][u3,u4],[u4,umax],
覆盖每个区间的有0个、1个或多个多边形,但仅有一个可见。在区间上任取一个像素,
计算该像素处各多边形(投影包含了该像素的多边形)的深度值,深度值最大者即为可见多边形,
用它的颜色显示整个区间。

在这里插入图片描述
7.4深度排序算法(画家算法)

算法基本思想:

1)先把屏幕置成背景色;
2)将场景中的物体按其距观察点的远近进行排序,结果放在一张线性表中;
   线性表构造:距观察点远的称优先级低,放在表头;距观察点近的称优先级高,放在表尾。该表称为深度优先级表
3)然后按照从远到近(从表头到表尾)的顺序逐个绘制物体。

7.5光线投射算法

算法步骤

将通过绘图窗口内每一个像素的投影线与场景中的所有多边形求交。如果有交点,
用深度值最大的交点(最近的)所属的多边形的颜色显示相应的像素;
如果没有交点,说明没有多边形的投影覆盖此像素,用背景色显示即可。

八、真实感图形绘制

8.1简单光照明模型

简单光照明模型亦称局部光照明模型,其假定物体是不透明的,只考虑光源的直接照射,而将光在物体之间的传播效果笼统地模拟为环境光。

可以处理物体之间光照的相互作用的模型称为整体光照明模型

光照射到物体表面,主要发生:
			反射
			透射(对透明物体)
			部分被吸收成热能
			
反射光,透射光决定了物体所呈现的颜色。

简单光照明模型模拟物体表面对光的反射作用,光源为点光源。

反射作用分为:
物体间作用环境光(Ambient Light);
漫反射(Diffuse Reflection);
镜面反射(Specular Reflection);

8.2基于简单光照模型的多边形绘制方法

分类:均匀着色与光滑着色

均匀着色
方法:任取多边形上一点,利用光照明方程计算出它的颜色,用这个颜色填充整个多边形
适用场合:
	1)光源在无穷远处;
	2)视点在无穷远处;
	3)多边形是物体表面的精确表示
缺点:产生的图形效果不好。

光滑着色,亦称插值着色
Gouraud着色方法-光强插值
Phong着色方法

8.3透明处理

8.4整体光照明模型与光线跟踪算法

物体表面入射光的构成
(1)光源直接照射
(2)其它物体的反射光
(3)透射光
局部光照明模型仅考虑了(1);

Witted光照模型:Il= Ill + Ks Isl + KtItl
Isl为镜面反射方向的入射光强度;Ks为镜面反射系数,为0~1之间的一个常数
Itl为折射方向光强,Kt为透射系数,是0 ~ 1之间的常数
Ill的计算可采用Phong模型

  • 7
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值