`
tiankefeng0520
  • 浏览: 147189 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

OpenGL学习三十二:二次几何体

阅读更多

主要包含圆柱体(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();
}

 

  • 大小: 21.2 KB
  • 大小: 13.1 KB
  • 大小: 20.5 KB
分享到:
评论

相关推荐

    Nehe第18课二次几何体20120628代码

    第18课“二次几何体”是Nehe教程中的一个重要章节,主要讲解如何在OpenGL中使用二次几何形状,如球体、圆盘、圆柱和圆锥。 二次几何体(Quadrics)是OpenGL中一种特殊的数据结构,它们通过数学方程来定义表面,而...

    OPengl VC 编写的旋转二十面体

    在这个“OPengl VC 编写的旋转二十面体”项目中,我们可以学习到如何在VC++环境下使用OpenGL来实现一个动态的三维图形——旋转的二十面体。 首先,我们要理解二十面体的几何结构。二十面体是欧几里得空间中的一个...

    NeHe教程第18课 二次几何体----Qt版

    这个教程主要关注如何在Qt环境中利用OpenGL渲染二次几何体,如球体、圆柱体和圆锥体等。NeHe教程是学习OpenGL编程的经典资源,而将这些概念应用于Qt框架则为开发者提供了更强大的集成开发环境。 首先,让我们了解Qt...

    学习OpenGL必备教程nehe_opengl_chs.chm & 全部课程的源程序

    18:二次几何体 19:粒子系统 20:蒙板 21:线的游戏 22:凹凸映射 23:球面映射 24:扩展 25:变形 26:反射 27:影子 28:贝塞尔曲面 29:Blt函数 30:碰撞检测 31:模型加载 32:拾取游戏 33:TGA文件 34:地形 ...

    opengl课件 opengl课件

    OpenGL是计算机图形学中的一种广泛应用的编程接口,用于在各种操作系统和硬件平台上创建二维和三维图形。这个"opengl课件"很可能包含了关于OpenGL的详细教程、实例代码、讲义和练习,适合初学者和进阶者深入理解并...

    opengl_nehe_android_源码

    包括:01: Hello OpenGL,02: 多边形,03: 颜色,04: 旋转,05: 3D 空间,06: 纹理...,18: 二次几何体,19: 粒子系统 (GPU),19: 粒子系统 (改变位置),20: 蒙板,25: 变形,26: 反射 在Android2.3源码下能编译运行

    图形学 - OpenGL实现三种立方体显示源码2个

    OpenGL是一种强大的图形编程接口,...通过分析和学习这些源码,开发者能够深入了解OpenGL的工作原理,以及如何在实际项目中构建和控制三维几何对象。这有助于提升对图形编程的理解,为更复杂的三维图形应用打下基础。

    opengl学习文档电子书

    基本API提供了对基本图形元素的描述,如几何体的绘制,以及坐标变换、光照、材质、纹理、像素操作等功能。实用API则提供了更高级的图形处理,如二次曲面、NURBS曲线曲面的绘制,以及矩阵管理和纹理处理等。而扩展API...

    OpenGL实验配置

    3. **OpenGL辅助函数库**(`glaux.lib`):辅助函数库提供了初始化窗口、监控输入以及绘制三维几何体等简单的编程示例。这些函数通常以`aux`为前缀。 4. **OpenGL实用函数工具包**(GLUT):这是一个独立的工具包,...

    OpenGL实现三维坐标的鼠标拣选

    - **光线与几何体的交点计算**:对于不同的几何体(如球体、立方体等),交点检测的算法也有所不同。例如,对于一个球体,可以通过求解光线方向向量与球心到射线起点向量之间的距离方程来找到交点。 3. **穿透...

    红宝书 OpenGL编程指南(原书第7版)中文

    - **几何着色器**:允许在GPU上动态生成几何体。 - **纹理缓冲对象**:提供了一种高效的方式将纹理数据存储在显存中。 - **通用计算**:通过扩展如Compute Shaders,OpenGL支持在GPU上执行通用计算任务。 - **多线程...

    cs.zip_49208 csm_OpenGL,game_OpenGl_nice__opengl_opengl nice

    OpenGL是计算机图形学领域广泛应用的一种跨语言、跨平台的编程接口,用于生成二维、三维图像。这个"cs.zip_49208 csm_OpenGL,game_OpenGl_nice__opengl_opengl nice"文件包显然包含了一个基于OpenGL的游戏资源,...

    NeHe OpenGL教程

    - **3D空间**:在此基础上,教程展示了如何将二维的多边形转化为三维物体,例如,将三角形转化为金字塔形状,将四边形转化为立方体,进一步加深了对三维空间的理解和应用。 #### 高级特性:纹理映射与光照 - **...

    一周学通_OpenGL.pdf

    在每一帧中,开发者需要设置好所需的渲染状态,然后调用OpenGL函数来绘制几何体。这些几何体最终会被转换为屏幕上的像素,形成最终的画面。 **2.3 状态管理** OpenGL中的状态管理非常重要。开发者可以通过设置不同...

    OpenGL编程指南.pdf

    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.rar_OpenGL 线框_opengl 线框消隐

    OpenGL,作为计算机图形学领域中的一项重要技术,提供了丰富的功能用于在各种平台和设备上渲染二维和三维图像。在三维图形设计中,线框模型是一个基础概念,它由一系列的线段构成,用以描绘物体的轮廓和边界。虽然...

    opengl函数

    9. Quadrics(二次曲面):涉及到二次曲面对象的定义和渲染,包括渲染风格、二次曲面原语等。 10. GLU(OpenGL Utility Library):GLU提供了一组额外的功能,使得使用OpenGL变得更加容易。文档中提到的GLU版本信息...

    opengl绘制一个单位立方体正平行投影图的程序

    OpenGL是计算机图形学中的一种广泛应用的编程接口,用于在各种操作系统和硬件上生成二维和三维图像。这个程序的标题表明,它将展示如何使用OpenGL来绘制一个单位立方体的正平行投影图。在计算机图形学中,单位立方体...

    OpenGL.rar_OPENGL 纹理_Opengl纹理_opengl添加纹理_opengl纹理贴图

    这个立方体的每个面都被不同的纹理覆盖,这通常通过将纹理坐标映射到几何体的顶点来实现。纹理坐标与顶点坐标一起被传递给GPU,然后在渲染时应用这些纹理。 在OpenGL中添加纹理涉及以下几个步骤: 1. 加载纹理:这...

Global site tag (gtag.js) - Google Analytics