OpenGL第12-14讲小结
首先要为自己为什么没有写第10讲的控制3D场景和第11讲的红旗飘飘呢?因为没看啊~哈哈哈,而且我尝试着运行红旗飘飘的时候电脑蓝屏了(可能不是它的锅),暂时跳过了。
恩,12到14主要了解了这么些东西,一个使用List来批量创建重复的对象,还有就是显示3D文字。
创建一个List:(方便自己记直接贴代码了,其实就是懒)
GLvoid BuildLists() { box = glGenLists(2);// 创建两个显示列表的名称 glNewList(box,GL_COMPILE); // 创建第一个显示列表
glBegin(GL_QUADS); // 开始绘制四边形 /*画多边形
*
*/
glEnd(); glEndList();
top=box+1; //开始绘制第二个列表 glNewList(top,GL_COMPILE); // 盒子顶部的显示列表 glBegin(GL_QUADS); // 开始绘制四边形 // 上面 glEnd(); // 结束绘制四边形 glEndList(); // 第二个显示列表创建完毕 }
这样得到的List,给我的感觉就是将glNewList(,)与glEndList()之间的代码存起来,后面的用glCallList()的效果就是把在这儿存起来的代码放到那去执行一遍,调一次就执行一次。
而关于3D文字的效果:
GLvoid BuildFont(GLvoid) { base =glGenLists(256); HFONT font; // 字体句柄 HFONT oldfont; // 旧的字体句柄 font = CreateFont(-24, // 字体高度 0, // 字体宽度 0, // 字体的旋转角度 Angle Of Escapement 0, // 字体底线的旋转角度Orientation Angle FW_BOLD, // 字体的重量 FALSE, // 是否使用斜体 FALSE, // 是否使用下划线 FALSE, // 是否使用删除线 ANSI_CHARSET, // 设置字符集 OUT_TT_PRECIS, // 输出精度 CLIP_DEFAULT_PRECIS, // 裁剪精度 ANTIALIASED_QUALITY, // 输出质量 FF_DONTCARE|DEFAULT_PITCH, // Family And Pitch "Courier New"); // 字体名称 oldfont = (HFONT)SelectObject(hDC, font); // 选择我们需要的字体 //wglUseFontBitmaps(hDC, 32, 96, base); // 创建96个显示列表,绘制从ASCII码为32-128的字符 wglUseFontOutlines( hDC, // 设置当前窗口设备描述表的句柄 0, // 用于创建显示列表字体的第一个字符的ASCII值 255, // 字符数 base, // 第一个显示列表的名称 0.0f, // 字体的光滑度,越小越光滑,0.0为最光滑的状态 0.2f, // 在z方向突出的距离 WGL_FONT_POLYGONS, // 使用多边形来生成字符,每个顶点具有独立的法线 gmf); //一个接收字形度量数据的数组的地址,每个数组元素用它对应的显示列表字符的数据填充 SelectObject(hDC, oldfont); // 选择原来的字体 DeleteObject(font); // 删除字体 }
从2D向3D的进化就是把注释那句换成后面的wglUseFontOutlines(),并且为了能看出来是3D,需要旋转一些角度。
至于其他的话好像没有什么特别的,今天没有什么状态,没看多少,就到这里吧。
对了,还有一点,就是例子里为什么用到了sin,cos之类的,后来想了下,可能是因为随着sin(x),cos(x)的X的不断增长,其值只会在-1~1之间波动,然后图形就不会出屏幕,应该就是这个原因吧。