C程序设计大作业 openGL

合集下载

opengl教程c语言版

opengl教程c语言版

OpenGL教程(c语言)1.第一课:说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧?但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率、16色来做吗?显然是不行的。

本帖的目的是让大家放弃TC的老旧图形接口,让大家接触一些新事物。

OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性。

1、与C语言紧密结合。

OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的。

如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL作图甚至比TC更加简单。

2、强大的可移植性。

微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统(现在还要加上一个XBOX游戏机)。

而OpenGL不仅用于Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。

并且,OpenGL的基本命令都做到了硬件无关,甚至是平台无关。

3、高性能的图形渲染。

OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL 提供强力支持,激烈的竞争中使得OpenGL性能一直领先。

总之,OpenGL是一个很NB的图形软件接口。

至于究竟有多NB,去看看DOOM3和QUAKE4等专业游戏就知道了。

OpenGL官方网站(英文)下面我将对Windows下的OpenGL编程进行简单介绍。

学习OpenGL前的准备工作第一步,选择一个编译环境现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL的。

但这里我们选择Visual Studio 2005作为学习OpenGL的环境。

openGL大作业五星红旗

openGL大作业五星红旗

学院目录1 摘要 (3)1.1设计题目 (3)1.2设计内容 (3)1.3开发工具 ................................................ 错误!未定义书签。

1.4应用平台 ................................................ 错误!未定义书签。

2 详细设计 ....................................................... 错误!未定义书签。

2.1程序结构 ................................................ 错误!未定义书签。

2.2主要功能 (6)2.3函数实现 (6)2.4开发日志 (6)3 程序调试及运行 (7)3.1程序运行结果......................................... 错误!未定义书签。

3.2程序使用说明 (8)3.3程序开发总结 (8)4 附件(源程序) (9)1 摘要1.1 设计题目利用Opengl的知识,绘制一面五星红旗。

1.2 设计内容编写此程序实现绘制五星红旗。

2.1函数结构1.init 函数此函数实现了窗口背景和投影参数的初始设置void init (void){glClearColor(1.0,1.0,1.0,1.0); //窗口背景设置为白色glMatrixMode(GL_PROJECTION); //设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0);}2.TRIANGLE 函数此函数实现了图形中各个关键点的坐标输入,使图像有基本框架void TRIANGLE(float i,float j,int r){ float PI = 3.14;f loat ax,ay,bx,by,cx,cy,dx,dy,ex,ey;ax=0;ay=r;bx=r*cos(18*PI/180);by=r*sin(18*PI/180);ex=-bx;ey=by;cx=r*sin(36*PI/180);cy=-r*cos(36*PI/180);dx=-cx;dy=cy;glColor3f(1.0,1.0,0.0);glBegin(GL_TRIANGLES);glVertex2i(i,j);glVertex2i(i+ax,j+ay);glVertex2i(i+dx,j+dy);glEnd();glBegin(GL_TRIANGLES);glVertex2i(i,j);glVertex2i(i+ax,j+ay);glVertex2i(i+cx,j+cy);glEnd();glBegin(GL_TRIANGLES);glVertex2i(i,j);glVertex2i(i+bx,j+by);glVertex2i(i+ex,j+ey);glEnd();glBegin(GL_TRIANGLES);glVertex2i(i,j);glVertex2i(i+bx,j+by);glVertex2i(i+dx,j+dy);glEnd();glBegin(GL_TRIANGLES);glVertex2i(i,j);glVertex2i(i+cx,j+cy);glVertex2i(i+ex,j+ey);glEnd();}3. flagSegment 函数此函数实现了对图形颜色的渲染,函数如下:void flagSegment(void){ glMatrixMode(GL_MODELVIEW);glLoadIdentity();glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glColor3f(1.0,0.0,0.0); //颜色为红色glBegin(GL_QUADS);glVertex2i(13,140);glVertex2i(100,140);glVertex2i(100,80);glVertex2i(13,80);glEnd();TRIANGLE(28,123,9);glTranslatef(40.0f,135.0f,0.0f);glPushMatrix();glRotatef(-30.0f,0.0f,0.0f,1.0f);TRIANGLE(0,0,4);glPopMatrix();glTranslatef(7.0f,-7.0f,0.0f);glPushMatrix();glRotatef(30.0f,0.0f,0.0f,1.0f);TRIANGLE(0,0,4);glPopMatrix();glTranslatef(0.0f,-10.0f,0.0f);TRIANGLE(0,0,4);glTranslatef(-7.0f,-6.0f,0.0f);glPushMatrix();glRotatef(-30.0f,0.0f,0.0f,1.0f);TRIANGLE(0,0,4);glPopMatrix();glFlush(); //渲染}4.main函数这个函数是此程序的主函数, glutInit完成初始化GLUT,glutInitDisplayMode完成显示模式设置,glut InitDisplayMode完成左上角位置设置,glut IntWindowSize 完成窗口的长和高。

VC(MFC)开发OPENGL程序

VC(MFC)开发OPENGL程序

VC(MFC)开发OPENGL程序作者:李英江日期: 2006-08-10 19:07:00网站:转载请保留作者内容!利用使用VC开发OPENGL程序,运用MFC库,做一个简单例子我简单介绍一下图形接口,现在流行的两大图形接口Direct3D 和OpenGL,Direct3D主要是针对游戏,像starcaft星际争霸,它支持DX5.0以上的版本,但是不少游戏同时支持两种图形加速,如CS,魔兽争霸。

OpenGL主要是针对专业的图形应用,在军事,医学,GIS地理信息系统,动画(3dsmax,maya...),电影,等应用广泛,并且可以在不同的平台上应用,DX相对来说就只能限于Windows操作系统了。

1.运用MFC向导,生成一个单文档应用程序,不做任何事的MFC 框架程序。

2.视图类中添加窗口样式。

/************************************************************** *******/BOOL CMfc_basicView::PreCreateWindow(CREATESTRUCT& cs){// Add Window styles required for OpenGL before window iscreatedcs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CS_OWNDC);return CView::PreCreateWindow(cs);}/************************************************************** *******/3.在afxcmn.h中包含OPENGL头文件。

/************************************************************** *******/#include <afxcmn.h>// MFC support for Windows Common Controls// Inserted these files for openGL#include <gl.h>#include <glut.h>#include <glu.h>#include <glaux.h>#endif // _AFX_NO_AFXCMN_SUPPORT/************************************************************** *******/4.视图类中 .h文件中加入四个public 成员变量/************************************************************** *******/HGLRC m_hRC; // Permanent Rendering ContextHDC m_myhDC; // Private GDI Device Contextint m_height; // Stores the height of the Viewint m_width; // Stores the width of the view/************************************************************** *******/5.视图类中右键添加一个BOOL成员函数SetupPixelFormat/************************************************************** *******/BOOL COglm_demoView::SetupPixelFormat(){GLuint PixelFormat;static PIXELFORMATDESCRIPTOR pfd= {sizeof(PIXELFORMATDESCRIPTOR),// Size Of This Pixel Format Descriptor1,// Version Number (?)PFD_DRAW_TO_WINDOW | // Format Must Support WindowPFD_SUPPORT_OPENGL | // Format Must Support OpenGL PFD_DOUBLEBUFFER, // Must Support Double Buffering PFD_TYPE_RGBA, // Request An RGBA Format24, // Select A 24Bit Color Depth0, 0, 0, 0, 0, 0, // Color Bits Ignored (?)0, // No Alpha Buffer0, // Shift Bit Ignored (?)0, // No Accumulation Buffer0, 0, 0, 0, // Accumulation Bits Ignored (?)16, // 16Bit Z-Buffer (Depth Buffer)0, // No Stencil Buffer0, // No Auxiliary Buffer (?)PFD_MAIN_PLANE, // Main Drawing Layer0, // Reserved (?)0, 0, 0 // Layer Masks Ignored (?)};m_myhDC = ::GetDC(m_hWnd); // Gets A Device Context For The WindowPixelFormat = ChoosePixelFormat(m_myhDC, &pfd); // Finds The Closest Match To The Pixel Format We Set Aboveif (!PixelFormat){::MessageBox(0,"Can't Find A Suitable PixelFormat.","Error",MB_OK|MB_ICONERROR);PostQuitMessage(0);// This Sends A 'Message' Telling The Program To Quitreturn false ; // Prevents The Rest Of The Code From Running}if(!SetPixelFormat(m_myhDC,PixelFormat,&pfd)){::MessageBox(0,"Can't Set The PixelFormat.","Error",MB_OK|MB_ICONERROR);PostQuitMessage(0);return false;}m_hRC = wglCreateContext(m_myhDC);if(!m_hRC){::MessageBox(0,"Can't Create A GL Rendering Context.","Error",MB_OK|MB_ICONERROR);PostQuitMessage(0);return false;}if(!wglMakeCurrent(m_myhDC, m_hRC)){::MessageBox(0,"Can't activate GLRC.","Error",MB_OK|MB_ICONERROR);PostQuitMessage(0);return false;}// Now that the screen is setup we can// initialize OpenGL();InitGL();return true;}/************************************************************** *******/6.关闭WM_ERASEBACKGROUND消息,不关闭的话,画图时会闪动.在视图类中选择“Add Windows Message Handler”加入消息处理函数./************************************************************** *******/BOOL CMfc_basicView::OnEraseBkgnd(CDC* pDC){return FALSE;}/************************************************************** *******/7.初始化OPENGL 添加InitGL()函数./************************************************************** *******/void CMfc_basicView::InitGL(){// Enables Depth TestingglEnable(GL_DEPTH_TEST);// Enable the point size for selected pointsglPointSize(5.0f);// This Will Clear The Background Color To BlackglClearColor(.4, 0.2, 0.0, 0.0f);// Reset the current projection matrixSetProjection();glMatrixMode(GL_MODELVIEW);glLoadIdentity();//Enable back face culling, defaults to Clock wise vertices.glEnable(GL_CULL_FACE);glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);glShadeModel(GL_SMOOTH);glPolygonMode(GL_FRONT, GL_FILL);}/************************************************************** *******/8. 在视图类中添加调窗口大小的处理函数OnSize() 消息句柄/************************************************************** *******/void CMfc_basicView::OnSize(UINT nType, int cx, int cy){CView::OnSize(nType, cx, cy);glMatrixMode(GL_MODELVIEW);glLoadIdentity();// Make the rendering context currentwglMakeCurrent(m_myhDC,m_hRC);// Reset The Current Viewport And Perspective TransformationglViewport(0, 0, cx, cy);m_height= cy;m_width = cx;// Calculate The Aspect Ratio Of The WindowgluPerspective(60.0f,(GLfloat)cx/(GLfloat)cy,0.1f,1000.0f);}9.添加SetPorjection()函数void CMfc_basicView::SetProjection(){glViewport(0, 0, m_width, m_height);// Reset The Projection MatrixglMatrixMode(GL_PROJECTION);glLoadIdentity();// It's a perspective projection// Calculate The Aspect Ratio Of The WindowgluPerspective(60.0f,(GLfloat)m_width/(GLfloat)m_height, 0.1f,3000.0f);}/************************************************************** *******/10.在Project 菜单选择Settings. 单击Link 选项页Object/library Module添加库文件.opengl32.lib glu32.lib glut.lib glaux.lib11.在视图类中加入OnCreate消息句柄/*********************************************************************/int CMfc_basicView::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CView::OnCreate(lpCreateStruct) == -1)return -1;SetupPixelFormat();wglMakeCurrent(NULL,NULL);return 0;}/************************************************************** *******///现在编译程序的话,会看到一个无法刷新的应用程序了。

C语言实现OpenGL渲染

C语言实现OpenGL渲染

C语言实现OpenGL渲染OpenGL是一种强大的图形渲染API(应用程序接口),它可用于创建高性能的2D和3D图形应用程序。

在本文中,我们将探讨如何使用C语言实现OpenGL渲染。

1. 初始化OpenGL环境在开始之前,我们需要初始化OpenGL环境。

这可以通过以下步骤完成:1.1. 创建窗口使用C语言中的窗口创建库(如GLUT或GLFW)创建一个可见的窗口。

这个窗口将充当我们OpenGL渲染的目标。

1.2. 设置视口使用glViewport函数将窗口的尺寸设置为需要进行渲染的大小。

视口定义了OpenGL将渲染的区域。

1.3. 创建正交投影或透视投影矩阵使用glOrtho或gluPerspective函数创建透视或正交投影矩阵。

投影矩阵将定义OpenGL渲染的视图。

2. 渲染基本图形一旦我们初始化了OpenGL环境,我们可以开始渲染基本图形。

以下是一些常见的基本图形渲染函数:2.1. 绘制点使用glBegin和glEnd函数,以及glVertex函数,可以绘制一个或多个点。

2.2. 绘制线段使用glBegin和glEnd函数,以及glVertex函数,可以绘制一条或多条线段。

2.3. 绘制三角形使用glBegin和glEnd函数,以及glVertex函数,可以绘制一个或多个三角形。

2.4. 绘制多边形使用glBegin和glEnd函数,以及glVertex函数,可以绘制一个或多个多边形。

3. 设置光照效果为了给渲染的图形添加逼真感,可以设置光照效果。

以下是一些常见的光照函数:3.1. 设置光源使用glLight函数,可以设置光源的位置、光照颜色等参数。

3.2. 设置材质属性使用glMaterial函数,可以设置渲染对象的表面材质属性,如漫反射、镜面反射等。

3.3. 使用光照模型使用glShadeModel函数,可以选择光照模型,如平滑光照模型或平面光照模型。

4. 纹理映射纹理映射能够使渲染的图形更逼真。

用MFC实现OpenGL编程

用MFC实现OpenGL编程

用MFC实现OpenGL编程用MFC实现OpenGL编程一、OpenGL简介众所周知,OpenGL原先是Silicon Graphics Incorporated(SGI 公司)在他们的图形工作站上开发高质量图像的接口。

但最近几年它成为一个非常优秀的开放式三维图形接口。

实际上它是图形软件和硬件的接口,它包括有120多个图形函数,"GL"是"GRAPHIC LIBRARY"的缩写,意思是“图形库”。

OpenGL的出现使大多数的程序员能够在PC机上用C语言开发复杂的三维图形。

微软在Visual C++ 7中已提供了三个OpenGL的函数库(glu32.lib, glau.lib,OpenGL32.lib),可以使我们方便地编程,简单、快速地生成美观、漂亮的图形。

例如,Windows NT中的屏幕保护程序中的花篮和迷宫等都给人们留下了深刻的印象。

二、生成OpenGL程序的基本步骤和条件本文将给出一个例子,这个例子是一个用OpenGL显示图像的Windows程序,通过这个程序我们也可以知道用OpenGL编程的基本要求。

我们知道,GDI是通过设备句柄(Device Context以下简称"DC")来绘图,而OpenGL则需要绘制环境(Rendering Context,以下简称"RC")。

每一个GDI命令需要传给它一个DC,与GDI不同,OpenGL使用当前绘制环境(RC)。

一旦在一个线程中指定了一个当前RC,所有在此线程中的OpenGL命令都使用相同的当前RC。

虽然在单一窗口中可以使用多个RC,但在单一线程中只有一个当前RC。

本例将首先产生一个OpenGL RC并使之成为当前RC,分为三个步骤:设置窗口像素格式;产生RC;设置为当前RC。

1、首先创建工程用AppWizard产生一个EXE文件,选择工程目录,并在工程名字中输入"OpenGL",保持其他的不变;第一步、选单文档(SDI);第二步、不支持数据库;第三步、不支持OLE;第四步、不选中浮动工具条、开始状态条、打印和预览支持、帮助支持的复选框,选中三维控制(3D Controls);第五步、选中产生源文件注释并使用MFC为共享动态库;第六步、保持缺省选择。

实验一vc6.0opengl绘图环境及简单图形的输出

实验一vc6.0opengl绘图环境及简单图形的输出

任课教师:马文娟《3D图形学》(2013-2014学年第1学期)实验报告学号:姓名:班级:实验一VC++6.0+OpenGL绘图环境及简单图形的输出一、实验目的1、熟练使用实验主要开发平台VC++6.0;2、进一步熟悉OpenGL的主要功能;3、掌握OpenGL的绘图流程和原理;4、掌握OpenGL的基本数据类型、核心函数的使用。

二、实验内容创建一个OpenGL工程,利用OpenGL库函数进行简单图形设计与绘制。

三、实验原理1、基本语法(C版本下的OpenGL语法)OpenGL基本函数均使用gl作为函数名的前缀,如glClearColor();实用函数则使用glu作为函数名的前缀,如gluSphere()。

OpenGL基本常量的名字以GL_开头,如GL_LINE_LOOP;实用常量的名字以GLU_开头,如GLU_FILL。

一些函数如glColor*()(定义颜色值),函数名后可以接不同的后缀以支持不同的数据类型和格式,如glColor3b()、glColor3d()、glColor3f()和glColor3bv ()等,这几个函数在功能上是相似的,只是适用于不同的数据类型和格式,其中3表示该函数带有三个参数,b、d、f分别表示参数的类型是字节型、双精度浮点型和单精度浮点型,v则表示这些参数是以向量形式出现的。

OpenGL定义了一些特殊标识符,如GLfloat、GLvoid,它们其实就是C中的float 和void。

2、程序的基本结构OpenGL程序的基本结构可分为三个部分:1)第一部分是初始化,主要是设置一些OpenGL的状态开关,如颜色模式(RGBA 或ALPHA)的选择,是否作光照处理(若有的话,还需设置光源的特性),深度检验、裁剪等。

这些状态一般都用函数glEnable(…)、glDisable(…)来设置,“…”表示特定的状态。

2)第二部分设置观察坐标系下的取景模式和取景框位置大小,主要利用了三个函数:函数void glViewport(left, top, right, bottom) 设置在屏幕上的窗口大小,四个参数描述屏幕窗口四个角上的坐标(以像素表示);函数void glOrtho(left, right, bottom, top, near, far) 设置投影方式为正交投影(平行投影),其取景体积是一个各面均为矩形的六面体;函数void gluPerspective(fovy, aspect, zNear, zFar) 设置投影方式为透视投影,其取景体积是一个截头锥体。

C语言使用OpenGL制作旋转地球

C语言使用OpenGL制作旋转地球

C语⾔使⽤OpenGL制作旋转地球前置步骤(安装依赖库):sudo apt-get updatesudo apt-get install build-essentialsudo apt-get install libgl1-mesa-devsudo apt-get install libglu1-mesa-dev$sudo apt-get install freeglut3-devsudo apt-get install libfreeimage3 sudo apt-get install libfreeimage-dev1.测试OpenGL环境#include<GL/glut.h>void init(){glClearColor(0.0, 0.0, 0.0, 0.0);glMatrixMode(GL_PROJECTION);glOrtho(-5, 5, -5, 5, 5, 15);gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0);return ;}void display(void){glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0, 0, 0);glutWireTeapot(3);glFlush();return;}int main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(0, 0);glutInitWindowSize(300, 300);glutCreateWindow("OpenGL #D View");init();glutDisplayFunc(display);glutMainLoop();return0;}编译:gcc test.c -o test -lGL -lGLU -lglut运⾏:如果能出现这个图⽚,证明环境配置成功。

西北工业大学c++大作业

西北工业大学c++大作业

程序设计挑战式课程设计极限挑战挑战,不是为着征服自然,而是为着突破自我,超越自我生命有极限,思想无极限,高度有极限,境界无极限作业名称:利用OpenGL 实现有色立体茶壶旋转图形 学 院:航海学院 班 级:03021301 学 号:2013300749 姓 名:刘德柱 团队组成: 刘德柱主要负责茶壶形态构建函数模块、潘峰主要负责旋转实现函数,调试、完善、报告等共同完成。

西北工业大学2022年4月26日请填写以下十项内容,将表格按页对齐(插入空行),勿删除任何部分。

1、问题与背景(描述程序所要解决的问题或应用背景)2、开发工具(列出所使用的开发工具和第3方开发库)3、主要功能(详细说明程序的功能)4、设计内容(详细描述解决问题的原理和方法、算法、数据结构等)至此,程序的大体内容以及机构已经构造成型OPENGL的主体绘制工作:首先使用glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 清除屏幕和深度缓存,然后使用glLoadIdentity();重置当前的模型观察矩阵,确定绘制好图形的位置glTranslatef(0.0f,0.0f,z); 移入屏幕 z 个单位。

函数glTranslatef(x, y, z)作用为沿着 X, Y 和 Z 轴移动;现在是本程序中最重要的语句:glRotatef(angle,0.0f,0.0f,0.0f),其中angle为每次旋转的角度,之后分别是XYZ三个轴的旋转分量,这三个旋转分量构成了三维坐标轴中的旋转法向量。

绘制:void COPENGLActView::OnDraw(CDC* pDC){5、程序文件与工程名称(标出程序中所有文件名、工程名称及其说明)6、函数模块(程序中各个函数的原型声明及其说明)7、使用说明(运行程序的小型说明书)8、程序开发总结(简要叙述编写本作业的收获与思考)的功能十分强大,需要我们学习的地方还有很多。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

程序设计挑战式课程设计极限挑战挑战,不是为着征服自然,而是为着突破自我,超越自我生命有极限,思想无极限,高度有极限,境界无极限作业名称:可爱的玩偶 学 院:电子信息学院 班 级:学 号:姓 名:团队组成:西北工业大学2022年4月26日请填写以下十项内容,将表格按页对齐(插入空行),勿删除任何部分。

1、问题与背景(描述程序所要解决的问题或应用背景)2、开发工具(列出所使用的开发工具和第3方开发库)3、主要功能(详细说明程序的功能)4、设计内容(详细描述解决问题的原理和方法、算法、数据结构等)5、程序文件与工程名称(标出程序中所有文件名、工程名称及其说明)6、函数模块(程序中各个函数的原型声明及其说明)7、使用说明(运行程序的小型说明书)8、程序开发总结(简要叙述编写本作业的收获与思考)9、运行截图(附上程序运行的截图画面,至少有1幅,截图越翔实得分越Windows中抓取当前活动窗口:Alt + Print Screen,抓取全屏:Print Screen。

或者使用HyperSnap等软件(百度搜索)。

10、源程序(附上程序源代码,若是多个文件,标出文件名)#include "stdio.h"#ifdef __APPLE__#include <GLUT/glut.h>#else#include <GL/glut.h>#endif#include <stdlib.h>static int slices = 16;static int stacks = 16;/* GLUT callback Handlers */static void resize(int width, int height){const float ar = (float) width / (float) height;glViewport(0, 0, width, height);glMatrixMode(GL_PROJECTION);glLoadIdentity();glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity() ;}static void display(void)//该函数的内容课改动static double a =0;//定义a为每次旋转的角度a=a+0.15;glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除颜色缓冲区和深度缓冲区glColor3d(0,1,1);//画图的颜色为红//绘制一个实心球,默认原点在屏幕中心与照相机重合glPushMatrix();glTranslated(0,0,-5); //x中为0,y值为0,z为-6,z值取负值才可以显示glRotated(90,1,0,0);//绕x轴转动,角度60,不动点原点glRotated(a,0,0,1);//绕z轴旋转,每次调用display时角度a的值都增加了0.08,实现了旋转。

glutSolidSphere(1,slices,stacks);//画圆球半径是1,经度数,纬度数分别为16glPopMatrix();glColor3d(1,1,0);//画图的颜色为蓝绿色glPushMatrix();glTranslated(0.5,0.5,-3); //x中为0,y值为0,z为-6,z值取负值才可以显示glRotated(60,1,0,0);//绕x轴转动,角度60,不动点原点glRotated(a,0,0,1);//绕z轴旋转,每次调用display时角度a的值都增加了0.08,实现了旋转。

glutSolidSphere(0.15,slices,stacks);//画圆球半径是1,经度数,纬度数分别为16glPopMatrix();//绘制一个实心圆锥体,默认原点在屏幕中心与照相机重合glColor3d(1,1,0);//画图的颜色为蓝绿色//绘制一个实心球,默认原点在屏幕中心与照相机重合glPushMatrix();glTranslated(-0.5,0.5,-3); //x中为0,y值为0,z为-6,z值取负值才可以显示 glRotated(60,1,0,0);//绕x轴转动,角度60,不动点原点glRotated(a,0,0,1);//绕z轴旋转,每次调用display时角度a的值都增加了0.08,实现了旋转。

glutSolidSphere(0.15,slices,stacks);//画圆球半径是1,经度数,纬度数分别为16glPopMatrix();//绘制一个实心圆锥体,默认原点在屏幕中心与照相机重合glColor3d(1,1,0);//画图的颜色为红蓝色//绘制一个实心圆锥体,默认原点在屏幕中心与照相机重合glPushMatrix();glTranslated(0,0,-2.12);//相对照相机将对象向上移动1.6,向照相机前方移动6 glRotated(60,1,0,0);//绕x轴转动,角度60glRotated(a,0,0,0);//绕原点轴旋转, 角度a,不动点原点glutSolidCone(0.3,0.3,slices,stacks);//glutSolidCone(GLdouble radius,GLdouble height, GLint slices, GLint stacks)glPopMatrix();glColor3d(0,1,1);//画图的颜色为蓝绿色//绘制一个线框圆环glPushMatrix();glTranslated(0,0,-6);glRotated(60,0,1,0);//绕y轴转动60度glRotated(a,0,1,0);//绕y轴旋转, 角度a,不动点原点glutWireTorus(0.5,1.8,slices,stacks);//glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);glPopMatrix();glutSwapBuffers();}static void key(unsigned char key, int x, int y)//键盘回调函数{switch (key){case 27 ://Esc键的ASCII值为27case 'q':exit(0);break;case '+':slices++;stacks++;break;case '-':if (slices>3 && stacks>3){slices--;stacks--;}break;}glutPostRedisplay();//标记当前窗口需要重新绘制}static void idle(void)//空闲回调函数{glutPostRedisplay();//标记当前窗口需要重新绘制}const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };//光源中环境光的颜色,黑色,第四个分量1.0表示不透明。

const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };//光源中漫射光的颜色,白色const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };//光源中镜面反射光的颜色const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };//定向光源,指定了光源的方向//定义材质属性值,使用数组来存放材质的颜色值const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f }; //材质的环境颜色const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f }; //材质的漫射光颜色const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };//材质镜面反射光的颜色const GLfloat high_shininess[] = { 100.0f };//材质的镜面反射指数/* Program entry point */int main(int argc, char *argv[]){glutInit(&argc, argv);glutInitWindowSize(640,480);//窗口大小glutInitWindowPosition(10,10);//窗口位置glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);//glutCreateWindow("GLUT Shapes");glutReshapeFunc(resize);glutDisplayFunc(display);glutKeyboardFunc(key);glutIdleFunc(idle);glClearColor(1,0,2,0);//参数可以在0、1改动glEnable(GL_CULL_FACE);glCullFace(GL_BACK);glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LESS);glEnable(GL_LIGHT0);//启用0号光源glEnable(GL_NORMALIZE);// 启用自动单位化法向量glEnable(GL_COLOR_MATERIAL);//启用材质颜色glEnable(GL_LIGHTING);//启用光照//设置0号光源的特性值glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);glLightfv(GL_LIGHT0, GL_POSITION, light_position);//设置材质的特性值,本题只设置了物体前面的材质值glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);glutMainLoop();return EXIT_SUCCESS;}。

相关文档
最新文档