`
tiankefeng0520
  • 浏览: 143097 次
  • 性别: 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代码

    二次几何体: 利用二次几何体,你可以很容易的创建球,圆盘,圆柱和圆锥。 次曲面是一种画复合对象的方法,这种方法通常并不需要很多的三角形。

    学习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_nehe_android_源码

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

    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编程指南(原书第8版)

    第3章介绍使用OpenGL进行几何体绘制的各种方法,以及一些可以让渲染更为高效的优化手段;第4章阐释OpenGL对于颜色的处理过程,包括像素的处理、缓存的管理以及像素处理相关的渲染技术;第5章介绍在一个二维计算机...

    Nehe的OpenGL教程电子书

    利用二次几何体,你可以很容易的创建球,圆盘,圆柱和圆锥。 19.粒子系统 你是否希望创建爆炸,喷泉,流星之类的效果。这一课将告诉你如何创建一个简单的例子系统,并用它来创建一种喷射的效果。 20.蒙板 ...

    OpenGL编程轻松入门

    OpenGL编程轻松入门之使用颜色 OpenGL编程轻松入门之坐标变换 OpenGL编程轻松入门之堆栈操作 OpenGL编程轻松入门之显示例表 OpenGL编程轻松入门之使用...OpenGL编程轻松入门之二次几何体 OpenGL编程轻松入门之动画制作

    建梦幻三维OpenGL程序设计轻松入门

    介绍了有关OpenGL的基本知识,主要涉及颜色、绘制几何体、坐标变换、堆栈操作、显示列表、光照和材质、纹理映射、特殊效果、曲面和曲线的绘制、二次几何体绘制、像素操作、如何绘制动画物体及菜单管理。

    OPenGL编程书籍

    利用二次几何体,你可以很容易的创建球,圆盘,圆柱和圆锥。 19.粒子系统 你是否希望创建爆炸,喷泉,流星之类的效果。这一课将告诉你如何创建一个简单的例子系统,并用它来创建一种喷射的效果。 20.蒙板 到目前...

    OpenGL编程指南(第四版

     ·第11章显示了如何使用GLU(OpenGL Utility Library,OpenGL工具函数库)中的分格化和二次方程函数。  ·第12章介绍生成曲线和表面的高级技巧。  ·第13章说明如何使用OpenGL的选择机制来选择屏幕上的一个...

    opengl程序设计轻松入门

    opengl入门教程.在这个系列讲座中介绍了有关OpenGL的基本知识,主要涉及颜色、绘制...二次几何体绘制、像素操作、如何绘制动画物体及菜单管理。通过对讲座中提供的实例的 理解消化,读者可以较容易地进入OpenGL的世界。

    raytracing-opengl:实时光线追踪

    二次曲面: 椭圆体 锥体 圆筒 椭圆抛物面 双曲抛物面 椭圆双曲面 还: SMAA抗锯齿 球,盒,环的纹理化 立方体贴图 四元数旋转 控制项: 用鼠标旋转相机 移动: 水务署 扩大空间 Ctrl-向下 Shift(按住)-增强 ...

    OpenGL 库函数汇总(中文分类)CHM

    绘制二次几何物体 --------------------------------- gluNewQuadric gluQuadricDrawStyle gluQuadricNormals gluQuadricOrientation gluCylinder gluSphere gluDisk gluPartialDisk gluDeleteQuadric ...

Global site tag (gtag.js) - Google Analytics