Virtools中的透视变换和逆透视变换方法
2017-01-13王利,向阳
王 利,向 阳
(武汉理工大学 能源与动力工程学院,湖北 武汉 430063)
Virtools中的透视变换和逆透视变换方法
王 利,向 阳
(武汉理工大学 能源与动力工程学院,湖北 武汉 430063)
Virtools开发的虚拟现实项目中,涉及采用鼠标控制虚拟空间物体移动的操作,而Virtools自带的BB无法满足需求,需要采用VSL语言编写控制程序代码,而程序的核心就涉及透视变换和逆透视变换的原理。文章简述了透视变换和逆透视变换的基本原理,并演示了Virtools中程序实现的方法。
Virtools;透视变换;逆透视变换
1 引 言
Virtools是法国达索公司推出的一款三维虚拟现实开发软件,已经被广泛地应用到了游戏开发、工业仿真和虚拟教学培训等领域。目前市场上进行虚拟现实开发的软件平台有许多种,如Unity3D等,这些软件平台需要开发者有很好的软件编程语言基础,如C#、Java等,而Virtools与其他开发软件平台最大的不同之处在于,Virtools不需要使用者编写代码,而是按照一定的逻辑关系,将一些具有特性功能的Building Blocks(简称BB),采用拖放的方式,放置到特定对象(Object)或者角色(Character)的脚本(Script)编辑区域,并用连线将这些BB按照一定的动作逻辑关系连接起来,从而形成一个完整的虚拟交互功能。当开发的项目需要更加复杂的功能,而BB实现过于繁杂时,Virtools提供了VSL脚本语言和SDK开发包。通过结合BB,VSL脚本语言和SDK开发包,可以更方便和出色地完成项目的工作。基于以上的优点,Virtools在理论教学和实践教学中得到了广泛的应用。
2 Virtools在教学中的应用现状
Virtools虚拟现实平台因其开发的便利性而在高校的虚拟实践教学中得到了广泛的应用。钱琨等[1]基于Virtools构建了虚拟的数字设备与装备,用于完成技能鉴定、考核和联系的需要;岳青松等[2]基于Virtools开发了水电机组的虚拟拆装操作系统用于培训检修人员的专业技能;王盼盼[3]基于Virtools开发了虚拟测绘系统用于教学实践中。戚晓利等[4]基于Virtools开发了辊式破碎机虚拟实验教学平台;陈浩[5]等基于Virtools开发了机械装备的虚拟拆卸平台用于生产培训。在类似这些项目中,常常需要通过电脑的鼠标来操控虚拟现实作品中的物体,鼠标光标在二维屏幕平面上移动,而物体处在三维坐标系表示的虚拟空间中,要实现二维的鼠标移动来拖拽三维空间物体运动。而在Virtools平台中,没有现成BB可用,要实现鼠标点选操作虚拟三维空间物体移动的功能,要采用Virtools的编程语言VSL写程序代码,在程序的开发过程中需要运用透视变换和逆透视变换技术。
3 透视变换和逆透视变换
透视变换的原理就是通过一系列的转换,将虚拟三维空间中的物体,形成一个二维的画面显示在屏幕上。通过人从窗口看屋外风景的例子来描述其透视变换过程为:假设处在房间内的某人通过窗户上的玻璃来观察外面的风景如图1所示。如果将玻璃作为计算机屏幕,来临摹窗外所看到的景物,可以得到如图2所示的窗户上的临摹图和窗外实际风景图的对比,通过图2可知,窗户外边是现实的三维世界,而窗户玻璃上是平面图形。三维世界的物体就这样被映射到了二维的画面上。通过程序来实现这样的功能,称为透视变换。
图1 透视变换示例
图2 窗户临摹窗外风景的对比
在虚拟现实中实现透视变换,窗外的风景相当于虚拟现实场景中的3D模型,观察人的位置相当于虚拟三维世界中摄像机的位置,而窗户相当于屏幕。通过三点共线原理(如图3所示),使得虚拟三维世界中的物体与摄像机之间的连线与屏幕之间的交点,就可以得出三维空间的物体在二维屏幕上的位置。
图3 三维空间的二维变换
逆透视变换是透视变换的逆过程,就是将屏幕上二维鼠标的运动转换到虚拟三维世界中物体的运动。在程序中实现的基本过程是,先得到鼠标单击点出的屏幕坐标,通过摄像机和鼠标点击处形成一条射入虚拟场景中的射线,如果该射线与虚拟场景中的3D物体相交,则获取该物体的信息,包括物体的名称、交点的位置、方向及交点与摄像机之间的距离。这样就实现了通过屏幕上二维鼠标确定虚拟现实场景中三维物体的方法。
4 Virtools中的实现
在Virtools中有两种透视变换方法,分别是“透视投影”和“平行投影”。透视投影中离摄像机越远的物体投影到屏幕上后越小,距离摄像机越近的物体投影到屏幕后就越大,这很符合人类眼睛看世界的规律;而平行投影是把三维场景投影成一张平面地图,没有远近大小之分。绝大多数虚拟现实项目采用的是透视投影。
在Virtools中,实现透视变换和逆透视变换,并能够通过鼠标控制零件移动所涉及的程序指令为:GetInputManagerGuid(),它的作用是得到输入设备的全局唯一标识符,将该标示符作为输入参数传给函数bc.GetMangerByGuid()就可以得到输入设备iM标示的输入设备。函数iM.GetMousePosition(pos2D,FALSE)中的第一个参数可以得到鼠标的位置,但是这个位置的值由第二个参数设置,如果为true,则鼠标的(0,0)是显示器的左上角的(0,0)
位置;如果为false则鼠标的(0,0)位置是当前程序窗口的(0,0)位置。ScreenToViewpoint这个函数的功能是根据2D的屏幕坐标求一个3D的坐标,这种用法一般用在一些3D物体固定在摄影机前的位置,跟随摄影机一起移动,该算法是以摄影机为起点,以鼠标制定的场景中某一点求一条射线。
rcx.ScreenToViewpoint(pos2D,pos3D,FALSE)就是把屏幕的2D位置转换成3D位置的函数,第一参数使输入一个要转换的2D位置,比如鼠标的位置;第二个参数使一个Vector变量,当函数调用成功后,转换的结果存储在这个变量中;第三个变量为bool型,当其为true时,表示第一个参数的鼠标位置是以桌面左上角的(0,0)为原点的坐标位置;当其为false时,表示第一个参数的鼠标位置是以应用程序窗口左上角的(0,0)为原点的鼠标位置。
根据屏幕的2D位置得到3D位置,反过来也可以通过场景中的3D位置得到屏幕坐标,方法就是调用函数Transform即可。
[1]钱琨,谭耀洲,陈文红.基于Virtools软件构建的职业技能鉴定模拟考试与训练系统[J].科技创业月刊,2016(3).
[2]岳青松,叶建波,谢红彪,等.水电机组虚拟检修培训系统软件平台开发[J].水电与新能源,2016(1):7-11.
[3]王盼盼.基于Virtools的虚拟测绘系统的设计[J].实验技术与管理,2015,32(3):148-151.
[4]戚晓利,许健,潘紫微.基于Virtools的虚拟实验教学研究[J].中国信息技术教育,2015(18):72-75.
[5]陈浩,张桂香,张庆洪.基于Virtools的机械装备虚拟拆卸系统研究[J].现代制造工程,2015(1):30-34.
10.13939/j.cnki.zgsc.2016.49.089
2014年武汉理工大学自主创新基金,船舶动力设备的虚拟拆装(项目编号:2014-IV-156)。
王利(1977—),男,汉族,湖北武汉人,博士,讲师。研究方向:振动与噪声控制技术。