OpenGL图形编程2基本图形绘制(陈永强)
- 格式:ppt
- 大小:482.50 KB
- 文档页数:47
《OpenGL编程精粹》实验报告班级:计科083姓名:许银学号:0804641004指导教师:陈永强2011 年6 月 4 日一、实验目的通过本实验,使自己了解OpenGL的有关原理、算法及系统,掌握基本图形学显示程序设计方法,及三维图形程序设计方法,还要学习OpenGL光源、光照模型、物体材质、明暗处理、深度测试等生成真实世界的基本方法,为进一步学习计算机辅助设计方面的设计知识打下基础,同时通过此课程设计提高动手实践能力和学习分析能力。
二、实验要求这次课程设计的要求是通过OpenGL编程,模拟太阳、地球、月亮三者之间公转与自转的运动关系。
三、开发环境基于OpenGL的Microsoft Visual C++ 6.0四、实验内容//外部变量定义static GLfloat a = 3.5;static GLfloat b = 2;static GLfloat x = 0.0;static GLfloat y = 2.0;static GLfloat spin = 0.0;static GLfloat right = 0.0;static GLfloat left = 0.0;static GLfloat up = 0.0;static GLfloat down = 0.0;static sun_rotate = 0.0;static m = 0.0;static n = 0.0;static m_spin = 0.0;static m_x = 1.0;static m_y = 0.0;void sunfunc(void){sun_rotate+=2.0;if(sun_rotate>360.0)sun_rotate-=360.0;glutPostRedisplay();}{right+=2.0;if(right>360)right-=360;glutPostRedisplay(); }void leftfunc(void) {left+=2.0;if(left>360)left-=360;glutPostRedisplay(); }void upfunc(void) {up+=2.0;if(up>360.0)up-=360.0;glutPostRedisplay(); }void downfunc(void) {down+=2.0;if(down>360.0)down-=360.0;glutPostRedisplay(); }void spinfunc(void) {spin+=0.006;if(spin>360)spin-=360.0;x=a*sin(spin);y=b*cos(spin);glutPostRedisplay(); }{m_spin+=2;if(m_spin>360.0)m_spin-=360;m_x=sin(m_spin);m_y=cos(m_spin);glutPostRedisplay();}//初始化void init(void){//设置背景色glClearColor(0.0, 0.0, 0.0, 0.0);//设置平滑着色glShadeModel(GL_SMOOTH);//启用深度测试消隐glEnable(GL_DEPTH_TEST);//全局环境光GLfloat model_ambient[]={0.1,0.1,0.1,1.0};//光源位置GLfloat light_position[]={1.0, 1.0, 1.0, 0.0};//光的环境强度 GLfloat light_ambient[]={1.0, 1.0, 1.0, 1.0};//光的散射强度GLfloat light_diffuse[]={1.0, 1.0, 1.0, 1.0};//光的镜面强度GLfloat light_specular[]={1.0, 1.0, 1.0, 1.0};//设置背景色glClearColor(0.0, 0.0, 0.0, 0.0);//设置平滑着色glShadeModel(GL_SMOOTH);//启用深度测试消隐glEnable(GL_DEPTH_TEST);glLightfv(GL_LIGHT0,GL_POSITION,light_position);glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);//光照模型glLightModelfv(GL_LIGHT_MODEL_AMBIENT,model_ambient);//启用光照 glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);//启用混合glEnable(GL_BLEND);//启用抗锯齿glEnable(GL_POINT_SMOOTH);glEnable(GL_LINE_SMOOTH);glEnable(GL_POLYGON_SMOOTH);//启用雾// glEnable(GL_FOG);}//回调void display(void){//地球材质属性GLfloat mat_ambient[] = { 0.2, 0.2, 0.9, 1.0 };GLfloat mat_diffuse[] = { 0.2, 0.2, 0.9, 1.0 };GLfloat mat_specular[] = { 0.2, 0.1, 0.8, 1.0 };GLfloat mat_shininess[] = { 10.0 };GLfloat mat_emission[] = {0.1, 0.1, 0.1, 0.0};//太阳材质属性GLfloat sun_ambient[] = { 0.9, 0.2, 0.1, 1.0 };GLfloat sun_diffuse[] = { 0.9, 0.2, 0.2, 1.0 };GLfloat sun_specular[] = { 0.9, 0.3, 0.1, 1.0 };GLfloat sun_shininess[] = { 20.0 };GLfloat sun_emission[] = {0.1, 0.1, 0.1, 0.0};//月球材质属性GLfloat mom_ambient[] = { 0.5, 0.5, 0.5, 1.0 };GLfloat mom_diffuse[] = { 0.5, 0.5, 0.5, 1.0 };GLfloat mom_specular[] = { 0.5, 0.5, 0.5, 1.0 };GLfloat mom_shininess[] = { 50.0 };GLfloat mom_emission[] = {0.1, 0.1, 0.1, 0.0};glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glColor4f(1.0,1.0,1.0,0.0);glPushMatrix();glPushMatrix();glEnable(GL_LIGHTING);//设置太阳材质属性glMaterialfv(GL_FRONT, GL_AMBIENT, sun_ambient);glMaterialfv(GL_FRONT, GL_DIFFUSE, sun_diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, sun_specular); glMaterialfv(GL_FRONT, GL_SHININESS, sun_shininess); glMaterialfv(GL_FRONT, GL_EMISSION, sun_emission); //太阳自传sunfunc();glRotatef(sun_rotate,1.0,1.0,0.0);glutSolidSphere(0.8,100,100);glPopMatrix();//轨道旋转glRotatef(right, 0.0, 1.0, 0.0);glRotatef(-left, 0.0, 1.0, 0.0);glRotatef(-up, 1.0, 0.0, 0.0);glRotatef(down, 1.0, 0.0, 0.0);glPushMatrix();glTranslatef(x,y,0);glEnable(GL_LIGHTING);//地球材质设置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, mat_shininess); glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);glutSolidSphere(0.3, 100, 100);glDisable(GL_LIGHTING);glutSolidTorus(0.004,0.56,100,100);glPushMatrix();{glRotatef(-m_spin,0,0,1);glTranslatef(0.4,0.4,0);m_spinfunc();glEnable(GL_LIGHTING);//月球材质设定glMaterialfv(GL_FRONT, GL_AMBIENT, mom_ambient);glMaterialfv(GL_FRONT, GL_DIFFUSE, mom_diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, mom_specular); glMaterialfv(GL_FRONT, GL_SHININESS, mom_shininess); glMaterialfv(GL_FRONT, GL_EMISSION, mom_emission); glutSolidSphere(0.14,100,100);}glPopMatrix();glPopMatrix();glPushMatrix();//绘制轨道禁用光照glDisable(GL_LIGHTING);glScalef(a/b,1.0,1.0);glutSolidTorus(0.003,2.0,100,100);glPopMatrix();glPopMatrix();glutSwapBuffers();}//窗口变化函数void reshape(int w,int h){//视口变换glViewport( 0, 0, (GLsizei)w,(GLsizei)h);//选择投影矩阵glMatrixMode(GL_PROJECTION);//重置投影矩阵glLoadIdentity();//正投影if(w>=h)glOrtho(-3.0*(GLfloat)w/(GLfloat)h, 3.0*(GLfloat)w/(GLfloat)h, -3.0, 3.0, -10.0, 10.0);elseglOrtho(-3.0, 3.0, -3.0*(GLfloat)w/(GLfloat)h,3.0*(GLfloat)w/(GLfloat)h, -10.0, 10.0);//透视投影// gluPerspective(45.0, (GLfloat)w/(GLfloat)h, 1.0, 100.0);//选择模型视图矩阵glMatrixMode(GL_MODELVIEW);//重置模型视图矩阵glLoadIdentity();//下面可以设置观察点 glLookAt() 或是变换场景局部坐标系glTranslate() glRotate() glScale()// gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);}//鼠标响应void mouse(int button, int state, int x, int y){switch(button){case GLUT_LEFT_BUTTON:if(state==GLUT_DOWN)glutIdleFunc(spinfunc);break;case GLUT_RIGHT_BUTTON:if(state==GLUT_DOWN)glutIdleFunc(m_spinfunc);break;case GLUT_MIDDLE_BUTTON:if(state==GLUT_DOWN)break;}}//主函数int main(int argc,char **argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize(850,600);glutInitWindowPosition(100,100);glutCreateWindow(argv[0]);init();glutReshapeFunc(reshape);glutMouseFunc(mouse);glutKeyboardFunc(keyboard);glutDisplayFunc(display);glutMainLoop();return 0;}实验结果如下:五、实验总结及心得体会通过这次实验,使我学习了更多的基于OpenGL的编程方法,在实验过程中多多少少出现过各式各样的问题,我也不断在学习解决这些问题,编程就是要将理论付诸于实践,二者相辅相成,所以要多多练习OpenGL的编程,提高自己的编程能力,同时不断地掌握新的理论知识。
OpenGL基本图形的绘制1.使用glColor,glPointSize函数绘制三个不同颜色和大小的点// T.cpp : Defines the entry point for the console application. //#include "stdafx.h"#includevoid Display(void) {glClear(GL_COLOR_BUFFER_BIT);glPointSize(5.0f);glBegin(GL_POINTS);glColor3f(1.0,0.0,0.0);glVertex2f(0.3f,0.5f);glEnd();glPointSize(8.0f);glBegin(GL_POINTS);glColor3f(0.0,1.0,0.0);glVertex2f(0.0f,0.0f);glEnd();glPointSize(10.0f);glBegin(GL_POINTS);glColor3f(0.0,0.0,1.0);glVertex2f(-0.3f,-0.5f);glEnd();glFlush();}int main(int argc,char* argv[]) {glutInit(&argc,argv);glutInitDisplayMode(GLUT_RGB); glutInitWindowPosition(200,200);glutInitWindowSize(400,400);glutCreateWindow("Three Point");glutDisplayFunc(&Display);glutMainLoop();return 0;}2.使用glColor,glLineWidth,glLineStripple函数绘制实心、虚线及渐变色线(1)实心线// T.cpp : Defines the entry point for the console application.//#include "stdafx.h"#includevoid Display(void) {glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0);glEnable(GL_LINE_STIPPLE);glShadeModel(GL_SMOOTH);glLineStipple(2,0xFFFF);glLineWidth(2);glBegin(GL_LINES);glVertex2i(-100,0);glVertex2i(100,0);glEnd();glFlush();}int main(int argc,char* argv[]) {glutInit(&argc,argv);glutInitDisplayMode(GLUT_RGB);glutInitWindowPosition(200,200);glutInitWindowSize(400,400);glutCreateWindow("Solid Line");glutDisplayFunc(&Display);glutMainLoop();return 0;}(2)虚线// T.cpp : Defines the entry point for the console application. //#include "stdafx.h"#includevoid Display(void) {glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0);glEnable(GL_LINE_STIPPLE);glShadeModel(GL_SMOOTH);glLineStipple(4,0xAAAA);glLineWidth(2);glBegin(GL_LINES);glVertex2i(-100,0);glVertex2i(100,0);glEnd();glFlush();}int main(int argc,char* argv[]) {glutInit(&argc,argv);glutInitDisplayMode(GLUT_RGB);glutInitWindowPosition(200,200);glutInitWindowSize(400,400);glutCreateWindow("Dotted Line");glutDisplayFunc(&Display);glutMainLoop();return 0;}(3)渐变线// T.cpp : Defines the entry point for the console application. //#include "stdafx.h"#includeGLuint Line;void Initial(void) {glClearColor(0.0f, 0.0f, 0.0f, 0.0f);Line = glGenLists(1);glNewList(Line, GL_COMPILE);glTranslatef(-50.0, 20.0, 0.0);glColor3f(255.0, 0.0, 0.0);glLineWidth(2);glBegin(GL_LINES);glColor3f(255.0, 0.0, 0.0);glVertex2i(0,-20);glColor3f(0.0, 0.0, 255.0);glVertex2i(100,-20);glEnd();glEndList();void ChangeSize(int w, int h) {glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D (-70.0f, 70.0f, -70.0f, 70.0f);}void Display(void) {glClear(GL_COLOR_BUFFER_BIT);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(0.0, 0.0, 0.0);glCallList(Line);glFlush();}int main(int argc, char* argv[]) {glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowSize(600,450);glutInitWindowPosition(100,100);glutCreateWindow("渐变色线");glutDisplayFunc(Display);glutReshapeFunc(ChangeSize);Initial();glutMainLoop();return 0;}3.使用glColor,glPolygonMode函数绘制纯色、渐变色、轮廓多边形(1)纯色六边形// a.cpp : Defines the entry point for the console application.//#include "stdafx.h"#includevoid init(){glClearColor (1.0, 1.0, 1.0, 0.0);glMatrixMode (GL_PROJECTION);gluOrtho2D (0.0, 200.0, 0.0, 150.0);}void polygon(void){glClear(GL_COLOR_BUFFER_BIT);int p1 [] = {20, 75};int p2 [] = {60, 5};int p3 [] = {140, 5};int p4 [] = {180, 75};int p5 [] = {140, 145};int p6 [] = {60, 145};glColor3f(0.0, 0.5, 1.0);glBegin(GL_POLYGON);glVertex2iv(p1);glVertex2iv(p2);glVertex2iv(p3);glVertex2iv(p4);glVertex2iv(p5);glVertex2iv(p6);glEnd();glFlush();}void main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(400, 300);glutCreateWindow("纯色六边形");init();glutDisplayFunc(polygon);glutMainLoop();}(2)渐变色六边形// a.cpp : Defines the entry point for the console application. //#include "stdafx.h"#includevoid init(){glClearColor (1.0, 1.0, 1.0, 0.0);glMatrixMode (GL_PROJECTION);gluOrtho2D (0.0, 200.0, 0.0, 150.0);}void polygon(void){glClear(GL_COLOR_BUFFER_BIT);int p1 [] = {20, 75};int p2 [] = {60, 5};int p3 [] = {140, 5};int p4 [] = {180, 75};int p5 [] = {140, 145};int p6 [] = {60, 145};glColor3f(0.0, 0.5, 1.0);glBegin(GL_POLYGON);glColor3f(0.0,0.0,1.0);glVertex2iv(p1);glColor3f(0.0,1.0,0.0);glVertex2iv(p2);glColor3f(1.0,0.0,0.0);glVertex2iv(p3);glColor3f(0.0,0.0,1.0);glVertex2iv(p4);glColor3f(0.0,1.0,0.0);glVertex2iv(p5);glColor3f(1.0,0.0,0.0);glVertex2iv(p6);glEnd();glFlush();}void main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(400, 300);glutCreateWindow("渐变色六边形");init();glutDisplayFunc(polygon);glutMainLoop();}(3)轮廓渐变色六边形// a.cpp : Defines the entry point for the console application. //#include "stdafx.h"#includevoid init(){glClearColor (1.0, 1.0, 1.0, 0.0); glPolygonMode (GL_FRONT_AND_BACK,GL_LINE); gluOrtho2D (0.0, 200.0, 0.0, 150.0);}void polygon(void){glClear(GL_COLOR_BUFFER_BIT);int p1 [] = {20, 75};int p2 [] = {60, 5};int p3 [] = {140, 5};int p4 [] = {180, 75};int p5 [] = {140, 145};int p6 [] = {60, 145};glColor3f(0.0, 0.5, 1.0);glBegin(GL_POLYGON);glColor3f(0.0,0.0,1.0);glVertex2iv(p1);glColor3f(0.0,1.0,0.0);glVertex2iv(p2);glColor3f(1.0,0.0,0.0);glVertex2iv(p3);glColor3f(0.0,0.0,1.0);glVertex2iv(p4);glColor3f(0.0,1.0,0.0);glVertex2iv(p5);glColor3f(1.0,0.0,0.0);glVertex2iv(p6);glEnd();glFlush();}void main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(400, 300); glutCreateWindow("轮廓渐变色六边形");init();glutDisplayFunc(polygon);glutMainLoop(); }。
实验名称OpenGL程序结构与基本图形的绘制一、实验目的学习基于OpenGL的图形学编程,掌握程序设计的基本过程与程序的基本结构。
二、实验内容在VC6.0下生成基于控制台的应用程序,把OpenGL的基本头文件包含进应用程序中,并设置好相应的环境参数,编写基于OpenGL的应用程序,实现基本图形的绘制。
三、实验步骤1.在VC6.0环境下生成一基于控制台的应用程序(win32 console),选择存储目录为桌面,名字为学号或者姓名的拼音。
如下图:2.在创建的应用程序中选择创建一个“hello world”的应用程序。
3.把以下代码加入到应用程序的CPP文件中。
void display() {glClear( GL_COLOR_BUFFER_BIT); // Clear the frame buffer glColor3f( 0.0, 1.0, 0.0); // Set current color to green}void init() {glClearColor( 0.0, 0.0, 0.0, 0.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(-1.0, 1.0, -1.0, 1.0);glMatrixMode(GL_MODELVIEW);}并把原main函数中的内容用以下代码替换:glutInit( &argc, argv);glutInitWindowSize( 400, 400);glutInitWindowPosition( 200, 100);glutCreateWindow( "Green Triangle");glutDisplayFunc( display);init();glutMainLoop();return 0;4.修改display函数,实现三角形,多边形及圆等基本图形的绘制。
实验一OpenGL基本图形绘制一、实验目的和要求:1. 了解VC++环境下,OpenGL图形绘制的程序结构;2. 通过编程实现简单二维图形的绘制;3. 掌握理解简单的OpenGL程序结构;掌握OpenGL提供的基本图形函数,尤其是生成点、线、面的函数4. 掌握图形显示原理。
二、实验内容:1、OpenGL在VC++下的安装和配置2、读懂给定的示例程序,使用Visual C++ 6.0和OpenGL编写几个简单图形的绘制程序。
3、建议有能力的学生进一步学习OpenGL的复杂功能创建效果更好的三维图形;三、实验步骤:1、初步了解OpenGL的功能以及语法特点;2、下载glut包,复制 glut32.dll到winnt/system32文件夹下,复制glut32.lib到vc98/lib文件夹下,复制glut.h到vc98/include/gl文件夹下;3、创建VC工程:选择菜单File中的New选项,弹出一个分页的对话框,选中页Projects中的Win32 Console Application项,然后填入你自己的Project name,如Test,回车即可。
VC为你创建一个工作区(WorkSpace),你的项目Test就放在这个工作区里;4、为项目添加文件:为了使用OpenGL,我们需要在项目中加入三个相关的Lib文件:glu32.lib、glut32.lib、opengl32.lib,这三个文件位于VC安装目录下的lib目录(如c:\program files\ devstudio\vc\lib)中。
选中菜单Project->Add ToProject->Files项(或用鼠标右键),把这三个文件加入项目,在FileView中会有显示。
这三个文件请务必加入,否则编译时会出错。
或者将这三个文件名添加到Project->Setting->Link-> Object /library Modules 即可。