Vega 小镇(Town)视景仿真实践
来源:第三维度
作者:王乘,李利军,周均清,陈大炜
节选至《Vega 实时三维视景仿真技术》
1 虚拟场景交互预览
Vega 软件包提供了内容丰富的实例可供用户参考和使用,它们都存放在 Vega 安装路径的 Sample 目录下。如果想完整地浏览 Vega 的强大功能,可以从该目录下的 intro.htm 文件开始。
先让我们一起感受一下已定义好的 ADF 文件的实例。
(1) 启动 LynX。
用户可以从开始菜单中启动,也可以通过双击任意一个后缀名为.adf 的文件启动 LynX图形界面。
(2) 打开已有 ADF 文件。
① 从“File”菜单中选择“Open”项或者单击工具栏上的 Open 图标,激活文件选择对话框。
② 在 X:\Vegapath\Sample\Vega\Adf\中查找 town.adf 文件。
③ 单击打开按钮,这时会出现一个警告信息框,提示该文件是不可写的,用户将无法保存所做的修改,这是受安装时文件属性的影响,直接单击确定按钮即可。
(3) 预览应用程序。
从“Preview”菜单中选择“Active Preview”(动态预览)项或者单击工具条上的“Active Preview”按钮,激活交互预览应用程序。
当用户使用动态预览功能时,实际上是启动了一个基本 Vega 应用程序——vega.exe(在X:\Vegapath\bin\目录下)。这个应用程序惟一必需的参数是某个 ADF,动态预览时使用的参数就是用户正在编辑的这个文件。这个基本的应用程序根据当前 ADF 中设置的参数信息渲染出相应的虚拟场景,并允许视点按照该应用程序定义文件中设定的运动模式在场景中运动,它还可以实时针对在编辑的 ADF 文件中某些参数的变化做出响应。基本 Vega 应用程序在运行时,只有那些可以在 LynX 中做实时更改的参数所在的面板部分才是可用的,其他部分的面板会成为灰显状态,表示不可更改。
经过一段加载时间后,桌面左下方会出现一个静止的虚拟场景窗口,用鼠标左键单击窗口任意位置,场景开始活动。在窗口内随意移动鼠标,视点会随着鼠标的方向而改变;单击鼠标左键,场景的运动会加速;单击鼠标右键,运动会减速(减速到一定的程度就会产生倒退的效果);单击鼠标中键,场景就瞬间恢复静止;同时按下鼠标的三个键,场景会恢复到初始状态。在后面的章节中我们会讲到在不同的运动模式下,鼠标的各个键的功能设定是不尽相同的,这个实例中使用的是 Drive 运动模式。图1 所示为交互预览时的屏幕截图。
图1 运行 town.adf 效果图
2 设置和调整模型对象参数
我们知道,一个 Vega 应用程序的运行需要大量的参数来支持,包括系统平台(System)资源配置、窗口(Window)的位置和大小、通道(Channel)在窗口内的布局和图像状态(Graphics State)、观察者(Observer)的对象和定位方式、视点的运动模式(Motion Model)、场景(Scene)内的环境(Environment)/灯光(Light)和物体(Object)、选择输入设备(Input Device)和应用程序(Application)等等。所幸的是,用户并不需要考虑每一个具体参数的细节,LynX 为我们设置好了绝大部分必要参数的缺省值,而且这些缺省值对于大多数一般的仿真应用都是合适的。
Vega 涉及非常多的三维计算机图形学概念和 Vega 本身的一些特殊概念,初次接触视景仿真的读者可能会被这些概念所迷惑,觉得有些无从下手。但只有搞清楚了这些概念背后的真正含义,我们才能有的放矢地在 LynX 中进行有效的参数调整和系统设置,其中最基本的一些概念包括:屏幕(Screen)、窗口(Window)、通道(Channel)、观察者(Observer)、场景(Scene)、模型对象(Object)、角色对象(Player)等。
屏幕指的是 Vega 应用程序运行平台与图形生成硬件设备相连的显示终端屏幕,它决定了仿真应用提供给用户的可视范围的大小,表现为图形硬件所支持的最大分辨率。注意:图形硬件所支持的分辨率跟终端显示设备所使用的分辨率是不同的两个概念,大型的图像工作站都支持多个显示设备的同时输出。
窗口在 Vega 中代表的是一条渲染管道(Pipeline),渲染管道指的是可视化仿真系统实现中的整个渲染流程,所以要执行 Vega 应用程序必须先定义一个窗口。用户可以指定窗口在屏幕上的位置,由于屏幕支持图形硬件的最大分辨率,所以窗口的大小实际上可以超出当前显示终端的分辨率设置,其效果是一部分窗口在显示器上看不见。
通道代表了用户用以观察场景的特定视角,表现为窗口中的一个矩形区域,实际上所有的实时渲染都是通过通道进行的,所以场景要显示出来至少还要定义一条通道。一个窗口中可以包含任意多条通道,它们在窗口中的位置甚至还可以重叠。图2 所示为上述三者之间的关系图。
图2 屏幕、窗口与通道
观察者是 Vega 中的一个非常重要的概念,也是核心概念之一。用户最终是通过观察者的视角,从本质上讲是通过通道来观察场景的,而场景就是所有载入的模型对象的集合。需要特别指出的是,使用者是一类特殊的模型对象,它的作用是表达虚拟仿真场景中的动态元素。
我们可以把使用 LynX 定义 Vega 应用程序的过程,类比成摄制一部好莱坞大片:观察者好比是片场中的摄像机,通道好比是摄像机上的镜头,场景就是我们的片场,模型对象就是片场中的道具和布景,使用者就是片场中听指挥的演员,窗口就是导演专用的监视器,LynX 就是功能强大的导演控制台,而使用者就是总导演!
这里的摄像机可以安装多个镜头,每个镜头都可以从不同的角度来拍摄。这里的镜甚至可以直接进行特技摄影(比如进行立体摄影)。使用者通过定义多个观察者和多个场景,可以实现在片场中同时动用多台摄影机从不同的角度拍摄同一组画面,甚至可以在不同的片场中同时进行拍摄。但无论是开辟了多少个片场、动用了多少部摄像机,或者使用了多少个镜头,最后所有的拍摄画面都会出现在导演的监视器中,最终的拍摄效果全部由总导演控制。
下面我们就从头开始,使用 LynX 图形界面一步一步地设置和调整这些参数,直到实现基本 Vega 应用程序解释 town.adf 定义文件的仿真效果为止。
(1) 单击“File”菜单下的“New”菜单项或者单击工具条上的“New”按钮,新建一个应用程序定义文件。
默认状态下新建应用程序定义文件时,LynX 会激活所有已安装的有效模块,这对特定的仿真应用来说并不一定是理想的状态。这是因为,首先,应用程序会初始化所有被激活的模块(包括并没有用到的可选模块),从而导致不必要的系统开销;其次,如果其中的某个可选模块的配置出现了问题,会导致在运行期间产生不可预料的效果。此外,加载过多的可选模块会使图标栏拉得过长,不便于模块的选取,降低了工作效率,我们可以用下面的方法卸载不必要的模块。
单击“File”菜单下的“Active Modules…”菜单项,弹出激活模块对话框,如图3所示。
图3 激活模块对话框
在模块列表中把不需要的模块名前的勾选标示去掉即可,这里我们只需要保留 Vega 模块和 Base 模块。注意:只有激活模块的参数才会被保存到应用程序定义文件中,当一个模块从激活状态变为非激活状态,其相应的菜单和面板就会从 LynX 窗口中消失。
提示:由于笔者安装了大部分的可选模块,所以读者的“Active Modules”对话框模块列表中显示的内容可能会不同。
读者可以先浏览一下各个面板,熟悉一下缺省值的设定情况。
(2) 添加模型对象。
① 在图标栏中单击“Objects”面板图标按钮,面板区中显示出模型对象设置面板。
② 单击“Objects”菜单下的“New…”菜单项或者单击工具条上的“New Instance”按钮,弹出“New Object Name”对话框要求输入新添加的物体对象的名称。这里我们输入“town”,然后单击“OK”按钮确定。
③ 单击“?”按钮弹出文件浏览器,在 X:\Vegapath\Sample\Data\Vega\下查找 town.flt,然后单击打开按钮完成操作。其他的选项保持默认的不变。设置完成后如图4 所示。
图4 模型对象 LynX 面板
(3) 把模型对象加入场景。
① 在图标栏中单击“Scenes”面板图标按钮,面板区中显示出“Scenes”的相关面板。这里已经有了一个名为“Default”的默认场景,但是面板中“Objects”列表为空,表示场景里还没有加入任何的物体对象。
② 单击添加按钮弹出“Select a Class Instance”对话框,对话框中列出了所有的可以添加的模型对象。因为我们只添加了一个模型对象,所以对话框中只有“town”一项。
③ 双击“town”项,或者单击“town”项后再单击“OK”按钮确认,完成把物体对象加入场景的操作。
构成场景的模型对象加入场景后,可以使用 LynX 内置的场景观察器(Scene Viewer)工具方便地观察当前场景。单击菜单条“Tools”下的“Scene Viewer”项,可以启动场景观察器。初始状态下,场景观察器是按照透视关系从场景模型数据库的原点处朝着世界坐标系的 Y 轴正方向观察场景的,如果我们不指定观察者观察场景的初始视点位置的话,默认状态下的仿真执行效果也是一样的,如图5 所示。
图5 场景观察器默认状态
现在改用正交投影(Orthographic)关系来观察场景,初始状态下观察点是在 Z 轴的正方向上俯视整个场景。按下 F7 键可以减小观察点距场景的垂直高度,相当于对场景的俯视图进行放大;相应地,按下 F8 键可以缩小场景的俯视图;同时,还可以用鼠标左键在视图区中框选出感兴趣的部分进行局部放大。当鼠标在场景观察器的视图区内移动时,观察器左侧的光标位置(Cursor Location)信息栏中会实时地显示当前鼠标箭头在场景中的坐标值。用鼠标的中键或右键在视图区中单击,会在视图区中出现一个红色的圆圈标记,按住鼠标中键或右键同时在视图区中移动鼠标时,红色标记也会随着鼠标位置一起移动,观察器左侧的标记位置(Marked Position)信息栏中也会不断地更新标记位置的坐标值,如图6 所示。
图6 场景观察器标记效果
我们可以利用场景观察器为场景中的模型对象定位,确定运动模式的初始位置,等等。
比如,需要在小镇的场景中添加一个水塔,我们可以先添加代表水塔的模型对象,然后使用场景观察器,在场景俯视图中给水塔找一个合适的位置并做上标记,记下标记位置坐标再将其输入水塔模型对象的初始位置中,最后再将该模型对象加入到小镇场景中,这时水塔就会准确地出现在设定的场景位置上了。在视图区设定了标记位置后,若再转为使用透视图观察场景时,观察点初始位置就不再是场景数据库的原点位置,而是在标记的场景位置上。假设用户要求从小镇中部开始漫游,我们就可以先在俯视图中的场景中间位置做上标记,然后再使用透视图观察场景看是否满足要求,如果位置不合适就返回俯视图中重新设置标记位置。这里我们是在场景俯视图中(2500,2500)位置附近设置标记,然后转用透视图观察场景,如图7 所示。
图7 场景观察器透视图效果
可以看出,这里正是我们所期望的漫游初始位置。
(4) 调整运动模式。
① 在图标栏中单击“Motion Models”面板图标按钮,面板区中显示出“Motion Models”的相关面板。
② 在“Motion Model Type”(运动模式类型)下拉菜单中选择“drive”模式,缺省值选择的是“UFO”模式。
③ 单击工具条上的“Rename Instance”按钮,将缺省的运动模式实例名“Default”改为“drive”。
④ 在“Initial and Reset Position”(初始化/复位位姿)文本输入框中,把 X 和 Y 的值设置为“2500”,Z 值设为“2.5”,其他参数保持默认值不变。
设置完成后的运动模式面板如图8 所示。
图8 运动模式面板图
由于 LynX 的默认值已经设置好窗口、通道、观察者、环境、灯光等的必要参数,这里不需做任何的修改,在工具栏上单击“Active Preview”按钮就可以观看初步的效果了(见图9)。
图9 虚拟小镇漫游效果图
3 场景交互动态预览
从上面的效果图可以看出,整个场景显得昏暗、没有生气,这是由于默认的环境和灯光参数所致的。现在我们来体验一下 LynX 交互式动态预览功能——场景中的仿真效果实时地对参数的改变做出响应。
最好将 LynX 窗口和场景 Window 窗口调整到合适的位置,使得在调整参数的同时能够方便地观察效果,如图10 所示为一个较好的布局方式。
图10 调试布局方式示例
注意活用 X 键和 S 键。基本 Vega 应用程序会对键盘上的 X 键和 S 键做出反应:X 键会停止所有运动模型,这当用户同时在本机运行 LynX 和应用程序并把鼠标作为输入设备时非常有用。当停下所有运动模型后,就可以将鼠标移至 LynX 窗口去改变相关参数了。S 键用于循环显示实时统计信息。
(1) 动态调整光源设置。
① 在图标栏中单击“Lights”面板图标按钮。
② 在灯光面板区中单击“Ambient Color” (环境光颜色)区域,弹出下拉颜色选择框。
③ 在颜色选择框中选取较亮的淡蓝色或白色,请读者特别注意窗口中仿真效果的变化。
(2) 动态更改环境设置。
① 在图标栏中单击“Environments”面板图标按钮。
② 用鼠标来回拖动“Time of Day” (一日时间)滑块,观察场景中的光线变化情况。
③ 先在右侧的面板区中单击“Fog”区域下的“Enabled”复选框取消雾化效果,再单击“Sky Color”(天空颜色)区域,在弹出的下拉颜色选择框中选取任意的颜色,注意窗口中天空的颜色变化。
④ 恢复到原来的天蓝色,重新启用雾化效果。
⑤ 用鼠标调整“Visibility”选区下“Far”滑块至“1000”,注意雾的最大能见度对场景环境的影响。图11 所示为调整最大能见度前后的对比效果。
图11 雾化效果对比图
(3) 动态更改渲染图像状态。
① 在图表栏中单击“Graphics States”面板图标按钮。
② 单击右侧“Graphics States”面板区的“Options”选项列表下“Texture”复选框——渲染图像中的纹理全部消失了。
③ 单击右侧“Graphics States”面板区的“Options”选项列表下“Wireframe”复选框,效果如图12 所示。
图12 线框模式效果图
④ 在此单击“Texture”和“Wireframe”复选框恢复成原来的设置。
(4) 动态删除/加载模型对象。
① 在图表栏中单击“Scenes”面板图标按钮。
② 单击右侧“Scenes”面板区中模型对象列表旁的向右箭头按钮——场景中只剩下空旷的天空了。
③ 单击向左箭头按钮,把 town 模型对象加进场景中。
Lynx 的动态预览功能十分强大,用户甚至可以实时地把许多 Vega 模块类新的实例添加到动态场景中。注意:在这种情况下会弹出一个“Active Preview”对话框,提示用户再设置完相关参数后按下“Done”按钮完成操作,或者按下“Cancel”按钮取消操作,只有操作完成后按下“Done”按钮,所做的更改才会在预览窗口中反映出来。
4 为场景添加环境效果
平常只要稍微留意一下就会发现,我们头顶的天空并不总是风和日丽、万里无云的。
实际上天空中都会或多或少飘动着各种各样浮云,还有那永远不知疲倦、发光发热的太阳,在天气晴朗的夜晚我们还可以看到时圆时缺的月亮,春末夏初的多雨季节中有时还会狂风暴雨、电闪雷鸣。如果在视景仿真的虚拟环境中也能够模拟出这些自然现象的话,那么整个虚拟场景的视觉效果和可信度将会大大提高,甚至能给人以身临其境的感觉。使用 Lynx可以方便地在虚拟环境中模拟诸如地表雾(Ground Fog)、云层(Cloud Layer)、太阳/月亮(Sun/Moon Rendering)甚至暴风雨(Storm)等常见的天气和自然现象效果,实现这些模拟功能和参数控制的是 Vega 的环境效果(Environment Effect)模块,用户可以选择环境效果的类型、外观及其包括颜色(每种环境效果都可以指定一种基础颜色)、大小、过渡范围和发生位置在内的各种属性。
下面我们就通过给 Town 的场景添加适当环境效果,来模拟出一天之内 Town 的场景环境随着时间不断变化的效果。
(1) 添加浮云环境效果。
① 在图标栏中单击“Environment Effects”面板图标按钮。
② 单击“Environment Effects”菜单下的“New…”项或工具栏上的新建按钮,在弹出的实例命名对话框中输入合适的名字,这里我们输入“cloud”。
③ 单击环境效果面板中的“Type”下拉菜单,选择“Hinged Clouds”项,把“Cloud Texture”选区的“Vel X”和“Vel Y”的值都设为 300,其他参数保持默认值。
④ 在图标栏中单击“Environments”面板图标按钮。
⑤ 在面板区单击“Environment Effects”列表框的向右箭头按钮。
⑥ 在弹出的环境效果实例列表中双击“cloud”项,完成将云层环境效果加入场景环境中的操作。图13 所示为环境效果面板中的浮云效果设置情况。
图13 浮云效果的设置
(2) 实现日升日落效果。
① 在图标栏中单击“Environment Effects”面板图标按钮。
② 新建一个环境效果类型为“Sun/Moon”的环境效果实例,取名为“sun”。
③ 确认面板区中“Sun/Moon Parameters”下的“Type”为“Sun”,“Fog Punch Through”的“Mode”为“On”,设定“Angular Size”值为 3000,其他参数保持默认值。
④ 新建一个环境效果类型为 Ephemeris 的环境效果实例,取名为“oneday”。
⑤ 将面板区的参数设置如下:“Current Time”设为12,“Timezone Offset”设为0,“Position”设为 Observer,“Time Controls”的 Multiplier 值设为 1000,其他参数保持默认值。
⑥ 在图标栏中单击“Environments”面板图标按钮。
⑦ 在面板区单击“Environment Effects”列表框的向右箭头按钮。
⑧ 在弹出的环境效果实例列表中,按下 Ctrl 键(或者 Shift 键)的同时依次单击“sun”和“oneday”项,使其全部处于选中状态。
⑨ 单击“OK”按钮,将环境效果加入场景环境。
⑩ 单击图标工具栏上的保存按钮,保存对 myTown.adf 所作的修改。图14 所示为 oneday 环境效果的设置情况。
图14 环境效果设置面板
现在就可以单击工具栏上的“Active Preview”按钮,来观看最终实现的效果(见图15)。
(a) (b)
图15 模拟不同时间的环境效果对比图
通过鼠标操作可以在场景中任意漫游,用户会看到现在的场景生动多了:天空中有了飘动的白云,随着漫游时间的增加,场景的光照亮度慢慢地变弱,直到天空完全暗下来,然后又会慢慢地亮起来,在合适的方向上还可以看到太阳即将升起时产生的朝霞。
上一篇:基于ArcGIS创建三维虚拟城市流程[ 12-20 ]
下一篇:没有了!