OpenGL入门知识点
------------本文知识点主要摘录自OpenGL编程指南(第三版)红宝书
/**************************************************************************************************************/
#include <whateverYouNeed.h>
main(){
InitializeAWindowPlease(); //占位符,初始化一个窗口 ##
glClearColor(0.0, 0.0, 0.0, 0.0);//glClearColor设定将窗口清除成某种背景色,以后每次调用glClear都会清除成这种颜色
glClear(GL_COLOR_BUFFER_BIT);//glClear清除窗口成某种颜色
glColor3f(1.0, 1.0, 1.0);//设定绘制物体所用颜色,以后绘制的物体都会使用这种颜色
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);//设定绘制时所采用的坐标系统
glBegin(GL_POLYGON);//OpenGL绘制图形的命令要放在glBegin和glEnd之间,GL_POLYGON有填充点围起来的区域,GL_POINTS只是单纯的画点
glVertex3f(0.25, 0.25, 0.0);//绘制一个点
glVertex3f(0.75, 0.25, 0.0);
glVertex3f(0.75, 0.75, 0.0);
glVertex3f(0.25, 0.75, 0.0);
glEnd();
glFlush();//强制刷新缓冲区(执行以上绘图命令)
UpdateTheWindowAndCheckForEvents();//占位符,管理窗口内容并进行事件处理 ##
}
/**************************************************************************************************************/
OpenGL中的函数用'gl'作为前缀,函数单词首字母大写;
常量以'GL_'作为前缀,全部单词大写,用'_'作连接符
数字,如glVertex3f中的'3'表示函数可以接收3个参数,'f'表示浮点数,'i'表示整数,'v'表示参数是一个指向值向量或数组的指针,如glColor3fv(color_array);
OpenGL是一个状态机
/**************************************************************************************************************/
//GLUT,OpenGL实用工具库,窗口管理:
/* 显示回调函数(display callback): mydisplay
每个GLUT程序都必须有一个显示回调函数(绘制图形)
用glutDisplayFunc(mydisplay)函数注册
只要OpenGL确定显示内容要被刷新时,显示回调函数就会被调用:例如,当窗口被打开的时候、窗口大小改变
*/
void main(int argc, char *argv[])
{
glutInit(&argc, argv); //对GLUT进行初始化,处理所有命令行参数
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);//设定窗口模式: RGBA或颜色索引模式 || 单缓冲或双缓冲窗口
glutInitWindowPosition(100, 100);//指定窗口左上角的屏幕位置
glutInitWindowSize(800, 600);//指定窗口大小
//glutInitContextFlags():指定想要使用的渲染环境类型
glutCreateWindow("Hello World!");//声明创建一个支持渲染的窗口
Init();//自定义初始化函数Init
glutDisplayFunc(myDisplay);//回调函数执行命令myDisplay
glutReshapeFunc(Reshape);//处理事件:当窗口大小改变时触发事件Reshape
glutKeyboardFunc(keyboard);//注册键盘函数
glutMouseFunc(mouse); // 注册鼠标处理函数
glutMainLoop(); //实际显示创建的那个窗口,启动程序(事件循环函数)
}
void Init()
{
glClearColor(0.0, 0.0, 0.0, 0.0);// 窗口背景的颜色
glShadeModel(GL_SMOOTH);//设置平滑颜色过渡模式(相当于在两种颜色间进行差值,想象一下线段的两个端点颜色不一样,线段中间该是什么颜色)
printf("这是一个演示程序!\n");//在窗口中给出提示
}
void Reshape(int w, int h)
{
glViewport(0, 0, (GLsizei) w, (GLsizei) h);//设置视口大小与窗口大小完全一致
glMatrixMode(GL_PROJECTION);//指定当前矩阵为投影矩阵
glLoadIdentity();//将投影矩阵初始化为单位矩阵
gluOrtho2D(0.0, (GLdouble) w, 0.0, (GLdouble) h);//定义二维投影矩阵,把圆点(0,0)定义在最左下角的地方
}
void myDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);//图之前先设置画图区的背景色
glColor3f (1.0f, 0.0f, 0.0f);//设置前景色(相当于画笔颜色)
LARGE_INTEGER Freq;
LARGE_INTEGER start;
LARGE_INTEGER end;
QueryPerformanceFrequency(&Freq); // 获取时钟周期
QueryPerformanceCounter(&start); // 获取时钟计数
switch(k)//选择算法
{
case 1:Bresenham(pt[0],pt[1]);break;
case 2:MidCircle(pt[0],pt[1]);break;
}
QueryPerformanceCounter(&end);// 获取时钟计数
printf("用时%d微秒\n",(end.QuadPart-start.QuadPart)*1000000/Freq.QuadPart);// 计时
glFlush();//强制刷新缓冲,保证绘图命令被立即执行
}
/**************************************************************************************************************/
//OpenGL几何图元
// 图元生成函数: glBegin(图元类型); 。。。glEnd().
glBegin(GL_POINTS); //画单个点
glColor3f(1.0,0.0,0.0);
glVertex2f(-10.0,11.0);
glColor3f(1.0,1.0,0.0);
glVertex2f(-9.0,10.0);
glColor3f(0.0,1.0,1.0);
glVertex2f(-8.0,12.0);
glEnd();
glBegin(GL_LINES);
glBegin(GL_LINE_STRIP); //
glBegin(GL_LINE_LOOP); //
glBegin(GL_POLYGON); //
glBegin(GL_QUADS); //
glBegin(GL_QUAD_STRIP); //
glBegin(GL_TRIANGLES); //
glBegin(GL_TRIANGLE_STRIP); //
glBegin(GL_TRIANGLE_FAN); //
glBegin(GL_LINES); //一对顶点被解释成一条直线
glColor3f(1.0,1.0,0.0);
glVertex2f(-11.0,8.0);
glVertex2f(-7.0,7.0);
glColor3f(1.0,0.0,1.0);
glVertex2f(-11.0,9.0);
glVertex2f(-8.0,6.0);
glEnd();
glBegin(GL_LINE_STRIP); //一系列的点连接成直线
glColor3f(0.0,1.0,0.0);
glVertex2f(-3.0,9.0);
glVertex2f(2.0,6.0);
glVertex2f(3.0,8.0);
glVertex2f(-2.5,6.5);
glEnd();
glBegin(GL_LINE_LOOP); //同上,但第一个点和最后一个点彼此相连
glColor3f(0.0,1.0,1.0);
glVertex2f(7.0,7.0);
glVertex2f(8.0,8.0);
glVertex2f(9.0,6.5);
glVertex2f(10.3,7.5);
glVertex2f(11.5,6.0);
glVertex2f(7.5,6.0);
glEnd();
glBegin(GL_POLYGON); //简单的凸多边形边界,内部填充
glColor3f(0.5,0.3,0.7);
glVertex2f(-7.0,2.0);
glVertex2f(-8.0,3.0);
glVertex2f(-10.3,0.5);
glVertex2f(-7.5,-2.0);
glVertex2f(-6.0,-1.0);
glEnd();
glBegin(GL_QUADS); //4个顶点被解释成一个四边形
glColor3f(0.7,0.5,0.2);
glVertex2f(0.0,2.0);
glVertex2f(-1.0,3.0);
glVertex2f(-3.3,0.5);
glVertex2f(-0.5,-1.0);
glColor3f(0.5,0.7,0.2);
glVertex2f(3.0,2.0);
glVertex2f(2.0,3.0);
glVertex2f(0.0,0.5);
glVertex2f(2.5,-1.0);
glEnd();
glBegin(GL_QUAD_STRIP); //四边形的连接串
glVertex2f(6.0,-2.0);
glVertex2f(5.5,1.0);
glVertex2f(8.0,-1.0);
glColor3f(0.8,0.0,0.0);
glVertex2f(9.0,2.0);
glVertex2f(11.0,-2.0);
glColor3f(0.0,0.0,0.8);
glVertex2f(11.0,2.0);
glVertex2f(13.0,-1.0);
glColor3f(0.0,0.8,0.0);
glVertex2f(14.0,1.0);
glEnd();
glBegin(GL_TRIANGLES); //3个顶点被解释成三角形
glColor3f(0.2,0.5,0.7);
glVertex2f(-10.0,-5.0);
glVertex2f(-12.3,-7.5);
glVertex2f(-8.5,-6.0);
glColor3f(0.2,0.7,0.5);
glVertex2f(-8.0,-7.0);
glVertex2f(-7.0,-4.5);
glVertex2f(-5.5,-9.0);
glEnd();
glBegin(GL_TRIANGLE_STRIP); //三角形的连接串
glVertex2f(-1.0,-8.0);
glVertex2f(-2.5,-5.0);
glColor3f(0.8,0.8,0.0);
glVertex2f(1.0,-7.0);
glColor3f(0.0,0.8,0.8);
glVertex2f(2.0,-4.0);
glColor3f(0.8,0.0,0.8);
glVertex2f(4.0,-6.0);
glEnd();
glBegin(GL_TRIANGLE_FAN); //连接成扇形的三角形系列
glVertex2f(8.0,-6.0);
glVertex2f(10.0,-3.0);
glColor3f(0.8,0.2,0.5);
glVertex2f(12.5,-4.5);
glColor3f(0.2,0.5,0.8);
glVertex2f(13.0,-7.5);
glColor3f(0.8,0.5,0.2);
glVertex2f(10.5,-9.0);
glEnd();
/**************************************************************************************************************/
//OpenGL基本状态
glEnable():启动一个功能
glDisable():关闭一个功能
/**************************************************************************************************************/
//视图和模型变换:形成模型视图矩阵,这个矩阵作用于物体坐标,产生视觉坐标
//视图变换:修改观察点的位置和方向
//模型变换:glTranslatef,glRotatef,glScalef
物体坐标--(顶点xyzw)--模型视图矩阵--(视觉坐标)--投影矩阵--(裁剪坐标)--透视除法--(规范化设备坐标)--视口交换--(窗口坐标)--
//投影变换
//投影变换类似照相机的选择镜头,用于确定视野或视景体。
// glFrustum透视投影:远处的物体看上去更小一些。glOrtho正投影:直接映射物体到屏幕上
指定视景体的形状和方向,决定了场景是如何投影到屏幕上的(正投影或透视投影),决定哪些部分被裁剪
//视口变换
//glViewport投影变换和视口变换共同决定了场景如何映射到屏幕上,投影变换指定了映射的发生机制,视口变换决定了场景所映射的有效屏幕区域的形状
指定如何把三维模型坐标转换成屏幕坐标
gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0,1.0,0.0);//类比照相机,把照相机放在(0,0,5),把镜头瞄准(0,0,0),把朝上向量指定为(0,1,0)
/**************************************************************************************************************/
//隐藏表面消除:消除实心物体被其它物体所遮挡的部分,使用深度缓冲区:glutInitDisplayMode (GLUT_DEPTH | GLUT_RGB);
/********************************************************************************************/
glMatrixMode设置当前矩阵模式:
GL_MODELVIEW,对模型视景矩阵堆栈应用随后的矩阵操作.
GL_PROJECTION,对投影矩阵应用随后的矩阵操作.
GL_TEXTURE,对纹理矩阵堆栈应用随后的矩阵操作.
与glLoadIdentity()一同使用
void Reshape(int w, int h)
{
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);//GL_PROJECTION表示把当前矩阵指定为用于投影变换,并且后续的变换调用所影响的是投影矩阵
glLoadIdentity();//把当前矩阵设置为单位矩阵,供变换使用
glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);//透视投影
//glOrtho(-10,10,-10,10,-30,30); //正交投影
glMatrixMode(GL_MODELVIEW);//GL_MODELVIEW表示之后的变换所影响的是模型视图矩阵,而不再是投影矩阵
//glMatrixMode(mode):指定需要修改的mode,有模型视图矩阵GL_MODELVIEW,投影矩阵GL_PROJECTION,纹理矩阵GL_TEXTURE
}
void display (void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1,0,0); //线的颜色
glLoadIdentity ( );
gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0,1.0,0.0);//类比照相机,把照相机放在(0,0,5),把镜头瞄准(0,0,0),把朝上向量指定为(0,1,0)
glScalef(1,2,1); //放缩函数:设置长宽高的比例为3:2:1
//glRotatef(45,0.0,0,1.0); //旋转函数,设置倾斜45度
//glTranslatef(0,0,0); //平移函数,设置绘图位置
glutWireCube(2.0); //绘制
glFlush();
}
/***********************************/
只绘制多边形的轮廓或顶点:
多边形具有正面和背面两个面。取决于哪一面朝向观察者,多边形可能会被渲染成不同的样子。
例如,可以通过下面两个调用,把多边形的正面画成填充形式,把背面画成轮廓形式:
glPolygonMode(GL_FRONT, GL_FILL);
glPolygonMode(GL_BACK, GL_LINE);
glShadeModel函数:用于控制opengl中绘制指定两点间其他点颜色的过渡模式
参数:GL_SMOOTH会出现过渡效果。GL_FLAT 则只是以指定的某一点的单一色绘制其他所有点
//启动光照
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0)
//启用纹理
glEnable(GL_TEXTURE_1D);
glEnable(GL_TEXTURE_GEN_S);
//消隐剔除背向面
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
==================================================================================================
什么是计算机图形学?
计算机图形学是研究通过计算机将数据转换为图形,并在专门显示设备上显示的原理、方法和技术的学科。它是建立在传统的图学理论、应用数学和计算机科学基础上的一门边缘学科。
什么是图形,图形与图像的区别:
图形是指能在人的视觉系统中产生视觉印象的客观对象,例如自然景物、拍摄到的图片,用数学方法描述的图形(如sin函数曲线)。图形可以是现实世界中已经存在的物体,也可以是完全虚构的物体。 图形是指由外部轮廓线条构成的矢量图。而图像是由像素点阵构成的位图。
|
图形 |
图像 |
1 |
数据量很少 |
数据量很大 |
2 |
有结构,便于编辑修改 |
无结构,不便于编辑修改 |
3 |
能准确表示3D 景物,易于生成所需的不同视图 |
3D 景物的信息巳部分丢失,很难生成所需的不同视图 |
4 |
生成视图需要复杂的计算 |
生成视图不需要复杂的计算 |
5 |
自然景物的表示很困难 |
自然景物的表示不困难 |
6 |
国际标准: GKS,PHIGS,OpenGL, WMF,VRML,CGM |
国际标准:JPEG,TIFF等 |
7 |
编辑软件(绘图软件): AutoCAD, CorelDRAW, 3D Max等 |
编辑软件(图像处理软件): Photoshop, Photostyler等 |
图形的表示方式:点阵和参数。几何数据和非几何数据
请举出10个计算机图形学的应用领域?
1.计算机辅助设计与制造——工业领域(CAD/CAM是CG在工业界最广泛、最活跃的应用领域。):飞机、汽车、船舶、机电、轻工、服装的外形设计。集成电路、印刷电路板的设计。建筑设计。
2.计算机动画——商业领域:广告设计,视频游戏,卡通动画片,影视特技
3.计算机艺术——艺术领域:计算机绘画。漫画创作。计算机平面合成艺术 。
4.非真实感绘制
5.系统环境模拟:飞行模拟
6事务和商务数据的图形显示
7地形地貌和自然资源的图形显示
8.科学计算可视化
9.虚拟手术仿真
10.多媒体应用
l 图形用户界面(GUI)
l 计算机辅助设计(CAD)
l 科学可视化( Scientific Visualization )
l 计算机艺术(Computer Art)
l 地理信息系统(GIS)
l 计算机动画、广告及娱乐
l 多媒体系统(Multimedia)
l 虚拟现实系统(Virtual Reality)
计算机图形学当前的研究热点
l 造型技术
l 真实感图形绘制技术
l 人机交互技术
l 与计算机网络技术的紧密结合
计算机图形系统的组成:
输入设备:三维鼠标,数据手套,头盔显示器,数据衣,扫描仪,数码相机,三维数字化仪
输出设备:光栅扫描显示器(阴极射线管显示器CRT,液晶显示器LCD等),平板显示器
阴极射线管显示器CRT组成:电子枪,聚焦系统,加速电极,偏转系统,荧光屏(荧光粉)。
CRT显示器分类:单色或彩色;偏转电场式或磁场式;随机扫描或光栅扫描。
电子枪:
n 电灯丝,阴极和控制栅组成
n 灯丝:产生热量
n 阴极:由灯丝加热发出电子束
n 控制栅:加上负电压后,能够控制通过其中小孔的带负电的电子束的强弱。通过调节负电压高低来控制电子数量,即控制荧光屏上相应点的亮度
CRT产生稳定图像所需要的最小刷新频率=1秒/荧光物质的持续发光时间
(例如)荧光物质的持续发光时间40毫秒,则CRT刷新频率就是 1000/40=25Hz
彩色CRT显示器:渗透型(随机扫描,射线穿透法)或多枪型(光栅扫描,影孔板法)。
如果每支电子枪发出的电子束的强度有256个等级,则显示器能同时显示256*256*256=16M种颜色,称为真彩系统(CRT三种)
光栅扫描显示系统组成:帧缓冲存储器,图形显示处理器,视频显示控制器。
帧缓冲存储器:帧缓冲存储器,俗称显存,可以是主存中划出的一个固定区域,也可以是一个独立的随机存取存储器。其主要功能是用来存储屏幕上像素的颜色值。帧缓存器中的存储单元与显示屏幕上的像素一一对应,帧缓存器中单元数目与显示器上像素的数目相同,各单元的数值决定了其对应像素的颜色,显示颜色的种类与帧缓存器中每个单元的数值位数有关。(黑白显示系统的帧缓冲器的每个单元只有一位)
RGB三基色:面向硬件设备(摄像机、扫描仪和投影仪等)
CMY三补色: 蓝绿(C, cyan),品红(M, magenta),黄(Y, yellow):用于彩色打印,
CMY与RGB关系:R=1-C,G=1-M,B=1-Y
显存容量:分辨率M*N、颜色个数K与显存容量V的关系:
2. 设计算机显示器的分辨率为1024×768,每个像素的颜色值用24位表示,回答下列问题:
(1)帧缓存的大小为多少?
(2)目前PC机的显存大小为什么要比所求值大很多?
(3)一个12×12的窗口中的图,最多同时可有多少种颜色?
答:1.若每个帧缓存中每个存储单元有24位(每种基色占8位),
即显示系统最多可同时产生2^24种颜色(24位真彩色)。
帧缓存的大小计算:1024×1024 × log2(2^24) /8 =3兆字节
2. 显存还包括深度缓冲、纹理内存等
3.12*12=144种
若存储器位长固定,则屏幕分辩率与同时可用的颜色种数成反比关系
多边形三种方法:逐点判断法;扫描线算法;边缘填充法
如何判断点在多边形的内外关系:射线法(射线与多边形交点个数,偶外奇内)
1.从待判别点 v 发出射线
2.求与多边形交点个数 k
3.k 的奇偶性决定了点与多边形的内外关系
扫描线算法的连贯性:
l 连贯性(Coherence)
n 边的连贯性(Edge Coherence)
u 某条边与当前扫描线相交,也可能与下一条扫描线相交
n 扫描线的连贯性(Scan-line Coherence)
u 当前扫描线与各边的交点顺序与 下一条扫描线与各边的交点顺序可能相同或类似
n 区间的连贯性(Span Coherence)
u 同一区间上的像素取同一颜色属性
区域填充:
区域的连通方式分为四连通和八连通。
种子填充算法:
4连通区域:区域中任意两点可通过上下左右四个方向互相到达
8连通区域:区域中任意两点可通过上下左右和对角线八个方向互相到达
八连通算法可以填充四连通区域,但是四连通算法不能填充八连通区域。四连通和八连通对边界的要求也是不同的。四连通边界为O,八连通边界需为O和X。
区域填充算法:种子填充算法,扫描线算法
只绘制多边形的轮廓或顶点:
多边形具有正面和背面两个面。取决于哪一面朝向观察者,多边形可能会被渲染成不同的样子。
例如,可以通过下面两个调用,把多边形的正面画成填充形式,把背面画成轮廓形式:
glPolygonMode(GL_FRONT, GL_FILL);
glPolygonMode(GL_BACK, GL_LINE);
glShadeModel函数:用于控制opengl中绘制指定两点间其他点颜色的过渡模式
参数:GL_SMOOTH会出现过渡效果。GL_FLAT 则只是以指定的某一点的单一色绘制其他所有点
走样:用离散量(像素)表示连续的量(图形)而引起的失真,称为走样,或称为混淆。
光栅图形的走样现象:阶梯(锯齿)状边界。图形细节失真。狭小图形遗失:动画序列中时隐时现,产生闪烁。
反走样方法:在图形显示过程中,用于减少或消除走样(混淆)现象的方法
提高分辨率方法。非加权区域采样。加权区域采样
图形走样现象的变现形式:阶梯状的图形边界、图形细节失真(显示图形的最小单位为像素、细长的矩形显示后成了加宽的矩形、更细的矩形将丢失)、狭小图形的遗失与动态图形的闪烁(多边形分布在像素间,不覆盖像素中心,不被显示狭小图形运动时,会间隔覆盖像素的中心,产生闪烁)
解决图形设备与计算机的通讯接口等问题,称为设备驱动程序
双缓冲技术:
– 应用于绘制区域更新频繁时
– 前缓冲(Front Buffer):显示绘制完成的场景
– 离屏后缓冲(Back Buffer):保存当前正在绘制的场景
– 图形驱动器控制对其进行交换,避免图像撕裂(Tearing)现象
实验123
画图说明直线/圆弧的中点画法原理
相关函数库:
OpenGL核心库(GL)
n OpenGL实用库(GLU)
n OpenGL辅助库(GLAUX)
n OpenGL工具库(GLUT)
n OpenGL对窗口系统的扩展(WGL,等等)
“opengl32.lib glu32.lib glut32.lib glaux.lib"
设计出一种画抛物线的方法。Y=ax2+bx+c.
如何画宽度大于1的直线,并说明该方法可能存在的问题?
图元的生成:是指完成图元的参数表示形式到点阵表示形式的转换。通常也称扫描转换图元
为什么需要齐次坐标?
n 对多个点计算多次不同的变换时,分别利用矩阵计算各变换导致计算量大
n 运算表示形式不统一
u 平移为“+”
u 旋转和放缩为“·”
n 统一运算形式后,可以先合成变换运算的矩阵,再作用于图形对象
什么是齐次坐标,齐次坐标与非齐次坐标间如何相互转换?
所谓齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示,将平移,旋转,放缩等几何变换的表示形式统一起来。
二维点(x,y)的齐次坐标表示为(hx,hy,h)。
(x,y)点对应的齐次坐标为三维空间的一条直线
用齐次坐标表示的二维平移、放缩、旋转变换的变换矩阵?
用齐次坐标表示的二维平移、放缩、旋转变换的逆变换矩阵?
变换矩阵:
平移:
旋转:
放缩:
利用复合变换实现关于任意参考点P(xr,yr)的旋转变换(写成矩阵相乘的形式)
利用复合变换求(xp,yp)关于任意直线y=ax+by+c的对称点坐标
图形变换:
5种基本变换:平移,旋转,放缩,对称,错切
解释opengl中以下函数的用法
l 基本几何变换函数
n 平移函数:glTranslate{fd}(tx, ty, tz)
u 对二维变换而言,取tz=0
n 旋转函数:glRotate{fd}(theta, vx, vy, vz)
u 向量(vx, vy, vz)为通过坐标原点旋转轴
u theta为旋转角的度数
n 放缩函数:glScale{fd}(sx, sy, sz)
u 相对坐标原点的缩放
u 当参数为负时,相对于平面进行对称变换
l 几个概念
n 裁剪窗口(Clipping Window) :需要显示的场景区域
u 又称为世界窗口或观察窗口,简称窗口
u 在世界坐标系(又称用户坐标系)内定义
n 视口(Viewport):指显示设备上用来显示图形的区域
u 又称视区,在设备(屏幕)坐标系内定义
n 裁剪(Clip):从场景中确定位于窗口内的图形
l OpenGL视口函数
n 定义函数:glViewport(xvmin,yvmin,vpwidth,vpheight);
n 视口为矩形
l 三维图形的基本研究内容
n 投影
n 三维形体的表示
n 消除隐藏面与隐藏线
n 建立光照明模型、真实感图形绘制方法
n 裁剪窗口(Clipping Window) :需要显示的场景区域
u 又称为世界窗口或观察窗口,简称窗口
u 在世界坐标系(又称用户坐标系)内定义
n 视口(Viewport):指显示设备上用来显示图形的区域
u 又称视区,在设备(屏幕)坐标系内定义
n 裁剪(Clip):从场景中确定位于窗口内的图形
裁剪窗口和视区的关系:
n 改变视口位置可以在输出设备的不同位置上观察物体
n 使用多个视口可以在屏幕不同的位置观察场景的不同部分
n 改变窗口的尺寸达到改变视口内显示对象的多少
n 改变视口的尺寸实现对象放缩
窗口到视区的变换
简要说明二维观察的过程。窗口裁剪的作用是什么?
窗口裁剪的作用:对图形做出正确的判断,选取可见信息提供给显示系统显示,去除不可见部分。
l 如何投影?
什么是消隐,为什么要进行消隐?
消隐是指消除被遮挡的不可见的线或面。消隐能体现真实感图形的绘制。
消隐算法中画家算法的基本思想?
消隐算法中的Z缓冲算法的基本思想?
Z 缓冲器算法:
帧缓冲器 -- 保存各像素颜色值,Z 缓冲器 -- 保存各像素处物体深度值
光照效果中的环境光、漫反射光、镜面反射光的特点
环境光指从周围环境的各个方向投射来的光,没有空间和方向上的特征,均匀地照射在物体的各个不同的表面上,并等量地向各个方向反射,是一种分布光源。
漫反射光是由物体表面的粗糙不平引起的,由点光源向周围所有方向发射等强度的光,它均匀地向各个方向传播,与视点无关。
镜面反射是物体表面对入射光的反射,产生高光效应。镜面反射光在空间的分布具有一定的方向性。
在计算光照效果中为什么要计算法向量?