基于BG+Array的相机操作实现方法
2015-01-18涂瑶瑶徐承志
涂瑶瑶,徐承志,梅 超
(湖北工业大学计算机学院,湖北 武汉430068)
Virtools是一套具备丰富的互动行为模块的实时3D环境虚拟实境编辑软件,其提供了500多个Building Blocks(BB)行为交互模块可供使用,特点是方便操作,应用领域广泛[1]。可以让没有任何编程基础的开发者在一个可视化图形开发界面中拖放BB,使得各种格式的资源整合在一起,如3D模型、2D图形、音频或者视频等[2],从而制作出各种用途的3D互动多媒体产品,例如虚拟装配、仿真训练、网上游戏等诸多3D软件。正是由于该软件的简易性,对开发者的编程素养要求不高,可能导致开发者陷入代码赘余的问题中。这些赘余的代码,既增加了开发人员的负担,又不便于系统后期维护。而对这些赘余代码进行封装和管理能大大提高团队开发效率。
本文作者参与国家级大学生创新创业项目——“基于虚拟校园的软件生态系统研究”,项目开发过程中出现大量重复操作,例如上百次对相机进行操作[3],其中包括相机的旋转、平移、拉伸等。根据项目开发经验,笔者利用BG+Array解决了项目中virtools脚本重复代码过多,不易维护的问题。
1 Virtools中的逻辑结构
1.1 Virtools BB
Behavior Building Blocks(BB)是用来执行特定动作的可视化功能模块[4],BB的输入分为流程输入bIn(Behavior Input)和参数输入pIn(Parameter Input),输出分为流程输出bOut(Behavior Output)和参数输出pOut(Parameter Output)(图1)。
图1 BB的输入输出
根据运行方式的不同,BB有三种类型:
1)On/Off 一旦On被触发,BB就持续执行,直到Off被触发才会停止运作(图2a)。
图2 BB的运行方式
2)In/Out 一旦In被触发就执行BB的功能,完成后会触发Out并停止运作(图2b)。
3)Loop In/Loop Out 一旦In被触发BB就开始运作,随即在Loop Out和Loop In间执行外部回圈,直到完成BB设定的某个条件才会触发Out并停止运作。而对BB的停止条件设定可在BB参数的设置中完成,如图2中的(c)。
Virtools可以利用拖放BB的方式,使用Link-Delay[5]线将BB连接起来,赋予在适当的Object(对象)或者Character(虚拟角色)上,以类似流程图的方式,决定BB行为交互模块的前后处理顺序,从而实现可视化的交互脚本设计。脚本图类似于传统的代码程序,特别是程序的三个基本结构可以完全用脚本图来实现。
如图3所示,程序先执行”Rotate”BB,后执行”Translate”BB。
图3 顺序结构
如图4所示,程序先执行”Test”BB,Test BB判断为真则执行Rotate BB,为假则执行Translate BB。
图4 选择结构
如图5所示,程序先执行”Counter”BB,Counter BB有三个输入参数,第一个是程序循环的次数,第二个是变量的初始值,第三个是变量的递增(减)值,若循环次数不满足设定值,则执行Rotate BB,循环次数加1,变量加上递增(减)值,否则执行Translate BB。
图5 循环结构
1.2 Virtools BG(Behavior Graph)
将多种BB组合封装起来,就可以形成一个具有某项功能的行为模组,即BG(Behavior Graph)。BG是Virtools里面的一大特色,利用BG可以将一个或多个BB(也可以是BG)进行二次封装,或多次封装。如果将BB比作传统程序里面的函数,那么BG就相当于是传统程序里面函数的嵌套调用。BG与BB对外接口形式是一样的,输入参数分为bIn,pIn,输出参数分为bOut,pOut。BB和BG可以相互嵌套使用(图6)。
图6 BG的嵌套使用
1.3 Virtools Array
Array即阵列,可用于建立数据、事件变量的集中存放管理等等,由Column(列)与Row(行)组成[6],Array里面每列就是一个字段,每行存储的数据就是一个记录,Array还可以与数据库里面的表进行数据交换,在访问一些简单的轻量数据时,使用Array十分方便,Array的结构见图7。
图7 Array的构造
2 代码封装技术的实现
鉴于BG和Array在Virtools中有上述这些性质,可以使用BG+Array这种组合在Virtools的程序开发中实现功能重复的代码整合。即使用BG将行为逻辑进行二次封装,使用Array存取动画中不同的行为参数,通过参数解析和动作驱动模块遍历Array中的行为参数,就可能产生多组操作相同但效果不同的动画。BG+Array组合的功能等效图见图8。
图8 BG+Array功能等效图
2.1 实现步骤
2.1.1 设计动作模板,并封装成BG 对一组动画进行动作分类,同类的动作就是程序重复执行的功能模块,即动作模板,这些动作模板通过接收不同的行为参数,产生不同的效果,将这些动作模板封装成BG。
2.1.2 构建BG中的接口 BG中的接口,就是上一步中驱动模板的行为参数,将这些行为参数的标记拖放到BG的边界,构成BG的输入参数接口。
2.1.3 建立参数阵列 创建一个Array,并在Array中创建与BG输入参数类型一致的字段,再根据具体的要求,在参数阵列中保存相应的参数值。
2.1.4 遍历Array 建立循环结构,遍历Array里面存储的记录,并将记录中的参数解析出来依次传递给动作驱动模板。
至此,通过BG+Array的组合实现相同代码调用不同参数来完成一连串的不同动作的功能就实现了。
下面通过一个例子来说明如何在Virtools里面具体运用BG+Array的组合。在“虚拟校园”项目里面经常要针对某栋建筑进行频繁的镜头变换操作,这些镜头变换大致可以归纳为移动相机、旋转相机、拉伸相机操作,以上三种操作即为相机操作的三大类,可以按照上面提到的步骤构造出一个BG+Array的组合。
2.2 镜头变换的设计及功能实现
2.2.1 构建动作模板,并封装成BG 摄像机操作的三个主要动作模板分别为:旋转相机、移动相机以及拉伸相机。
构造的BG如图9至图11所示,其中”Bezier Progression”BB的作用是在一定的时间内让一个变量按照指定的贝塞尔函数[7]进行变化,图9中Multiplication BB接收 Bezier Progression BB传进的值,并乘以指定的一个角度,将得到的值赋给Rotate Around BB,Rotate Around BB按照这个值进行相机旋转,所以这一组BB的作用就是在一定的时间内(由Bezier Progression BB决定)将相机旋转一定的角度(由Multiplication BB决定)。
图9 旋转相机
图10 中 Multiplication BB 接 收 Bezier Pro-gression BB传进的值,并乘以一个指定的向量,将得到的值赋给 Translate BB,Translate BB按照这个值来操作相机进行移动。
图10 移动相机
图11 中 Multiplication BB 接 收 Bezier Progression BB传进的值,并乘以一个指定的向量,将得到的值赋给Set FOV BB,Set FOV BB按照这个值对相机进行拉伸动作。
图11 拉伸相机
2.2.2 构建BG接口 提取行为参数后的BG如图12所示。
图12 提取行为参数后的BG
将BG中的行为参数提取出来,并拖放到BG的边界,由于BG可以相互嵌套使用,所以内层BG也可以像BB一样,将内层BG的运行参数的标记拖放到外层BG的边界,作为外层BG的输入参数。当一个BG中包含几个小的BG时,即一个大的功能模块中包含几个小的功能模块,可以考虑使用”Binary Switch”BB(二进制开关)来控制是否启动这几个小的功能模块。
图12中第一个Binary Switch控制Camera Rotate(相机旋转),如果Binary Switch接收到的参数为True,则程序会从True出口(图12中Binary Switch连接Camera Rotate的出口)出发,并运行Camera Rotate这个BG,否则程序会从False出口(图12中Binary Switch连接第二个Binary Switch的出口)出发,并直接运行第二个Binary Switch。同理第二个Binary Switch控制Camera Move(相机移动),第三个Binary Switch控制Camera FOV(相机拉伸),这些Binary Switch只有在接收到输入参数为True时才会执行其对应的功能模块,否则程序会跳转到下一个功能模块去执行。通常使用这个BG时,可能只需要使用这个BG中的部分功能模块,如果不用开关进行控制,那么程序就会运行这个BG中的所有功能模块,势必造成许多资源浪费,所以,巧用开关也是节约系统资源的一个小技巧。
2.2.3 建立参数阵列 创建好后的Array属性如表1所示。
表1 Array
2.2.4 遍历Array 程序整体流程如图13所示。
图13 程序整体流程图
图13 中的Camera Operation是图12中将行为参数提取出来后的BG,使用”Iterator”BB来遍历Array,并将取出的记录赋给BG,BG通过接收Array里面存储的记录,运行BG里面的功能模块,程序就会按照BG里面的功能模块来执行并显示相应的动作效果了。
至此,使用BG+Array的组合,便将摄像机的操作整合起来了,以后凡涉及到对摄像机的操作,只需要修改Array里面的行为参数便可以直接使用此BG+Array的组合了。
BG+Array组合不仅适用于对相机的操作,在机械拆装上也同样适用。机械拆装的操作和相机类似,有移动零件、旋转零件以及缩放零件等,通过BG+Array组合,将这些操作进行模块化的整合,便于系统的开发和后期维护。
3 使用BG+Array的优点
总体来说,BG+Array的优点有如下三点:
1)代码量少 这里说的代码量少并不意味着减少了代码的数量,而是说将代码整合起来,便于阅读与理解,将原来复杂庞大的代码用BG整合起来,使得每个功能都很清楚,也方便维护。
2)便于程序调试与维护 每个BG都实现了特定的功能,而将它需要的参数提取出来,并存在Array里面,这样只需要对Array里面的数据进行修改,就可以通过BG+Array这种组合实现行为逻辑与动作参数的解耦,便于日后的调试与维护。
3)代码共享 代码封装不仅仅是让自己编程简单,最主要的是要实现代码的共享,这种将业务逻辑高度抽象的方法是代码封装的先决条件。同时,使用BG这种模式,将一些常用的BB组合起来,封装为常用的功能模块,更利于给其他人共享使用。
4 结论
介绍了BG+Array这种组合在Virtools里面的运用,合理利用这种组合,可以减少程序中很多冗余的代码,大大提高系统开发的效率,同时也可以提高代码的复用率,为开发高质量的系统带来很多便利。本文只是介绍了Virtools中代码封装的一部分技巧,同时BG+Array这种组合还有很大的改进空间,例如可以将这种组合与数据库操作结合起来,通过数据库驱动BG+Array组合,从数据库中读取数据并操作对象进行运动。
[1] 陈玉川,王丽娟,胡青泥,等.基于Virtools机械加工实验系统的研究[C].第三届东北、华北8省区市工程图学学术研讨会论文集.2010:156-159.
[2] 刘明昆.三维游戏设计[M].成都:四川出版集团,四川电子音像出版中心,2005.
[3] 杨 琳,朱元昌,邸彦强,等.基于Virtools的光电经纬仪成像系统仿真[J].弹箭与制导学报,2012(05):193-195,198.
[4] 梁冠辉,朱元昌,邸彦强,等.基于 HLA/Virtools的高炮火控系统仿真平台设计[J].系统仿真学报,2009,21(21):6 954-6 958,6 963.
[5] 王 欣,贺建飚.精确同步Markov测试帧的研究与设计[J].信息化纵横,2009(06):33-35.
[6] 刘明昆.三维游戏设计师宝典——Virtools游戏开发工具篇[M].四川:四川电子音像出版中心,2005.
[7] 伍 刚.贝塞尔函数的计算机仿真研究[J].攀枝花学院学报,2013,30(06):105-107.