版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验一 基本 Vizard虚拟现实系统构建Vizard虚拟现实系统的程序编写非常简单Wizard利用Python作为语言工具进行编程操 作,因此Vizard完全采用Python语法进行虚拟现实系统的开发。创建脚本创建脚本利用【File】|【NewVizard File,选择Vizard File,其他选项留空。为了建立 工程的开发思想,应该建立特定的文件夹,并将信息进行分类保存。对于本例而言,可以保 存该文件至特定文件夹(如myFirstVizard)中,且重命名该文件为main.py。程序中自动添 加如下代码:import vizviz.go()第1行代码代表在程序中导入viz模块,viz模
2、块是Vizard的核心模块,许多重要的功能 都是通过该模块加以实现的。任何Vizard工程文件中,至少有一个文件导入viz模块。其他 文件中若利用Vizard模块的方法与数据,则也应该在文件中导入这个模块。第2行代码表示启动Vizard渲染环境,渲染环境启动后将弹出渲染窗口。点击程序运行命令【】,此时,由于没有在代码中添加任何可视化内容,所以程序运 行界面如图1-1所示。图1- 1渲染窗口viz.go()方法启动了 Vizard渲染环境,它是Vizard虚拟现实系统构建的重要方法。viz.go() 方法开启了对后续逻辑代码的实时渲染和交互操作。viz.go()方法原型如下: .go(flags
3、window = None)flags:初始化标识,用来指定必要的初始化信息。这些初始化信息包括初始化模式、立体模式和显示模式。常用的初始化模式主要有viz.PROMPT和viz.FULLSCREENowindow:用于设定渲染的窗口。该值为一个指向已存在的窗口的有效HWND句柄。当设定初始化模式为viz.PROMPT,程序在启动之初将弹出一个对话框如图1-2所示。图1- 2弹出对话框当设定初始化模式为viz.FULLSCREEN时,程序自动进入全屏状态。初始化模式可以通过 “或”来进行连接,即模式可以是viz.PROMPT|viz.FULLSCREEN。立体模式可用于实现渲染环境的立体显示。
4、当观察者使用数据头盔进行预览时,立体模 式可以设定为viz.QUAD_BUFFER。显示模式只有viz.HMD,它是一种利用外部设备时使用的模式。viz.go()方法可以利用“或”来连接任意数量的初始化模式,如连接一个立体模式和一个 显示模式。如果不带参数的话,则程序执行缺省参数,即实时渲染窗口为单独的800*600 分辨率的默认窗口。加载模型模型是虚拟现实系统可视化渲染环境的重要组成部分,主要包括静态模型和动态模型。 静态模型的加载有两种方式:一种是利用资源导入的方式加载,另一种是利用代码编写的方 式加载。2.1利用资源导入的方式利用资源导入的方式非常简单,主要有两个步骤:【步骤1】 在当前
5、文件所在文件夹内(如文件夹myFirst或新建专门用于包含模型的自定义 文件夹model)的适当位置中找到模型资源,如文件gallery.ive。然后将gallery.ive 拖拽到【Resources】视图中。【步骤2】 在【Stage Wizard】中为该文件重新命名,如myGallery。新名字用于程序代码 对模型的引用。此时,【3D】视图显示出刚刚加载的模型如图1-3所示。图1- 3加载的模型如果加载的模型在位置、角度或比例等方面不符合实际要求时,应该首先在【Resources】 视图中选择【Stage】,然后在其中选择myGallery,最后通过选择移动、旋转、放缩等命令 实现对模型
6、的基本修改。如图1-4所示。图1- 4对模型进行基本修改调整完毕后可在【Resources】视图中选择【World】,然后在【3D视图】中通过鼠标在 窗口中位置的变化,预览模型效果。同时,可在【Property】窗口中修改模型的相关属性, 修改结果同样可以在【3D视图】中观察到。利用这种方法加载的模型通常是基础模型,即环境模型、场景模型和工具模型等。2.2利用代码编写的方式除了直接利用资源导入的方式外,还可以通过代码编写的方式加载模型。如可在当前文 件中增加如下代码:viz.add(resources/gallery.ive)该代码向当前渲染环境中加载模型gallery.ive。开发人员应重点
7、理解add方法的参数的含义。利用add方法加载模型时,方法首先在 当前文件所在目录中寻找模型,如果没有找到就会到Vizard安装程序相应目录中寻找模型。 因此应从工程的角度考虑如何构建程序,故建议在当前文件所在目录中建立resources文件 夹,将相关资源进一步分类后放在resources中。若需要继续对加载模型进行调用,则需要获得该模型的引用。相应代码如下:myGal = viz.add(resources/gallery.ive)后面的代码可以通过使用myGal变量实现对gallery模型的调用和处理。事实上,add方法体现的是加载外界资源的通用方法,它不仅仅局限于对模型的加载。 可继续
8、利用该方法增加其他类型的文件,相应代码如下:ball = viz.add(myball.wrl)#加载一个 VRML 类型的基础模型movie = viz.add(mymovie.avi)#加载一个 AVI 视频文件guy = viz.add(male.cfg)# 加载一个角色模型3设定交互交互是虚拟现实系统的核心所在。为了尝试设定交互,可在文件中增加如下代码:myDuck = viz.add(resources/duck.wrl)# 加载一个鸭子模型交互事件可以使用向导设定、使用命令设定或使用代码输入设定,现分别讨论如下。3.1使用向导设定交互事件单击【File! |【New Vizard
9、File进入文件创建向导,弹出对话框如图1-5所示。图1- 5向导对话框若选择交互方式为键盘输入,则可如上图进行设置。单击【OK】后,文件中自动添加 处理事件交互的代码,此时,文件代码如下所示:import vizviz.go()def mykeyboard(key):passviz.callback(viz.KEYBOARD_EVENT,mykeyboard)其中,后面三行有效代码是利用向导生成的交互代码。Vizard利用了回调方法即viz.callback(viz.KEYBOARD_EVENT,mykeyboard)。该方法是程序处理键盘交互的关键代码,用 来响应viz.KEYBOARD_
10、EVENT事件(即键盘输入事件),而与之对应的被调用方法即为 mykeyboardo保存该文件为myInteraction.py,编辑代码如下所示:import vizviz.go()myDuck = viz.add(resources/duck.wrl)myDuck.setScale(2,2,2)#将模型等比例放缩为原来的2倍myDuck.setPosition(0,0,10)#将模型样Z轴移动10个单位def mykeyboard(key):passviz.callback(viz.KEYBOARD_EVENT,mykeyboard)运行程序启动渲染窗口后,利用鼠标调节视图如图1-6所示。
11、图1- 6启动渲染环境上述交互代码仅仅是建立一个交互框架,没有填写真正的交互代码。因此下一个重点是 替换pass语句,编辑实际需要的内容,即将文件代码补充完整如下:import vizimport vizact#为使用后续代码中的相关方法而导入的必要模块viz.go()#添加模型#将模型等比例放缩为原来的2倍#将模型样Z轴移动10个单位myDuck= viz.add(duck.wrl)myDuck.setScale(2,2,2)myDuck.setPosition(0,0,10)def mykeyboard(key):#此处为替换 pass 语句代码起始处#if key = viz.KEY_L
12、EFT:#如果按下向左方向键myDuck.runAction(vizact.move(1,0,0,0.1)# 模型向左移动 1 个单位if key = viz.KEY_RIGHT:#如果按下向右方向键myDuck.runAction(vizact.move(-1,0,0,0.1)# 模型向右移动 1 个单位#此处为替换 pass 语句代码结束处# viz.callback(viz.KEYBOARD_EVENT,mykeyboard)程序启动后,即可利用键盘方向的左右键控制模型的左右移动,如图1-7所示。3.2使用命令设定交互事件使用向导设定交互事件要求开发人员在设计程序之初统筹如何利用交互。但
13、也有可能出 现编写程序过程中突发决定添加事件,虽然这不是一个好的习惯。因此,程序开发人员也应 该掌握使用命令设定交互事件的方法。它较前一种方法设定的交互类型有所扩充,并且比较 适合设定Vizard软件预定义交互事件,如时间事件、键盘事件、碰撞事件等。使用命令按钮设定交互事件的方法比较简单,下面在上述程序的基础上设定时间事件及 其相应代码,从而使模型实现自旋运动。具体步骤如下:【步骤1】 单击【callback wizard】命令按钮,弹出回调方法添加向导,该对话框如图1-8 所示。图1- 8回调方法添加向导【步骤2】选择TIMER_EVENT事件,即时间事件。该事件在系统中生成一个时间对象,程
14、序可根据时间对象变化的差值完成特殊功能。即每经过一定的时间,该事件就 会通过callback方法调用执行一次被调用方法。程序中增加如下代码:def onTimer(num):#num为事件计数器编号passviz.callback(viz.TIMER_EVENT,onTimer)# 回调方法【步骤3】在被调用方法中增加模型旋转代码:myDuck.setAxisAngle(0,1,0,10,viz.REL_LOCAL)【步骤4】此时启动渲染窗口发现模型并没有旋转,这是因为还没对触发时间事件的计时 器进行设定。因此,在程序代码中最后一行继续添加如下代码:viz.starttimer(0,0.01,
15、viz.FOREVER)viz.starttimer(0,0.01,viz.FOREVER)代码实现的功能是:默认计时器编号设定为0,每0.01 秒触发一次事件,永不停止(即标识符viz.FOREVER的含义)。因此,完整的使用命令添加 的时间事件部分的代码如下:def onTimer(num):myModel.setAxisAngle(0,1,0,10,viz.REL_LOCAL)viz.callback(viz.TIMER_EVENT,onTimer)viz.starttimer(0,0.01,viz.FOREVER)该实例完整代码如下所示:import vizimport vizact#
16、为使用后续代码中的相关方法而导入的必要模块viz.go()myDuck = viz.add(duck.wrl)#添加模型myDuck.setScale(2,2,2)#将模型等比例放缩为原来的2倍myDuck.setPosition(0,0,10)#将模型样Z轴移动10个单位def mykeyboard(key): #此处为替换 pass 语句代码起始处#if key = viz.KEY_LEFT:#如果按下向左方向键myDuck.runAction(vizact.move(1,0,0,0.1)# 模型向左移动 1 个单位if key = viz.KEY_RIGHT:#如果按下向右方向键myDu
17、ck.runAction(vizact.move(-1,0,0,0.1)# 模型向右移动 1 个单位#此处为替换 pass 语句代码结束处# viz.callback(viz.KEYBOARD_EVENT,mykeyboard) def onTimer(num): myDuck.setAxisAngle(0,1,0,10,viz.REL_LOCAL)viz.callback(viz.TIMER_EVENT,onTimer) viz.starttimer(0,0.01,viz.FOREVER) 程序启动后,运行结果如图1-9所示。图1- 9程序运行结果3.3代码输入设定交互事件代码输入设定交互事
18、件的方式比较适合于设定自定义交互事件。代码格式与前两种方式 相同,关于自定义事件的详细内容将在后文重点讲解。本例可在上述程序的基础上继续修改:添加下列代码,其中回调方法中被调用的方法为 自定义方法。def testFunction(theDownButton):#theDownButton 为当前按下的鼠标按键。if theDownButton = viz.MOUSEBUTTON_RIGHT:viz.message(不要使用鼠标右键! )#弹出信息viz.callback(viz.MOUSEDOWN_EVENT,testFunction)程序启动后,运行结果如图1-10所示:图1- 10自定义
19、事件综上所述,第一个Vizard程序的完整程序源代码如下:import vizimport vizact#为使用后续代码中的相关方法而导入的必要模块viz.go()myDuck= viz.add(duck.wrl)myDuck.setScale(2,2,2)myDuck.setPosition(0,0,10)#添加模型#将模型等比例放缩为原来的2倍#将模型样Z轴移动10个单位def mykeyboard(key):#此处为替换 pass 语句代码起始处#if key = viz.KEY_LEFT:#如果按下向左方向键myDuck.runAction(vizact.move(1,0,0,0.1)
20、# 模型向左移动 1 个单位if key = viz.KEY_RIGHT:#如果按下向右方向键myDuck.runAction(vizact.move(-1,0,0,0.1) # 模型向右移动 1 个单位 #此处为替换 pass 语句代码结束处# viz.callback(viz.KEYBOARD_EVENT,mykeyboard) def onTimer(num):myDuck.setAxisAngle(0,1,0,10,viz.REL_LOCAL)viz.callback(viz.TIMER_EVENT,onTimer)viz.starttimer(0,0.01,viz.FOREVER)d
21、ef testFunction(theDownButton):#theDownButton 为当前按下的鼠标按键。if theDownButton = viz.MOUSEBUTTON_RIGHT:viz.message(不要使用鼠标右键! )#弹出信息viz.callback(viz.MOUSEDOWN_EVENT,testFunction)课后作业1、在建模软件中制作模型,并导入到Vizard中进行实时渲染。2、在Vizard程序中添加控制模型上下左右移动的代码。3、实现该模型的自旋实验报告内容1、实验目的:理解如何构建简易虚拟现实系统2、课后作业中涉及的程序源代码3、问题:请简要叙述构建一个Vizard虚拟现实系统的基本流程。附:基础模型导出进行基础模型导出前,首先需要安装OSG Export
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论