opengl教程第18课二次几何体_第1页
opengl教程第18课二次几何体_第2页
免费预览已结束,剩余1页可下载查看

付费下载

下载本文档

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

文档简介

1、第 18 课 二次几何体:利用二次几何体,你可以很容易的创建球,圆盘,圆柱和圆锥。二次曲面是一种画复合对象的方法,这种方法通常并不需要很多的三角形。要增加 7 个变量以及修改纹理以增加一些变化 :要使用第七课的代码。boolsp;/ 空格键是否按下part1; part2; p1=0; p2=1;GLUquadricObj/ 圆盘的起始角度/ 圆盘的结束角度/ 增量 1/ 增量 1*quadratic;/ 二次几何体/ 二次几何体标示符GLuobject=0;好了现在开始搞 InitGL()函数。打算增加 3 行代码用来初始化的二次曲面。这 3 行代码将在你使 1 号光源有效后增加,但是要在返

2、回之前。第一行代码将初始化二次曲面并且创建一个指向改二次曲面的指针,如果改二次曲面不能被创建的话,那么该指针就是 NULL。第二行代码将在二次曲面的表面创建平滑的法向量,这样当灯光照上去的时候将会好看些。另外一些可能的取值是:GLU_NONE 和 GLU_FLAT。最后使在二次曲面表面的纹理有效。quadratic=gewQuadric();/ 创建二次几何体ormals(quadratic,gluQuadricTexture(quadratic,GLU_SMOOTH);GL_TRUE);/ 使用平滑法线/ 使用纹理现在我决定在本课里保留立方体,这样你可以看到纹理是如何到二次曲面对象上的。而且

3、我打算将绘制立方体的代码定义为一个单独的函数,这样在定义函数 Draw()的时候它将会变的不那么凌乱。每个人都应该记住这些代码:GLvoid glDrawCube()glBegin(GL_QUADS);/ 前面 glNormal3f( 0.0f, glTexCoord2f(0.0f, glTexCoord2f(1.0f, glTexCoord2f(1.0f, glTexCoord2f(0.0f,/ 后面 glNormal3f( 0.0f, glTexCoord2f(1.0f, glTexCoord2f(1.0f, glTexCoord2f(0.0f, glTexCoord2f(0.0f,/ 上

4、面 glNormal3f( 0.0f, glTexCoord2f(0.0f, glTexCoord2f(0.0f, glTexCoord2f(1.0f, glTexCoord2f(1.0f,/ 下面/ 绘制立方体0.0f, 1.0f);0.0f);0.0f);1.0f);1.0f);glVertex3f(-1.0f, -1.0f,1.0f);1.0f);1.0f);1.0f);glVertex3f( 1.0f, glVertex3f( 1.0f,glVertex3f(-1.0f,-1.0f,1.0f,1.0f,0.0f,-1.0f);0.0f);1.0f);1.0f);0.0f);glVert

5、ex3f(-1.0f, glVertex3f(-1.0f, glVertex3f( 1.0f,glVertex3f( 1.0f,-1.0f, -1.0f);1.0f, -1.0f);1.0f, -1.0f);-1.0f,-1.0f);1.0f, 0.0f);1.0f);0.0f);0.0f);1.0f);glVertex3f(-1.0f, glVertex3f(-1.0f, glVertex3f( 1.0f,glVertex3f( 1.0f,1.0f,1.0f,1.0f,1.0f,-1.0f);1.0f);1.0f);-1.0f);glNormal3f( 0.0f,-1.0f, 0.0f);g

6、lTexCoord2f(1.0f, glTexCoord2f(0.0f, glTexCoord2f(0.0f, glTexCoord2f(1.0f,/ 右面 glNormal3f( 1.0f, glTexCoord2f(1.0f, glTexCoord2f(1.0f, glTexCoord2f(0.0f, glTexCoord2f(0.0f,/ 左面 glNormal3f(-1.0f, glTexCoord2f(0.0f, glTexCoord2f(1.0f, glTexCoord2f(1.0f,glTexCoord2f(0.0f,1.0f);1.0f);0.0f);0.0f);glVerte

7、x3f(-1.0f, glVertex3f( 1.0f, glVertex3f( 1.0f,glVertex3f(-1.0f,-1.0f, -1.0f);-1.0f,-1.0f,-1.0f,-1.0f);1.0f);1.0f);0.0f, 0.0f);0.0f);1.0f);1.0f);0.0f);glVertex3f( glVertex3f( glVertex3f(glVertex3f(1.0f,1.0f,1.0f,1.0f,-1.0f,1.0f,1.0f,-1.0f,-1.0f);-1.0f);1.0f);1.0f);0.0f, 0.0f);0.0f);0.0f);1.0f);1.0f);

8、glVertex3f(-1.0f, glVertex3f(-1.0f, glVertex3f(-1.0f,glVertex3f(-1.0f,-1.0f, -1.0f);-1.0f,1.0f,1.0f,1.0f);1.0f);-1.0f);glEnd();接下来就是场景绘制函数了,在这里我只写一个简单的例子。并且当我绘制一个部分的盘子的时候,我将使用一个静态变量(一个局部的变量,该变量可以保留他的值不论你任何时候调用他)来表达一个非常酷的效果。为了清晰起见我将要重写 DrawGLScene 函数。将会注意到当我这些正在使用的参数时我忽略了当前函数的第一个参数(quadratic)。这个参数将被除

9、立方体外的所有对象使用。所以当我这些参数的时候我忽略了它。DrawGLScene(GLvoid)/./ 这部分是新增加的switch(object)case 0: glDrawCube(); break;/ 绘制哪一种二次几何体/ 绘制立方体创建的第 2 个对象是一个圆柱体。参数 1(1.0F)是圆柱体的底面半径,参数 2(1.0F)是圆柱体的饿顶面半径,参数 3(3.0F)是圆柱体的高度。参数 4(32)是纬线(环绕 Z 轴有多少细分),参数 5(32)是经线(沿着Z 轴有多少细分)。细分越多该对象就越细致。可以用增加细分的方法来增加对象的多边形数。因此你可以牺牲速度换回质量(以时间换质量)

10、,大多数的时候适的“度”。都可以很容易的找到一个合case 1:/ 绘制圆柱体glTranslatef(0.0f,0.0f,-1.5f);gluCylinder(quadratic,1.0f,1.0f,3.0f,32,32); break;对象 3 将会创建一个 CD 样子的盘子。参数 1(0.5F)是盘子的内圆半径,该参数可以为 0,则表示在盘子中间没孔,内圆半径越大孔越大。参数 2(1.5F)表示外圆半径,这个参数必须比内圆半径大。参数 3(32)是组成该盘子的切片的数量,这个数量可以想象成披萨饼中的切片的数量。切片越多,外圆边缘就越平滑。最后一个参数(32)是组成盘子的环的数量。环很像唱

11、片上的轨迹,一环套一环。这些环从内圆半径细分到外圆半径。再说一次,细分越多,速度越慢。case 2:/ 绘制圆盘gluDisk(quadratic,0.5f,1.5f,32,32);break;的第 4 个对象我知道为描述它耗尽精力。就是球。绘制球将会变的非常简单。参数 1 是球的半径。如果你无法理解半径/直径等等的话,可以理解成物体中心到物体外部的距离,在这里使用 1.3F作为半径。接下来两个参数就是细分了,和圆柱体一样,参数 2 是纬线,参数 3 是经线。细分越多球看起来就越平滑,通常球需要多一些的细分以使他们看起来平滑。case 3:/ 绘制球gluSphere(quadratic,1.

12、3f,32,32);break;创建的第 4 个对象使用与曾经创建的圆柱体一样令来创建,如果你还记得的话,可以通过控制参数 2 和参数 3 来控制顶面半径和地面半径。因此可以使顶面半径为 0 来绘制一个圆锥体,顶面半径为 0 将会在顶面上创建一个点。因此在下面的代码中,使顶面半径等于 0,这将会创建一个点,同时也就创建了的圆锥。case 4:/ 绘制圆锥glTranslatef(0.0f,0.0f,-1.5f); gluCylinder(quadratic,1.0f,0.0f,3.0f,32,32);break;的第 6 个对象将被 gluPartialDisk 函数创建。打算创建的这个对象使

13、用了一些命令,这些命令在创建对象之前,你将会清楚的看到。但是命令 gluPartialDisk 拥有两个新的参数。第 5 个参数是我们想要绘制的部分盘子的开始角度,参数 6 是旋转角,也就是转过的角度。起盘子沿顺时针方向缓慢的被绘制在屏幕上。一旦旋转角达到 360 度要增加旋转角,这将引开始增加开始角度,这样盘子看起来就想是被逐渐的抹去一样。重复这些过程。case 5: part1+=p1;part2+=p2;/ 绘制部分圆盘if(part1359)p1=0;part1=0; p2=1;part2=0;if(part2359)p1=1; p2=0;gluPartialDisk(quadratic,0.5f,1.5f,32,32,part1,part2-part1); break;/.he KillGLWindow() section of code, we need tete the quadraticgluDeleteQuadratic.tofree up system resour. We do this with thedGLvoid KillGLW

温馨提示

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

评论

0/150

提交评论