主要包含圆柱体(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课“二次几何体”是Nehe教程中的一个重要章节,主要讲解如何在OpenGL中使用二次几何形状,如球体、圆盘、圆柱和圆锥。 二次几何体(Quadrics)是OpenGL中一种特殊的数据结构,它们通过数学方程来定义表面,而...
在这个“OPengl VC 编写的旋转二十面体”项目中,我们可以学习到如何在VC++环境下使用OpenGL来实现一个动态的三维图形——旋转的二十面体。 首先,我们要理解二十面体的几何结构。二十面体是欧几里得空间中的一个...
这个教程主要关注如何在Qt环境中利用OpenGL渲染二次几何体,如球体、圆柱体和圆锥体等。NeHe教程是学习OpenGL编程的经典资源,而将这些概念应用于Qt框架则为开发者提供了更强大的集成开发环境。 首先,让我们了解Qt...
18:二次几何体 19:粒子系统 20:蒙板 21:线的游戏 22:凹凸映射 23:球面映射 24:扩展 25:变形 26:反射 27:影子 28:贝塞尔曲面 29:Blt函数 30:碰撞检测 31:模型加载 32:拾取游戏 33:TGA文件 34:地形 ...
OpenGL是计算机图形学中的一种广泛应用的编程接口,用于在各种操作系统和硬件平台上创建二维和三维图形。这个"opengl课件"很可能包含了关于OpenGL的详细教程、实例代码、讲义和练习,适合初学者和进阶者深入理解并...
包括:01: Hello OpenGL,02: 多边形,03: 颜色,04: 旋转,05: 3D 空间,06: 纹理...,18: 二次几何体,19: 粒子系统 (GPU),19: 粒子系统 (改变位置),20: 蒙板,25: 变形,26: 反射 在Android2.3源码下能编译运行
OpenGL是一种强大的图形编程接口,...通过分析和学习这些源码,开发者能够深入了解OpenGL的工作原理,以及如何在实际项目中构建和控制三维几何对象。这有助于提升对图形编程的理解,为更复杂的三维图形应用打下基础。
基本API提供了对基本图形元素的描述,如几何体的绘制,以及坐标变换、光照、材质、纹理、像素操作等功能。实用API则提供了更高级的图形处理,如二次曲面、NURBS曲线曲面的绘制,以及矩阵管理和纹理处理等。而扩展API...
3. **OpenGL辅助函数库**(`glaux.lib`):辅助函数库提供了初始化窗口、监控输入以及绘制三维几何体等简单的编程示例。这些函数通常以`aux`为前缀。 4. **OpenGL实用函数工具包**(GLUT):这是一个独立的工具包,...
- **光线与几何体的交点计算**:对于不同的几何体(如球体、立方体等),交点检测的算法也有所不同。例如,对于一个球体,可以通过求解光线方向向量与球心到射线起点向量之间的距离方程来找到交点。 3. **穿透...
- **几何着色器**:允许在GPU上动态生成几何体。 - **纹理缓冲对象**:提供了一种高效的方式将纹理数据存储在显存中。 - **通用计算**:通过扩展如Compute Shaders,OpenGL支持在GPU上执行通用计算任务。 - **多线程...
OpenGL是计算机图形学领域广泛应用的一种跨语言、跨平台的编程接口,用于生成二维、三维图像。这个"cs.zip_49208 csm_OpenGL,game_OpenGl_nice__opengl_opengl nice"文件包显然包含了一个基于OpenGL的游戏资源,...
- **3D空间**:在此基础上,教程展示了如何将二维的多边形转化为三维物体,例如,将三角形转化为金字塔形状,将四边形转化为立方体,进一步加深了对三维空间的理解和应用。 #### 高级特性:纹理映射与光照 - **...
在每一帧中,开发者需要设置好所需的渲染状态,然后调用OpenGL函数来绘制几何体。这些几何体最终会被转换为屏幕上的像素,形成最终的画面。 **2.3 状态管理** OpenGL中的状态管理非常重要。开发者可以通过设置不同...
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透视...
OpenGL,作为计算机图形学领域中的一项重要技术,提供了丰富的功能用于在各种平台和设备上渲染二维和三维图像。在三维图形设计中,线框模型是一个基础概念,它由一系列的线段构成,用以描绘物体的轮廓和边界。虽然...
9. Quadrics(二次曲面):涉及到二次曲面对象的定义和渲染,包括渲染风格、二次曲面原语等。 10. GLU(OpenGL Utility Library):GLU提供了一组额外的功能,使得使用OpenGL变得更加容易。文档中提到的GLU版本信息...
OpenGL是计算机图形学中的一种广泛应用的编程接口,用于在各种操作系统和硬件上生成二维和三维图像。这个程序的标题表明,它将展示如何使用OpenGL来绘制一个单位立方体的正平行投影图。在计算机图形学中,单位立方体...
这个立方体的每个面都被不同的纹理覆盖,这通常通过将纹理坐标映射到几何体的顶点来实现。纹理坐标与顶点坐标一起被传递给GPU,然后在渲染时应用这些纹理。 在OpenGL中添加纹理涉及以下几个步骤: 1. 加载纹理:这...