大连大有吴涛易语言软件开发有限公司 版权所有
练习:
下面就来使用裁剪平面来剪切一个八面体。 1. 启动易语言OpenGL向导;
2. 在第二页“使用的组件”中选择“窗口”;
3. 在第五页“投影模式”中选择“对称透视投影”; 4. 点击完成按钮创建程序;
5. 在“框架程序集”中加入程序集变量: .程序集变量 角
6. 在“框架初始化”子程序的末尾加上 启用功能 (#光照) 启用功能 (#零号光源)
设置光照模式 (#双面光模式, 1) 启用功能 (#裁剪测试) 启用功能 (#零号裁剪面)
7. 在“绘图”子程序中标有“' 在这里加入你的代码”的下面加入以下代码: 角 = 角 + 5
.如果真 (角 ≥ 360) 角 = 0 .如果真结束
坐标平移 (0, 0, -6) 坐标旋转 (角, 1, 1, 0)
设置裁剪平面 (#零号裁剪面, { 0, -1, 0, 0.5 })
设置零号裁剪面垂直于Y轴向下,与Y轴的焦距为+0.5 创建实心八面体 () 参考例程“第十二课练习.e” 运行后可以看到图 32中效果:
图 32
43
大连大有吴涛易语言软件开发有限公司 版权所有
第十三节、文本操作
在OpenGL里没有过多地涉及到文本处理的命令,而且只使用True Type字体。尤其是对中文的处理特别地麻烦,在这里提供几种显示文本的方法供大家使用。
2.13.1 中文和英文的区别
因为英文单词由26个字母组成,所以只需要一个字节就可以包含所有英文字符。然而中文的组成结构相当复杂。而且字数繁多。不是一个字节就能完全包含的,所以用了两个字节的大小来保存一个中文字符的信息。显示文之前本,必须先使用“是否为双字节字”命令判断是中文还是英文字符。
要特别指出的是因为双字节的使用,保存立体文本轮廓显示列表也使用了连续的两个列表号。但是因为后一个列表是没有被标记的。使用“生成列表号”命令还能够得到这个列表号。所以为了避免这一点,可以使用“设置偏移列表数”命令将显示文本的列表号都向后移动到足够大的数值。只要使用“生成列表号”命令的次数不超过这个数值即可。
例程“立体文字.e”的“绘图”子程序中的代码: 坐标平移 (0, 0, -8)
坐标旋转 (角度, 0, 1, 0) 坐标平移 (-3, 0, 0)
设置偏移列表数 (混合字体基础列表号) 调用多显示列表 (混合字体列表数组) 坐标平移 (-6, -1, 0)
设置偏移列表数 (单字节字体基础列表号) 调用多显示列表 (单字节字体列表数组)
2.13.2 平面文本的显示
一种是利用前面的位图操作,将文本保存在字节集里,需要的时候可以画出大小固定的文本。但是使用了了位图,速度不够快。
另一种是把文本保存成BMP文件,在使用的时候作为纹理贴到模型表面,使用这样的文本还可以进行扭曲和旋转,效果也不差。
2.13.3 显示立体文本的一般过程
创建字体→使用字体→是否为双字节字符→创建文字轮廓→删除字体→设置偏移列表数→调用多显示列表
“创建字体”需要用到DLL如下定义:
44
大连大有吴涛易语言软件开发有限公司 版权所有
“使用字体”需要用到DLL如下定义:
“删除字体”需要用到DLL如下定义:
因为英文和一般字符使用的是单字节代表一个字符可以很容易判断,而中文以及其他语
45
大连大有吴涛易语言软件开发有限公司 版权所有
言使用的是双字节代表一个字符。所以创建三维字体之前必须要先判断是否为双字节字符。
例程“立体文字.e”的“创建混合字体列表”子程序中的代码: .如果 (是否为双字节字符 (文本, 循环变量)) 代码 = 取代码 (文本, 循环变量 + 1) 代码 = (代码 + 1) × 256 ' 中文使用的是双字节 循环变量 = 循环变量 + 1 代码 = 代码 + 取代码 (文本, 循环变量 + 1) .否则 代码 = 取代码 (文本, 循环变量 + 1) ' 英文使用的是单字节 .如果结束 创建文字轮廓 (设备句柄, 代码, 1, 循环变量 + 混合字体基础列表号, 0, 0.2, 真) 参考例程“立体文字.e” 运行后可以看到图 33中效果:
图 33
文字坐标的灵活应用
第十四节、缓存
2.14.1 缓存模式
从缓存的模式上可以将缓存分为:单缓存、双缓存。
单缓存模式下只有一个缓存,显示和运算都在它上面进行。
双缓存模式下还有一个后台处理的缓存,计算完毕后,使用“交换缓存”命令,将后台画面显示出来,而前台画面转到后台继续处理。连续的交换缓存可以产生没有闪烁的动画效果。
46