硕士图形学Word文档下载推荐.docx
《硕士图形学Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《硕士图形学Word文档下载推荐.docx(9页珍藏版)》请在冰豆网上搜索。
5、使用下面的二维图形变换矩阵:
T=
产生变换的结果是。
6、5×
6的控制点网格可以构造片3次B样条曲面。
7、OpenGL三维平行投影函数是。
8、请写出斜二测投影的投影矩阵。
9、OpenGL视点变换函数是。
10、请写出OpenGL中清除深度缓存消隐的调用。
二、选择填空(选择正确的答案填入对应题号,每小题2分,共20分)
1、使用下列二维图形变换矩阵:
,产生变换的结果为。
A沿X坐标轴平移1个单位,同时沿Y坐标轴平移-1个单位
B绕原点逆时针旋转90度
C沿X坐标轴平移-1个单位,同时沿Y坐标轴平移1个单位
D绕原点顺时针旋转90度
2、下面哪个OpenGL函数的调用会改变材质的环境光系数。
AglMaterialfv(GL_FRONT,GL_AMBIENT,amb)
BglMaterialfv(GL_FRONT,GL_DIFFUSE,dif)
CglLightfv(GL_FRONT,GL_AMBIENT,amb)
DglLightfv(GL_FRONT,GL_DIFFUSE,dif)
3、下面那种特性是Bezier曲线不具有的。
A对称性B凸包性
C通过特征多边形的起点和终点D局部支柱性
4、下面几种连续变换,试问哪一种变换矩阵不能互换。
A两个连续的旋转变换B两个连续的平移变换
C两个连续的比例变换D平移变换与旋转变换
5、下列有关投影的叙述语句中,正确的论述为。
A透视投影与平行投影相比,能真实的反映物体的精确的尺寸和形状
B平行投影的投影中心到投影面距离是有限的
C透视投影的灭点可以有多个
D斜平行投影的投影线与投影面是垂直的
6、下面对于Bezier曲线端点的描述是最准确的。
A曲线过多边形的端点P1和Pn
B曲线与多边形的端点直线P1P2和PnPn-1相切
C曲线过多边形的端点P1和Pn并与端点直线P1P2和PnPn-1相切
D曲线无约束,仅与控制点有关。
7、下面那种方法不会减少图形走样现象。
A增加画线宽度B提高屏幕分辨率
C使用区域采样算法D使用加权区域采样
8、图形学使用齐次矩阵的原因是。
A便于矩阵运算B便于表示平移变换
C便于表示错切变换D有利于将二维图形变换为三维图形
9、下面哪项不是三次样条曲线的常用约束条件。
A自由端B抛物端C夹持端D闭合端
10、下面关于Bresenham圆弧生成算法描述正确的是。
ABresenham不必做四舍五入运算
BBresenham算法速度快但效果没有DDA方法好
CBresenham算法需要做除法
DBresenham算法只能绘制八分之一圆弧
三、问答题(共20分)
1、试写出关于直线
对称的组合变换矩阵(10分)
2、请简要说明鼠标追踪球算法。
(10分)
四、编程题(30分)
1、试编写函数,drawRotateRect(intx0,inty0,intx1,inty1,intn,floatdelt);
绘制如图所示的n个向内旋转矩形,其中x0,y0为矩形左上角坐标,x1,y1为矩形右下角坐标,delt为旋转角度,n为绘制矩形的数目。
(15分)
voiddrawRotateRect(intx0,inty0,intx1,inty1,intn,doubledelt);
解:
具体代码如下,
voiddrawRotateRect(intx0,inty0,intx1,inty1,intn,doubledelt)
{
inti,j,xm,ym,tx,ty;
intr[4][2];
doublesinAF,cosAF,s;
xm=(x0+x1)/2;
ym=(y0+y1)/2;
sinAF=sin(delt);
cosAF=cos(delt);
s=1.0/(sinAF+cosAF);
r[0][0]=x0;
r[0][1]=y0;
r[1][0]=x0;
r[1][1]=y1;
r[2][0]=x1;
r[2][1]=y1;
r[3][0]=x1;
r[3][1]=y0;
for(i=0;
i<
4;
i++){
drawLine(r[i][0],r[i][1],r[(i+1)%4][0],r[(i+1)%4][1]);
}
for(j=0;
j<
n;
j++){
//
(1)平移到矩形中心
r[i][0]-=xm;
r[i][1]-=ym;
//
(2)旋转角度delt
tx=(int)(cosAF*r[i][0]-sinAF*r[i][1]);
ty=(int)(sinAF*r[i][0]+cosAF*r[i][1]);
r[i][0]=tx;
r[i][1]=ty;
//(3)缩放
r[i][0]=(int)(r[i][0]*s);
r[i][1]=(int)(r[i][1]*s);
//(4)反平移
r[i][0]+=xm;
r[i][1]+=ym;
}
}
2、用glsl语言编写顶点和片段Shader程序,点光源的逐点光照效果。
在OpenGL中假定,不管观察者的角度如何,得到的散射光强度总是相同的。
散射光的强度与光源中散射光成分以及材质中散射光反射系数相关,此外也和入射光角度与物体表面法线的夹角相关。
OpenGL用下面的公式计算散射光成分:
I是反射光的强度,Ld是光源的散射成分(gl_LightSource[0].diffuse),Md是材质的散射系数(gl_FrontMaterial.diffuse)。
这个公式就是Lambert漫反射模型。
Lambert余弦定律描述了平面散射光的亮度,正比于平面法线与入射光线夹角的余弦。
在顶点shader中要实现这个公式,需要用到光源参数中的方向、散射成分强度,还要用到材质中的散射成分值。
因此使用此shader时,在OpenGL中需要像在平时一样设置好光源。
注意:
由于没有使用固定功能流水线,所以不需要对光源调用glEnable。
要计算余弦值,首先要确保光线方向向量(gl_LightSource[0].position)与法线向量都是归一化的,然后就可以使用点积得到余弦值。
对方向光,OpenGL中保存的方向是从顶点指向光源,与上面图中画的相反。
OpenGL将光源的方向保存在视点空间坐标系内,因此我们需要把法线也变换到视点空间。
完成这个变换可以用预先定义的一致变量gl_NormalMatrix。
这个矩阵是模型视图变换矩阵的左上3×
3子矩阵的逆矩阵的转置。
以下就是上述内容的顶点shader代码:
voidmain()
vec3normal,lightDir;
vec4diffuse;
floatNdotL;
/*firsttransformthenormalintoeyespaceandnormalizetheresult*/
normal=normalize(gl_NormalMatrix*gl_Normal);
/*nownormalizethelight'
sdirection.Notethataccordingtothe
OpenGLspecification,thelightisstoredineyespace.Alsosince
we'
retalkingaboutadirectionallight,thepositionfieldisactually
direction*/
lightDir=normalize(vec3(gl_LightSource[0].position));
/*computethecosoftheanglebetweenthenormalandlightsdirection.
Thelightisdirectionalsothedirectionisconstantforeveryvertex.
Sincethesetwoarenormalizedthecosineisthedotproduct.Wealso
needtoclamptheresulttothe[0,1]range.*/
NdotL=max(dot(normal,lightDir),0.0);
/*Computethediffuseterm*/
diffuse=gl_FrontMaterial.diffuse*gl_LightSource[0].diffuse;
gl_FrontColor=NdotL*diffuse;
gl_Position=ftransform();
在片断shader中要做的就是使用易变变量gl_Color设置颜色。
gl_FragColor=gl_Color;
图显示了应用此shader的茶壶效果。
注意茶壶的底部非常黑,这是因为还没有使用环境光的缘故。
加入环境光非常容易,只需要使用一个全局的环境光参数以及光源的环境光参数即可,公式如下所示:
前面的顶点shader中需要加入几条语句完成环境光的计算:
vec4diffuse,ambient,globalAmbient;
/*ComputetheambientandglobalAmbientterms*/
ambient=gl_FrontMaterial.ambient*gl_LightSource[0].ambient;
globalAmbient=gl_FrontMaterial.ambient*gl_LightModel.ambient;
gl_FrontColor=NdotL*diffuse+globalAmbient+ambient;