主要包含圆柱体(Cylinder)圆盘(Disk)球(Sphere) 圆锥(Cylinder)
作法:
1.创建几何体对象 GLUquadricObj *quadratic=gluNewQuadric();
2.设置几何体属性 gluQuadricNormals(法线)gluQuadricTexture(纹理)
gluQuadricOrientation(对齐方式)gluQuadricDrawStyle(绘画样式)
3.绘制二次几何体
gluQuadricNormals | 设置法线 | |
GLU_FLAT | 普通 | |
GLU_SMOOTH | 平滑 | |
GLU_NONE | ||
gluQuadricTexture | GL_TRUE|GL_FALSE | 是否绑定纹理 |
gluQuadricOrientation | GLU_OUTSIDE|GLU_INSIDE | 设置对其方式 |
gluQuadricDrawStyle | 绘画样式 | |
GLU_POINT | 以点方式绘制 | |
GLU_LINE | 以线方式绘制 | |
GLU_FILL 100010 #define GLU_LINE 100011 #define GLU_FILL 100012 #define GLU_SILHOUETTE 100013 |
以填充方式绘制 | |
GLU_SILHOUETTE | ||
gluCylinder | 绘制圆柱体|圆锥 | |
参数2 | 圆柱体的底面半径 | |
参数3 | 圆柱体的顶面半径(圆锥半径为0.0) | |
参数4 | 圆柱体的高度 | |
参数5 | 纬线(环绕Z轴有多少细分) | |
参数6 | 经线(沿着Z轴有多少细分)。细分越多该对象就越细致。 | |
gluDisk | ||
参数2 | 盘子的内圆半径,该参数可以为0,则表示在盘子中间没孔,内圆半径越大孔越大 | |
参数3 | 表示外圆半径,这个参数必须比内圆半径大 | |
参数4 | 组成该盘子的切片的数量,这个数量可以想象成披萨饼中的切片的数量。切片越多,外圆边缘就越平滑 | |
参数5 | 组成盘子的环的数量。环很像唱片上的轨迹,一环套一环。这些环从内圆半径细分到外圆半径。细分越多,速度越慢。 | |
gluSphere | 绘制球 | |
参数2 | 半径 | |
参数3 | 纬线 | |
参数4 | 经线 | |
gluPartialDisk | 参数2 | 绘制部分圆盘 |
参数3 | 盘子的内圆半径,该参数可以为0,则表示在盘子中间没孔,内圆半径越大孔越大 | |
参数4 | 表示外圆半径,这个参数必须比内圆半径大 | |
参数5 | 组成该盘子的切片的数量,这个数量可以想象成披萨饼中的切片的数量。切片越多,外圆边缘就越平滑 | |
参数6 | 组成盘子的环的数量。环很像唱片上的轨迹,一环套一环。这些环从内圆半径细分到外圆半径。细分越多,速度越慢。 | |
参数7 | 起始角度 | |
参数8 | 旋转角度 |
#include "header.h" int part1; int part2; int p1=0; int p2=1; GLfloat xrot; GLfloat yrot; GLfloat xspeed; GLfloat yspeed; GLfloat z=-5.0f; GLUquadricObj *quadratic; GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f }; GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f }; GLfloat LightPosition[]= { 0.0f, 0.0f, 2.0f, 1.0f }; GLuint filter; GLuint texture[3]; GLuint object=0; AUX_RGBImageRec *LoadBMP(char *Filename) { FILE *File=NULL; if (!Filename) { return NULL; } File=fopen(Filename,"r"); if (File) { fclose(File); return auxDIBImageLoad(Filename); } return NULL; } int LoadGLTextures() { int Status=FALSE; AUX_RGBImageRec *TextureImage[1]; memset(TextureImage,0,sizeof(void *)*1); if (TextureImage[0]=LoadBMP("Data/Wall.bmp")) { Status=TRUE; glGenTextures(3, &texture[0]); // Create Nearest Filtered Texture glBindTexture(GL_TEXTURE_2D, texture[0]); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); // Create Linear Filtered Texture glBindTexture(GL_TEXTURE_2D, texture[1]); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); // Create MipMapped Texture glBindTexture(GL_TEXTURE_2D, texture[2]); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); } if (TextureImage[0]) { if (TextureImage[0]->data) { free(TextureImage[0]->data); } free(TextureImage[0]); } return Status; } GLvoid ReSizeGLScene(GLsizei width, GLsizei height) { if (height==0) { height=1; } glViewport(0,0,width,height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); // Calculate The Aspect Ratio Of The Window gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } int InitGL(void) { if (!LoadGLTextures()) { return FALSE; } glEnable(GL_TEXTURE_2D); glShadeModel(GL_SMOOTH); glClearColor(0.0f, 0.0f, 0.0f, 0.5f); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); glLightfv(GL_LIGHT1, GL_POSITION,LightPosition); glEnable(GL_LIGHT1); quadratic=gluNewQuadric(); gluQuadricNormals(quadratic, GLU_SMOOTH); gluQuadricTexture(quadratic, GL_TRUE); return TRUE; } void glDrawCube() { glBegin(GL_QUADS); // Front Face glNormal3f( 0.0f, 0.0f, 1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Back Face glNormal3f( 0.0f, 0.0f,-1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // Top Face glNormal3f( 0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // Bottom Face glNormal3f( 0.0f,-1.0f, 0.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Right Face glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // Left Face glNormal3f(-1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glEnd(); } void DrawGLScene(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0f,0.0f,z); glRotatef(xrot,1.0f,0.0f,0.0f); glRotatef(yrot,0.0f,1.0f,0.0f); glBindTexture(GL_TEXTURE_2D, texture[filter]); switch(object) { case 0: glDrawCube(); break; case 1: glTranslatef(0.0f,0.0f,-1.5f); gluCylinder(quadratic,1.0f,1.0f,3.0f,32,32); break; case 2: gluDisk(quadratic,0.5f,1.5f,32,32); break; case 3: gluSphere(quadratic,1.3f,32,32); break; case 4: glTranslatef(0.0f,0.0f,-1.5f); gluCylinder(quadratic,1.0f,0.0f,3.0f,32,32); break; case 5: part1+=p1; part2+=p2; if(part1>359) { p1=0; part1=0; p2=1; part2=0; } if(part2>359) { p1=1; p2=0; } gluPartialDisk(quadratic,0.5f,1.5f,32,32,part1,part2-part1); break; }; xrot+=xspeed; yrot+=yspeed; glFlush(); } void rotate() { glutPostRedisplay(); } void keyboard(unsigned char key,int x,int y) { switch (key) { case 'L': glEnable(GL_LIGHTING); glutPostRedisplay(); break; case 'l': glDisable(GL_LIGHTING); glutPostRedisplay(); break; case ' ': object++; if(object>5) object=0; glutPostRedisplay(); break; case 'F': filter+=1; if (filter>2) { filter=0; } glutPostRedisplay(); break; case 'W': yspeed+=0.01f; glutIdleFunc(rotate); break; case 'S': yspeed-=0.01f; glutIdleFunc(rotate); break; case 'A': xspeed+=0.01f; glutIdleFunc(rotate); break; case 'D': xspeed-=0.01f; glutIdleFunc(rotate); break; case 'Z': z-=0.01f; glutIdleFunc(rotate); break; case 'X': z+=0.01f; glutIdleFunc(rotate); break; case 'R': glutIdleFunc(NULL); break; } } int main(int argc,char **argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH); glutInitWindowSize(800,600); glutInitWindowPosition(100,100); glutCreateWindow("二次几何体"); InitGL(); glutDisplayFunc(DrawGLScene); glutKeyboardFunc(keyboard); glutReshapeFunc(ReSizeGLScene); glutMainLoop(); }
相关推荐
二次几何体: 利用二次几何体,你可以很容易的创建球,圆盘,圆柱和圆锥。 次曲面是一种画复合对象的方法,这种方法通常并不需要很多的三角形。
18:二次几何体 19:粒子系统 20:蒙板 21:线的游戏 22:凹凸映射 23:球面映射 24:扩展 25:变形 26:反射 27:影子 28:贝塞尔曲面 29:Blt函数 30:碰撞检测 31:模型加载 32:拾取游戏 33:TGA文件 34:地形 ...
包括:01: Hello OpenGL,02: 多边形,03: 颜色,04: 旋转,05: 3D 空间,06: 纹理...,18: 二次几何体,19: 粒子系统 (GPU),19: 粒子系统 (改变位置),20: 蒙板,25: 变形,26: 反射 在Android2.3源码下能编译运行
2.9.1例子:创建一个二十面体 第3章视图 3.1简介:照相机比喻 3.2.1一个简单的例子:绘制立方体 3.1.2通用的变换函数 3.2视图和模型变换 3.2.1对变换进行思考 3.2.2模型变换 3.2.3视图变换 3.3投影变换 3.3.1透视...
第3章介绍使用OpenGL进行几何体绘制的各种方法,以及一些可以让渲染更为高效的优化手段;第4章阐释OpenGL对于颜色的处理过程,包括像素的处理、缓存的管理以及像素处理相关的渲染技术;第5章介绍在一个二维计算机...
利用二次几何体,你可以很容易的创建球,圆盘,圆柱和圆锥。 19.粒子系统 你是否希望创建爆炸,喷泉,流星之类的效果。这一课将告诉你如何创建一个简单的例子系统,并用它来创建一种喷射的效果。 20.蒙板 ...
OpenGL编程轻松入门之使用颜色 OpenGL编程轻松入门之坐标变换 OpenGL编程轻松入门之堆栈操作 OpenGL编程轻松入门之显示例表 OpenGL编程轻松入门之使用...OpenGL编程轻松入门之二次几何体 OpenGL编程轻松入门之动画制作
介绍了有关OpenGL的基本知识,主要涉及颜色、绘制几何体、坐标变换、堆栈操作、显示列表、光照和材质、纹理映射、特殊效果、曲面和曲线的绘制、二次几何体绘制、像素操作、如何绘制动画物体及菜单管理。
利用二次几何体,你可以很容易的创建球,圆盘,圆柱和圆锥。 19.粒子系统 你是否希望创建爆炸,喷泉,流星之类的效果。这一课将告诉你如何创建一个简单的例子系统,并用它来创建一种喷射的效果。 20.蒙板 到目前...
·第11章显示了如何使用GLU(OpenGL Utility Library,OpenGL工具函数库)中的分格化和二次方程函数。 ·第12章介绍生成曲线和表面的高级技巧。 ·第13章说明如何使用OpenGL的选择机制来选择屏幕上的一个...
opengl入门教程.在这个系列讲座中介绍了有关OpenGL的基本知识,主要涉及颜色、绘制...二次几何体绘制、像素操作、如何绘制动画物体及菜单管理。通过对讲座中提供的实例的 理解消化,读者可以较容易地进入OpenGL的世界。
二次曲面: 椭圆体 锥体 圆筒 椭圆抛物面 双曲抛物面 椭圆双曲面 还: SMAA抗锯齿 球,盒,环的纹理化 立方体贴图 四元数旋转 控制项: 用鼠标旋转相机 移动: 水务署 扩大空间 Ctrl-向下 Shift(按住)-增强 ...
绘制二次几何物体 --------------------------------- gluNewQuadric gluQuadricDrawStyle gluQuadricNormals gluQuadricOrientation gluCylinder gluSphere gluDisk gluPartialDisk gluDeleteQuadric ...