实验六2D太阳系绘制一、实验目的1、掌握2D太阳系绘制方法2、掌握矩阵堆栈流程3、进一步掌握复合2D图形变换二、实验环境硬件要求:PC机,主流配置,最好为独立显卡,显存512M以上。软件环境:操作系统:WindowsXP。语言开发工具:MicrosoftVisualstudio2008,VisualC++。三、实验内容与要求要求:实验课上老师要求的效果截图、及其相应代码拷贝到实验报告文档里。WORD文档命名方式:学号姓名-实验序号-实验名称。内容:1、已知太阳半径Rs,地球半径Re,月球半径Rm,每个球都会自转,地球绕太阳公转,月球绕地球公转。2、基本框架程序2DSunSystem0.cpp3、设计世界坐标系,设计裁剪窗口大小,编写2D太阳系代码。4、效果截图图6-12D太阳系效果5、分别在太阳、地球、月球位置添加中文字体“太阳”、“地球”、“月球”6、在修改的代码上加上自己的一些点缀修饰性图形四、参考函数:1、voidglPushMatrix(void)功能:把当前操作矩阵压入矩阵堆栈,记住当前所在的位置。复制活动栈顶的当前矩阵并将其存入第二个栈位置2、voidglPopMatrix(void)功能:当前操作矩阵出栈,它下面的矩阵作为当前矩阵,返回到以前所在的位置。破坏栈顶矩阵,栈的第二个矩阵成为当前矩阵。如果要弹出栈顶,栈内至少要有2个矩阵,否则就会出错。3、中文字体绘制在程序头部声明所用到的字体函数voidselectFont(intsize,intcharset,constchar*face);//选择字体voiddrawCNString(constchar*str);//生成中文字体函数//在绘制部分调用字体函数,写中文字selectFont(48,GB2312_CHARSET,楷体_GB2312);//设置字体楷体24号字glRasterPos2f(250,550);//定位首字位置drawCNString(Hello,大家好);//写字“Hello,大家好”/************************************************************************//*选择字体函数*//************************************************************************/voidselectFont(intsize,intcharset,constchar*face){HFONThFont=CreateFontA(size,0,0,0,FW_MEDIUM,0,0,0,charset,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,face);HFONThOldFont=(HFONT)SelectObject(wglGetCurrentDC(),hFont);DeleteObject(hOldFont);}/************************************************************************//*生成中文字体函数*//************************************************************************/voiddrawCNString(constchar*str){intlen,i;wchar_t*wstring;HDChDC=wglGetCurrentDC();GLuintlist=glGenLists(1);//计算字符的个数//如果是双字节字符的(比如中文字符),两个字节才算一个字符//否则一个字节算一个字符len=0;for(i=0;str[i]!='\0';++i){if(IsDBCSLeadByte(str[i]))++i;++len;}//将混合字符转化为宽字符wstring=(wchar_t*)malloc((len+1)*sizeof(wchar_t));MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,str,-1,wstring,len);wstring[len]=L'\0';//逐个输出字符for(i=0;ilen;++i){wglUseFontBitmapsW(hDC,wstring[i],1,list);glCallList(list);}//回收所有临时资源free(wstring);glDeleteLists(list,1);}4、圆的绘制1)圆盘绘制方法GLUquadricObj*disk;//定义二次曲面对象disk=gluNewQuadric();//生成二次去面对像gluDisk(disk,0.8,1,50,50);//内径0.8,外径1,盘心在原点2)球的绘制方法glutSolidSphere(1,80,80);//半径为1的球,球心在原点5、反走样代码glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);glEnable(GL_BLEND);glEnable(GL_POINT_SMOOTH);glHint(GL_POINT_SMOOTH_HINT,GL_NICEST);glEnable(GL_LINE_SMOOTH);glHint(GL_LINE_SMOOTH_HINT,GL_NICEST);glEnable(GL_POLYGON_SMOOTH);glHint(GL_POLYGON_SMOOTH_HINT,GL_NICEST);四、思考题1、如果太阳在平面任意位置,程序应该如何修改?2、OpenGL图形变换靠什么来完成?在OpenGL中完成矩阵操作,需要注意哪些问题?3、glPushMatrix(),glPopMatrix()是如何工作的?试运用这两个函数设计其他复合(或动画)图形。#includestdafx.h#includeglut.h#includemath.hfloatrs=50,re=30,rm=10;floatxs=0,ys=0,xe=150,ye=0,xm=200,ym=0;floatas,ae,am,aes,ame;voidDisplay(void);voidReshape(intw,inth);voidmytime(intvalue);voidmyinit(void);voidsun();voidearth();intAPIENTRY_tWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPTSTRlpCmdLine,intnCmdShow){UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);char*argv[]={hello,};intargc=2;//must/shouldmatchthenumberofstringsinargvglutInit(&argc,argv);//初始化GLUT库;glutInitWindowSize(700,700);//设置显示窗口大小glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);//设置显示模式;(注意双缓冲)glutCreateWindow(ARotatingSunSystem);//创建显示窗口glutDisplayFunc(Display);//注册显示回调函数glutReshapeFunc(Reshape);//注册窗口改变回调函数myinit();glutTimerFunc(200,mytime,10);glutMainLoop();//进入事件处理循环return0;}voidmyinit(){glPointSize(10);glLineWidth(8);glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);glEnable(GL_BLEND);glEnable(GL_POINT_SMOOTH);glHint(GL_POINT_SMOOTH_HINT,GL_NICEST);glEnable(GL_LINE_SMOOTH);glHint(GL_LINE_SMOOTH_HINT,GL_NICEST);glEnable(GL_POLYGON_SMOOTH);glHint(GL_POLYGON_SMOOTH_HINT,GL_NICEST);}voidDisplay(void){glClear(GL_COLOR_BUFFER_BIT);glMatrixMode(GL_MODELVIEW);//设置矩阵模式为模型变换模式,表示在世界坐标系下glLoadIdentity();//将当前矩阵设置为单位矩阵sun();earth();glutSwapBuffers();//双缓冲的刷新模式;}voidsun(){glRotatef(as,0,0,1);glPushMatrix();glPushMatrix();glColor3f(1,0,0);glutWireSphere(rs,40,40);glPopMatrix();glColor3f(1,1,0);glBegin(GL_POINTS);glVertex2f(xs+rs,ys);glEnd();glPopMatrix();}voidearth(){glPushMatrix();glRotatef(aes,0,0,1);glTranslatef(xe,ye,0);glRotatef(ae,0,0,1);glTranslatef(-xe,-ye,0);glPushMatrix();glPushMatrix();glColor3f(0,0,1);glutWireSphere(re,40,40);glPopMatrix();glColor3f(1,1,0);glBegin(GL_POINTS);glVertex2f(xs+rs,ys);glEnd();glPopMatrix();glPopMatrix();}voidmytime(intvalue){as+=1;ae+=1;aes+=1;glutPostRedisplay();//重画,相当于重新调用Display(),改编后的变量得以传给绘制函数glutTimerFunc(200,mytime,10);}voidReshape(GLsizeiw,GLsizeih){glMatrixMode(GL_PROJECTION);//投影矩阵模式glLoadIdentity();//矩阵堆栈清空glViewport(0,0,w,h);//设置视区大小gluOrtho2D(-xm-rm-10,xm+rm+10,-xm-rm-10,xm+rm+10);//设置裁剪窗口大小glMatrixMode(GL_MODELVIEW);//模型矩阵模式}