计算机图形学计算机图形学_第1页
计算机图形学计算机图形学_第2页
计算机图形学计算机图形学_第3页
计算机图形学计算机图形学_第4页
计算机图形学计算机图形学_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机图形学

-------------------------------------\

中国科学技术大学数学系

邓建松

dengjs@

第十章之第四节

OpenGL中的

曲线和曲面

主要内容

•介绍OpenGL的求值器

•学会显示多项式曲线和曲面

•讨论OpenGL中的二次曲面

GLUT的二次曲面

GLU的二次曲面

OpenGL支持什么?

•求值器(evaluator):利用Bernstein多项式

进行工作的一般机制

•可以应用任意次数的多项式

•可以处理一到四维的情形

•自动生成法向和纹理坐标

•在GLU中支持NURBS

•二次曲面

•GLU和GLUT都包含对二次曲面的多项式近似

功能

单变量求值器

•在一组指定点计算任意次数Bernstein多

项式的值

•可以计算许多量

沿二、三或四维曲线上变化的点

颜色

法向

纹理坐标

•可以建立多个求值器,都计算同一个值

建立求值器

希望计算的类型

U的最大值和最小值

glMaplf(typeAu_minAu_maxAstrideA

orderpointer_to_array)\

/A\数据点上间的间隔

多项式次数加1,即阶数\

控制数翥的指针

每种类型都必须用glEnable(type)进行激活

示例

考虑在[0,1]区间的三次B6zier曲线的求值器

floatdata[]={......};*/三维数据/*

glMaplf(GL_MAP1_VERTEX_3,0.0,1.0,3,4,data);

三维顶点数据/三次,四阶

数据的安排方式为x,y,z,x,y,z......

glEnable(GL_MAP1_VERTEX_3);

计算

・函数glEvalCoordlf(u)就会使得被激

活的求值器计算特定的u对应的值

可以取代glV㊀rt㊀x,glNormal,

glT㊀xCoord

•U的值不必等间距

示例

•考虑前面建立的[0,1]区间上三次B6zier曲

线的求值器

•假设我们想用100个点构成的折线近似曲

线

glB㊀gin(GL_L工NE_STR工P);

for(i=0;i<=100;i++)

glEvalCoordlf(i/100.0);

glEnd();

等间距点

•通常我们并不需要自己采用循环结构,而

可以建立一个等距网格,然后用一个函数

调用计算出所有格点对应的值

glMapGridlf(100f0・0,1.0);

建立起介于[0,1]之间的100个等间距点

glEvalM㊀shl(GL_LINEf0,99);

显示计算出来的第。个点到第99个点构成的折线

BCzier曲面

•类似于单变量的情形,但求值器是两个变

量的

•建立方法:

glMap2f(typ㊀,u_min,u_maxf

u_strid㊀,u_ord㊀r,v_minAv_maxf

v_strid㊀,v_ord㊀r,

point㊀r_to_data);

利用glEvalCoord2f(u,v)求值

示例

[0,1]x[0,1]上的双三次曲面

pointdata[4][4]={..};

glMap2f(GL_MAP2_VERTEX_3A0.0,1.0,3,4,

0.0,1.0,12r4rdata[0]);

注意在v方向数据点是由12个浮点数分开的,

因此数组是按行存贮的。

用折线显示

需要在两个方向绘制折线

for(j=0;j<=100;j++){

glBegin(GL_LINE_STRIP);

for(i=0;i<=100;i++)

glEvalCoord2f((float)i/100.0,(float)j/100.0);

glEnd();

glBegin(GL_LINE_STRIP);

for(i=0;i<=100;i++)

glEvalCoord2f((float)j/100.0,(float)i/100.0);

glEnd();

可以形成四边网格,然后显示为折线

for(j=0;j<99;j++){

glBegin(GL_QUAD_STRIP);

for(i=0;i<100;i++){

glEvalCoord2f((float)i/100.0,

(float)j/100.0);

glEvalCoord2f((float)(i+1)/100.0,

(float)j/100.0);

)

glEnd():

均匀网格

•可以类似于一个变量时构造等距网格的情

形,构成两个变量的网格

glMapGrid2f(u_numfu_minAu_maxA

v_numfv_minfv_max);

•可以显示为与前面一^样的折线,也可以显

示为填充居多边形

glEvalMesh2(GL_FILLfu_start,u_numA

v_startrv_num);

•如果应用填充的多边形,那么就需要进行明暗

处理,否则就会看到均匀分布的颜色

•可以指定光源和材料属性,但为此需要法向

可以让OpenGL求出法向

glEnable(GL_AUTO_NORMAL);

NURBS

•OpenGL通过GLU库支持NURBS曲面

•为什么需要用GLU呢?

可以在OpenGL标准库中应用四维空间中的求

值器

然而,由于NURBS太复杂,需要太多的代码

有五个NURBS曲面相关的函数,以及定义修整

曲线用的函数(这些函数可以剪去NURBS曲面

的一部分)

典型曲面

•GLU和GLUT库都支持二次曲面

•都是采用多边形近似的方法,分辨率由用户指

球面:经纬线

•GLU:圆盘、圆柱、球

可以利用变换定位、放缩、定向。

•GLUT:正多面体、圆环、Utah茶壶、圆

HTHXX

GLUT对象

每种类型都具有线框和实体的两种形式

glutWireTeapot()

HTHXX

GLUT的正多面体

glutWireTetrahedron()

glutWireOctahedron()glutWirelcosahedron()

在GLU中的二次对象

•GLU可以自动生成法向和纹理坐标

•二次曲面是一种特殊的类型的对象,它具

有特别的属性,例如指定对象的显示方式

部分圆盘球面

定义圆柱

GLUquadricOB

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论