2D太阳系绘制_第1页
2D太阳系绘制_第2页
2D太阳系绘制_第3页
2D太阳系绘制_第4页
2D太阳系绘制_第5页
已阅读5页,还剩9页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验六2D太阳系绘制一、实验目的1、掌握2D太阳系绘制方法2、掌握矩阵堆栈流程3、进一步掌握复合2D图形变换二、实验环境硬件要求:PC机,主流配置,最好为独立显卡,显存 512M以上。软件环境:操作系统:Win dows XP语言开发工具:Microsoft Visual studio 2008,Visual C+三、实验内容与要求要求:实验课上老师要求的效果截图、及其相应代码拷贝到实验报告文档里。WORDfc档命名方式:学号姓名-实验序号-实验名称。内容:1、已知太阳半径Rs,地球半径Re月球半径Rm,每个球都会自转,地球绕太阳公转,月 球绕地球公转。2、基本框架程序2DSunSystem0

2、.cpp3、设计世界坐标系,设计裁剪窗口大小,编写2D太阳系代码。4、效果截图图6-1 2D太阳系效果5、分别在太阳、地球、月球位置添加中文字体“太阳”、“地球”、“月球”o月球地球太阳6在修改的代码上加上自己的一些点缀修饰性图形四、参考函数:1、void glPushMatrix(void)功能:把当前操作矩阵压入矩阵堆栈,记住当前所在的位置复制活动栈顶的当前矩阵并将其存入第二个栈位置2、void glPopMatrix(void)功能:当前操作矩阵出栈,它下面的矩阵作为当前矩阵,返回到以前所在的位置。破坏栈顶矩阵,栈的第二个矩阵成为当前矩阵。如果要弹出栈顶,栈内至少要有2个矩阵,否则就会出

3、错。3、中文字体绘制在程序头部声明所用到的字体函数void selectF on t(i nt size, int charset, const char* face)选择字体void drawCNStri ng(co nst char* str);生成中文字体函数/在绘制部分调用字体函数,写中文字selectFont(48, GB2312_CHARS楷体_GB2312); / 设置字体楷体 24 号字glRasterPos2f(250, 550);/ 定位首字位置drawCNString(Hellp 大家好);/ 写字“ Hello,大家好”*/*/*选择字体函数 /*/void selec

4、tF on t(i nt size, int charset, const char* face)HFONT hFo nt = CreateFo ntA(size, 0, 0, 0, FW_MEDIUM, 0, 0, 0, charset, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, face);HFONT hOldFo nt = (HFONT)SelectObject(wglGetCurre ntDC(), hFo nt);DeleteObject(hOldFo nt)

5、;/*/*生成中文字体函数*/*/void drawCNStri ng(c onst char* str)int len, i;wchar_t* wstri ng;HDC hDC = wgIGetCurre ntDC();GLuint list = glGenLists(1);/计算字符的个数/如果是双字节字符的(比如中文字符),两个字节才算一个字符/否则一个字节算一个字符len = 0;for(i=0; stri!=O; +i)if( lsDBCSLeadByte(stri)+i;+le n;/将混合字符转化为宽字符wstri ng = (wchar_t*)malloc(le n+1) *

6、sizeof(wchar_t);MultiByteToWideChar(CP_ACB_PRECOMPOSED, str, -1, wstri ng, le n); wstri ngle n = L0;/逐个输出字符for(i=O; ile n; +i)wglUseFo ntBitmapsW(hDC, wstri ngi, 1, list);glCallList(list);/回收所有临时资源free(wstri ng);glDeleteLists(list, 1);4、圆的绘制1) 圆盘绘制方法GLUquadricObj *disk;定义二次曲面对象disk=gluNewQuadric();

7、/ 生成二次去面对像 gluDisk(disk,0.8,1,50,50);/ 内径 0.8,外径 1,盘心在原点2) 球的绘制方法glutSolidSphere(1,80,80)/半径为1的球,球心在原点5、反走样代码glBle ndFu nc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glE nable(GL_BLEND);glE nable(GL_POINT_SMOOTH);glHi nt(GL_POINT_SMOOTH_HINT, GL_NICEST);glE nable(GL_LINE_SMOOTH);glHi nt(GL_LINE_SMOOTH_HI

8、NT, GL_NICEST);glE nable(GL_POLYGON_SMOOTH);glHi nt(GL_POLYGON_SMOOTH_HINT, GL_NICEST);四、思考题1、如果太阳在平面任意位置,程序应该如何修改?2、 OpenG图形变换靠什么来完成?在 OpenG中完成矩阵操作,需要注意哪些问题?3、 glPushMatrix() , glPopMatrix(是如何工作的?试运用这两个函数设计其他复合(或动画)图形#include stdafx.h#include #include float rs=50,re=30,rm=10;float xs=0, ys=0, xe=15

9、0,ye=0, xm=200,ym=0;float asaeam,aesame;void Display(void);void Reshape nt w, int h);void mytime( int value);void myi nit(void);voidsun();void earth();int APIENTR_tWinMaii(HINSTANCEistaneeHINSTANCErevI nsta neeLPTSTR IpCmdLineintn CmdShoWUNREFERENCED_PARAMETERsta neeUNREFERENCED_PARAMCmER n$char *ar

10、gv = hello , ;int arge = 2; / must/should match the number of strings in argvglut In it(&argG argv); / 初始化 GLU 库;glutInitWindowSiz(700,700); / 设置显示窗口大小glutInitDisplayMod(GLUT_DOUBLGLUT_RGB 设置显示模式;(注意双缓冲)glutCreateWindoWA Rotating Sun System/ 创建显示窗口 glutDisplayFun(Display; / 注册显示回调函数 glutReshapeFuRRe

11、shape 注册窗口改变回调函数 myi nit();glutTimerF un (200, mytime 10);glutMainLoo(); /进入事件处理循环return 0;void myi nit()glPoi ntSizglO);glL in eWidth8);glBle ndFu n(GL_SRC_ALP GL_ONE_MINUS_SRC_ALPHAglE nabl&GL_BLENDglE nabl&GL_POINT_SMOOTHglHi nt(GL_POINT_SMOOTHJGN_NICESTglE nabl&GL_LINE_SMOOTHglHi nt(GL_LINE_SMOO

12、TH_HNTNICESTglE nable(GL_POLYGON_SMOOTHglHi nt(GL_POLYGON_SMOOTH_GLNNICE)STvoid Display(void)glClea(GL_COLOR_BUFFER_BITglMatrixModeGL_MODELV)E/A/设置矩阵模式为模型变换模式,表示在世界坐标系下glLoadIdentityf); /将当前矩阵设置为单位矩阵sun();earth();glutSwapBuffer; /双缓冲的刷新模式;voidsun()glRotate(as0,0,1);glPushMatri*);glPushMatri*);glColo

13、r3(1,0,0);glutWireSphergs,40,40); gIPopMatriX); glColor3(1,1,0); glBegin(GL_POINT;S glVertex2(xs+ rs,ys);glE nc();gIPopMatriX);void earth()gIPushMatriX);glRotate(aes0,0,1);gITra nslate(xcye,0);glRotate(ae,0,0,1);glTra nslate(-xe,-ye,0);glPushMatriX);glPushMatriX);glColor3(0,0,1);glutWireSpherge,40,40);gIPopMatriX);glColor3(1,1,0);glBegin(GL_POINT;SglVertex2(xs_ rs,y9;glE nc();gIPopMatriX);gIPopMatriX);void mytime( int vagas+=1;ae+=1;aes_=1;glutPostRedisplay; /重画,相当于重新调用Display。改编后的变量得以传给绘制函数 glutTimerF un C200, my

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论