2D太阳系绘制
试验六 2D太阳系绘制 一、试验目的 1、驾驭2D太阳系绘制方法 2、驾驭矩阵堆栈流程 3、进一步驾驭复合2D图形变换 二、试验环境 硬件要求 PC机,主流配置,最好为独立显卡,显存512M以上。 软件环境 操作系统Windows XP。 语言开发工具Microsoft Visual studio 2021,Visual C。 三、试验内容与要求 要求 试验课上老师要求的效果截图、及其相应代码 拷贝到试验报告文档里。 WORD文档命名方式学号姓名-试验序号-试验名称。 内容 1、 太阳半径Rs,地球半径Re,月球半径Rm,每个球都会自转,地球绕太阳公转,月球绕地球公转。 2、 根本框架程序 3、设计世界坐标系,设计裁剪窗口大小,编写2D太阳系代码。 4、效果截图 图6-1 2D太阳系效果 5、分别在太阳、地球、月球位置添加中文字体“太阳〞、“地球〞、“月球〞 6、在修改的代码上加上自己的一些点缀修饰性图形 四、 参考函数 1、 void glPushMatrixvoid 功能把当前操作矩阵压入矩阵堆栈,记住当前所在的位置。 复制活动栈顶的当前矩阵并将其存入其次个栈位置 2、void glPopMatrixvoid 功能当前操作矩阵出栈,它下面的矩阵作为当前矩阵,返回到以前所在的位置。 破坏栈顶矩阵,栈的其次个矩阵成为当前矩阵。假如要弹出栈顶,栈内至少要有2个矩阵,否那么就会出错。 3、中文字体绘制 在程序头部声明所用到的字体函数 void selectFontint size, int charset, const char* face; //选择字体 void drawCNStringconst char* str; //生成中文字体函数 //在绘制局部调用字体函数,写中文字 selectFont48, GB2312_CHARSET, 楷体_GB2312; //设置字体楷体24号字 glRasterPos2f250, 550; //定位首字位置 drawCNStringHello,大家好; //写字“Hello,大家好〞 /************************************************************************/ /* 选择字体函数 */ /************************************************************************/ void selectFontint size, int charset, const char* face { HFONT hFont CreateFontAsize, 0, 0, 0, FW_MEDIUM, 0, 0, 0, charset, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, face; HFONT hOldFont HFONTSelectObjectwglGetCurrentDC, hFont; DeleteObjecthOldFont; } /************************************************************************/ /* 生成中文字体函数 */ /************************************************************************/ void drawCNStringconst char* str { int len, i; wchar_t* wstring; HDC hDC wglGetCurrentDC; GLuint list glGenLists1; // 计算字符的个数 // 假如是双字节字符的〔比方中文字符〕,两个字节才算一个字符 // 否那么一个字节算一个字符 len 0; fori0; str[i]\0; i { if IsDBCSLeadBytestr[i] i; len; } // 将混合字符转化为宽字符 wstring wchar_t*malloclen1 * sizeofwchar_t; MultiByteToWideCharCP_ACP, MB_PRECOMPOSED, str, -1, wstring, len; wstring[len] L\0; // 逐个输出字符 fori0; ilen; i { wglUseFontBitmapsWhDC, wstring[i], 1, list; glCallListlist; } // 回收全部临时资源 freewstring; glDeleteListslist, 1; } 4、圆的绘制 1〕圆盘绘制方法 GLUquadricObj *disk; //定义二次曲面对象 diskgluNewQuadric; //生成二次去面对像 gluDiskdisk,0.8,1,50,50; //内径0.8,外径1,盘心在原点 2球的绘制方法 glutSolidSphere1,80,80; //半径为1的球,球心在原点 5、反走样代码 glBlendFuncGL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA; glEnableGL_BLEND; glEnableGL_POINT_SMOOTH; glHintGL_POINT_SMOOTH_HINT, GL_NICEST; glEnableGL_LINE_SMOOTH; glHintGL_LINE_SMOOTH_HINT