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

下载本文档

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

文档简介

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

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

3、栈内至少要有2个矩阵,否则就会出错。3、中文字体绘制在程序头部声明所用到的字体函数void selectFont(int size, int charset, const char* face); /选择字体void drawCNString(const char* str); /生成中文字体函数/在绘制部分调用字体函数,写中文字 selectFont(48, GB2312_CHARSET, "楷体_GB2312"); /设置字体楷体24号字 glRasterPos2f(250, 550); /定位首字位置drawCNString("Hello,大家好"

4、); /写字“Hello,大家好”/*/* 选择字体函数 */*/void selectFont(int size, int charset, const char* face) HFONT hFont = CreateFontA(size, 0, 0, 0, FW_MEDIUM, 0, 0, 0,charset, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, face);HFONT hOldFont = (HFONT)SelectObject(wglGetCurrentDC

5、(), hFont);DeleteObject(hOldFont);/*/* 生成中文字体函数 */*/void drawCNString(const char* str)int len, i;wchar_t* wstring;HDC hDC = wglGetCurrentDC();GLuint list = glGenLists(1);/ 计算字符的个数/ 如果是双字节字符的(比如中文字符),两个字节才算一个字符/ 否则一个字节算一个字符len = 0;for(i=0; stri!='0' +i)if( IsDBCSLeadByte(stri) )+i;+len;/ 将混合字

6、符转化为宽字符wstring = (wchar_t*)malloc(len+1) * sizeof(wchar_t);MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, -1, wstring, len);wstringlen = L'0'/ 逐个输出字符for(i=0; i<len; +i)wglUseFontBitmapsW(hDC, wstringi, 1, list);glCallList(list);/ 回收所有临时资源free(wstring);glDeleteLists(list, 1);4、圆的绘制 1)圆盘绘

7、制方法 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_NICE

8、ST); 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()是如何工作的?试运用这两个函数设计其他复合(或动画)图形。#include "stdafx.h&quo

9、t;#include <glut.h>#include <math.h>float rs=50,re=30,rm=10;float xs=0,ys=0,xe=150,ye=0,xm=200,ym=0;float as,ae,am,aes,ame;void Display(void);void Reshape(int w, int h);void mytime(int value);void myinit(void);void sun();void earth();int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE

10、hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); char *argv = "hello ", " " int argc = 2; / must/should match the number of strings in argv glutInit(&argc, argv); /初始化GLUT库; glutInitWindowSize(700,700); /

11、设置显示窗口大小 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); /设置显示模式;(注意双缓冲) glutCreateWindow("A Rotating Sun System"); / 创建显示窗口 glutDisplayFunc(Display); /注册显示回调函数 glutReshapeFunc(Reshape); /注册窗口改变回调函数 myinit(); glutTimerFunc(200, mytime, 10); glutMainLoop(); /进入事件处理循环 return 0;void myinit()glPo

12、intSize(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);void

13、 Display(void) glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); /设置矩阵模式为模型变换模式,表示在世界坐标系下 glLoadIdentity(); /将当前矩阵设置为单位矩阵 sun(); earth(); glutSwapBuffers(); /双缓冲的刷新模式;void sun()glRotatef(as,0,0,1);glPushMatrix(); glPushMatrix();glColor3f(1,0,0);glutWireSphere(rs,40,40); glPopMatrix(); glColo

14、r3f(1,1,0);glBegin(GL_POINTS);glVertex2f(xs+rs,ys);glEnd();glPopMatrix();void earth()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();void mytime(int value)as+=1;ae+=1;aes+=1; glutPostRedisplay(); /重画,相当于重新调用Display(),改编后的变量得以传给绘制函数 glutTimerFunc(200, myti

温馨提示

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

评论

0/150

提交评论