大连大有吴涛易语言软件开发有限公司 版权所有
正投影 投影线互相平行,不论远近,大小不变 透视投影 投影线交于一点,近大远小,最远处集中到一点 对称透视投影 更加符合人眼的观察方式
“选择矩阵模式 (#观察矩阵)”:在这个矩阵中创建模型。 只要在每次可视范围发生改变的时候,重新定义投影方式就可以了。画模型的时候就不需要重新定义。
2.9.3 坐标系变换
表 8中列出了三种对坐标的命令:
表 8
命令 含义
坐标平移 保持三个坐标轴的方向不变,平行移动坐标系的愿点 坐标旋转 保持坐标系的原点不变,绕着一个指定轴转动
坐标缩放 保持坐标系的原点不变,在三个坐标轴的方向上进行缩放图 23中箭头的所指的方向是坐标旋转和坐标平移的正方向。
图 23
有关坐标缩放命令的使用方法可以参考例程“金戒指.e” 运行后可以看到图 24中效果:
图 24
也可以利用这个例程制作一个橄榄球的模型。
31
大连大有吴涛易语言软件开发有限公司 版权所有
2.9.4 矩阵运算
虽然使用坐标变换命令对矩阵进行运算比较直观,但是功能有限。直接使用矩阵运算的命令可以更加快速的对矩阵进行运算。
表 9中列出了四种对矩阵运算的命令:
表 9
命令 含义
矩阵入栈 把当前矩阵压入栈顶 矩阵出栈 把当前矩阵退出栈顶
载入矩阵 把当前坐标模式变换成指定的矩阵。
乘入矩阵 把当前坐标模式再乘以指定的矩阵使它变换成目标的矩阵。矩阵是一个4×4的数组。
矩阵的定义M[4][4]使用的是竖向的顺序,而不是大家常用的横向定义法。 M[1][1] M[2][1] M[3][1] M[4][1] M[1][2] M[2][2] M[3][2] M[4][2] M[1][3] M[2][3] M[3][3] M[4][3] M[1][4] M[2][4] M[3][4] M[4][4]
通过这些矩阵命令,可以省去计算复杂坐标变换的过程。 如果乘入矩阵 0.5 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 1.0 相当于三个轴向都缩小一半
有关坐标变换命令的使用方法可以参考例程“坐标变换.e” 可以在三种投影方式中选择一种,然后进行移动、旋转和缩放。 运行后可以看到图 25中效果:
32
大连大有吴涛易语言软件开发有限公司 版权所有
图 25
练习:
下面就来通过使用矩阵运算来实现实时阴影的效果。 1. 启动易语言OpenGL向导;
2. 在第二页“使用的组件”中选择“窗口”;
3. 在第五页“投影模式”中选择“对称透视投影”; 4. 点击完成按钮创建程序;
5. 在“框架程序集”中加入程序集变量: .程序集变量 影子, 双精度小数型, , \.程序集变量 立方体边长的一半, 小数型 .程序集变量 旋转角度
.程序集变量 光源位置, 小数型, , \6. 加入子程序“求影子”子程序: .子程序 求影子
.参数 矩阵, 双精度小数型, 参考 数组 .参数 地面, 双精度小数型, 数组 .参数 光源位置, 小数型, 数组 .局部变量 临时, 小数型 .局部变量 循环变量1
33
大连大有吴涛易语言软件开发有限公司 版权所有
.局部变量 循环变量2
临时 = 0
.计次循环首 (4, 循环变量1)
临时 = 临时 + 地面 [循环变量1] × 光源位置 [循环变量1] .计次循环尾 ()
.计次循环首 (4, 循环变量1) .计次循环首 (4, 循环变量2)
.如果 (循环变量1 = 循环变量2)
矩阵 [循环变量1] [循环变量2] = 临时 - 地面 [循环变量1] × 光源位置 [循环变量2]
.否则
矩阵 [循环变量1] [循环变量2] = -地面 [循环变量1] × 光源位置 [循环变量2]
.如果结束
.计次循环尾 () .计次循环尾 ()
7. 在“框架初始化”子程序的末尾加上 光源位置 = { -1, 2, 2, 0 } 启用功能 (#光照) 启用功能 (#材质颜色) 启用功能 (#零号光源)
设置材质 (#正面, #环境光, { 0.8, 0.2, 0.5, 1 }) 求影子 (影子, { 0, 1, 0, 0 }, 光源位置) 立方体边长的一半 = 0.5
8. 在“绘图”子程序中标有“' 在这里加入你的代码”的下面加入以下代码: 旋转角度 = 旋转角度 + 1 .如果真 (旋转角度 ≥ 360) 旋转角度 = 0 .如果真结束
坐标平移 (0, 1, -8) 坐标旋转 (45, 1, 0, 0)
坐标旋转 (旋转角度, 0, -1, 0)
设置光源参数 (#零号光源, #光源位置, 光源位置) 设置颜色 (0.9, 0.6, 0.6, 1) 设置法向量 (0, 0, 1)
开始画 (#四边形) ' 地板
设置点 (-3, -立方体边长的一半 × 2, -3) 设置点 (3, -立方体边长的一半 × 2, -3) 设置点 (3, -立方体边长的一半 × 2, 3) 设置点 (-3, -立方体边长的一半 × 2, 3) 停止画 () 矩阵入栈 ()
34