交互式虚拟三维环境的设计简介
引言
虚拟现实,是指用计算机生成的一种虚拟环境,它能使人们进入一个三维的、多媒体的虚拟世界,通过一些操作界面,与其中的虚拟对象进行交互,再配合各种传感器和机械部件,给人们带来一种身临其境的感受。随着计算机软硬件的发展以及图形处理能力的增强,虚拟现实技术在军事、医疗、教育、工业以及游戏中的应用已经越来越广泛。
虚拟三维环境是虚拟现实技术中一个极其重要的部分,虽然可以用现成的三维引擎来制作,但是由于绝大多数的三维引擎价格不菲,并且其主要面向三维游戏市场。所以,如果要解决的问题不是特别复杂,完全可以通过 自己编程并使用一些工具软件来完成。
1 开发环境与软件
1.1 Microsoft Visual C++ 6.0
Microsoft Visual C++6.0(以下简称为 vC++6.0)是由微软公司出品的功能强大的可视化开发平台之一,我们可以利用它在 Windows 操作系统上完成应用程序的创建、编码、测试、完善等各个阶段的工作。
I.2 OpenGL
OpenGL(开放性图形库 Open Graphics Library)是一个3DAPI,它独立于硬件系统和操作系统,是跨平台的“图形硬件的软件接口”,具有高度的可移植性。它包括了大量的绘图和显示函数,用于快速创建实时 3D图形,主要用于图形专业 领域 ,已经 成 为工 业 标准,目前的最新版本是OpenGL2.0。
1.3 3dsmax 7
3ds max 7是由Autcdesk公司出品的用于制作3D模型和动画的软件,使用它可以制作出栩栩如生的人物、动物、植物和建筑物等各种 3D模型和动画。我们使用 3ds max 7来制作一些动植物、建筑物的 3D模型,并将其导出为 3ds文件,然后在虚拟三维环境中调用。
1.4 Vue 5 Infinite
Vue5 Infinite(以下简称为 vue5)由e-on软件公司出品,它也可以用来制作 3D模型和动画,其特长在于对 3D 自然环境的模拟。在虚拟三维环境中,天空的真实感是影响视觉效果的重要因素之一,我们使用 Vue5的环境模拟功能制作出在各种大气条件下的天空的图片,然后把这些图片作为虚拟三维环境中的“天空盒”的材质贴图,展现出逼真的大气环境效果。另外,我们还可以使用 Vue5强大的地形编辑功能制作出一些不同特征的地形模型来充实虚拟三维场景。
2 虚拟场景中的三维模型的制作
2.1 天空盒模型
我们使用3ds max 7等工具软件来制作虚拟三维场景中的3D模型等元素。首先从天空开始,打开 3ds max 7,创建一个立方体 ,调整其边长到一个比较大的值(比如 2000米)我们把这个立方体称为天空盒。接着制作天空盒的材质贴图,也就是大气环境的图片。打开 Vue5,选择“载人大气”选项 ,然后从弹出的对话框中选择一种你需要的大气环境(当然你也可以使用其编辑功能创建自己想要的大气效果),然后点击文件菜单下的“导出天空”选项,将大气环境作为位图导出,再使用图片处理工具把整幅位图分解为与立方体六个面相对应的六幅位图;再次进入 3ds max 7,选中刚才的立方体,使用材质编辑器把刚才导出的天空图片赋予立方体,进行一些调整,天空盒的模型就完成了。最后一步就是把天空盒的模型导出为“3dS’’类型的文件,以便在程序中调用。
2.2 建筑物等各种实体的模型
根据需要,还应在场景中添加一些建筑物之类的三维模型,当然了,这些模型也是我们使用 3ds max 7制作的,具体的制作方法这里不再赘述。但是要注意,制作的 3D模型要在程序中实时绘制,因此,在制作模型时,不能一味追求精细,应该有意识地控制多边形的数量,以提高程序运行时的渲染速度。同样,把制作好的模型保存为“3ds”类型的文件。
2.3 树木等植物
一般采用 2D图片的方法来显示植物,这样 ,即使场景中有一大片树林,也不会影响渲染的速度。制作植物图片时 ,首先应选择合适 的植物图片(最好是正面平视的照片)对图片做一些简单的处理 ,使其满足以下几个要求:1)图片尺寸为 2的 N次方(32、64…);2)图片的底色以及不需要显示的地方为纯黑色。以便在程序中将这些地方处理成透明状态。最后,将图片保存为“bmp”格式,虚拟三维场景 中的植物就做好了。
2.4 生成地形数据
地形的创建不再采用预先建模的方式,而采用在程序中实时绘制的方法,便于在场景中漫游时检测并计算出所处位置的地面高度。具体步骤如下:首先,建立一个三维浮点型数组来保存地形的顶点坐标值,三个分量分别为地形顶点的x、Y、z坐标;然后,我们再建两个数组,分别用来保存顶点的索引值(整型)和曲面贴图的平面坐标(浮点型);接着 ,使用一段循环代码来随机生成地面的高度值,同时给三个数组赋值 ;最后,调用 OpenGL中的函数 glEnableClientState()和glVertexPointev()来载入地形顶点坐标数组,凋用 glEnableClientState()和glTexCoordPointer()函数来载人顶点索引数组。这样,地形的初始化工作就完成了,可以把这个过程写成一个函数,名字叫做 lniin(),便于在程序中调用。
3 创建基于 OpenGL的应用程序框架
OpenGL中所有的绘图函数都必须在 OpenGL的环境中运行,这个环境称为 OpenGL框架。OpenGL框架还必须运行在 Windows应用程序框架 中。也就是说,首先要建立Windows应用程序框架,用它响应和处理各种消息和命令,然后再 建立 OpenGI 运行环境 框架,并 在其中调用各种OpenOL绘 图函数 。
3.1 创建 Windows应用程序框架
首先,在 VC十 +6.0中新建 一个 Win32应用 程序(Win32 Application);然后,添加四个全局变量 htX2、hRC、hWnd和 hlnstance,分别用来保存设备描述表、着色描述表、窗口句柄和程序的实例句柄;接下来在应用程序中包含 g1.h,glu.h、glaux.h三个头文件以及 opengl32.1ib、glu32.1ib、glaux.1ib三个静态链接库文件;最后,在程序中加入 winMain()函数和 WndProc()函数(具体方法请参考 MSDN)。其中,WinMain()函数是主程序的入口,我们在其中添加一些代码创建 Windows窗口,并在 WinMain()函数 中使用PeekMessage()函数完成消息循环(即程序的主循环,被程序反复执行),它用来监听并向 WndProc()函数传递 肖息。WndProc()是一个窗口回调函数,用来处理各种窗口消息并响应外部事件。这样,一个基本的 Windows框架就建成了。
3.2 创建 OpenGL运行环境框架
步骤如下:1)对 OpenGL运行环境进行初始化设置;2)调用 OpenGL函数库中的函数完成绘图和显示工作并刷新屏幕,可以把完成这些工作的代码编写成一个函数,命名为DrawScene(),以便在程序中调用;3)在程序退出之前释放各种资源,断开 OpenGL与Windows窗121的连接。
3.3 框架程序间的关系
winMain()函数是程序的入口,我们用它创建一个窗口并设置其大小和样式。WndProc()回调函数会对“创建窗口”这个消息作出响应 ,马上调用 OpenGL框架中的 SetPixelFomat()函数检测机器对 OpenGL的支持情况,并安装OpenGL显示接口。当窗 口创建成功后,WndProc()函数对窗口尺寸变化消息作出响应,调用 OpenGL框架中的 gluPerspective()等函数对 OpenGL视 12I进行变换调整。Windows窗口生成后,就进入程序的主循环,在其中调用 DrawScene()函数绘制场景,同时监听和分配各种消息。程序退出时,调用 OpenGL中的 wglDeleteContext()函数来切断 OpenGL与 Windows窗口的连接。
关键词:
您可能也感兴趣:
为您推荐
“冰雪保险”讨论度升温 购买此类产品时需看清投保须知
我国重疾险发展迎来较大挑战,多因素致销售增长遇瓶颈
冰雪运动的保险迎来“出圈”契机 产品开发、销售难度都不小
排行
最近更新
- 交互式虚拟三维环境的设计简介
- 消费升级+“双减”落地,阿尔法蛋词典笔T10帮孩子渡过语言关
- 这些忙,绝对不能找朋友帮,有人会坐牢!
- 逐梦新征程 携手再出发 ——达县职高开展2022年春季“开学第一课
- “我刚刚才放出来,要相信我……” 男子上演苦情戏,遭光速...
- 新骗局,你会上当吗?
- 达县职高初中部召开“四心”作风问题教育整顿动员大会
- 最高检:严惩在网上诋毁他人名誉荣誉、窥探传播隐私
- 请老人吃饭?别去,是鸿门宴
- 奋力描绘美丽中国新画卷——生态环境保护扫描
- 团油如何帮助车主解决跨城加油难题?答案在这里
- 专研肌肤修护 可复美秉持“真善美”理念,护肤更安心
- 海通证券:新华联将全力推进落实整体债务化解方案
- 蓝瓶咖啡在上海静安区开业,如何在竞争激烈的市场中脱颖而出?
- 朵杞解锁社交营销新玩法 实现IP和品牌双赢
- 一场培训致19人阳性!幕后公司涉嫌传销、洗脑,曾有业务员疯...
- 年内北交所指数被频繁提及,打造晴雨表可期?
- 控股股东近七成股份将拍卖,獐子岛实控人或生变
- 周鸿祎:并没有“狂喷”元宇宙 看法“一分为二”
- 消息称字节跳动又有员工被救护人员用担架抬走,当事人回应
- 锻炼后腰痛?专家建议:卧床休息+适当运动
- “交友”变“交钱”这些“脱单”App暗藏陷阱
- 医保集采去年节省用药费用近1700亿元(新数据 新看点)
- 国家卫健委:2月23日新增新冠肺炎确诊病例186例 其中本土病例...
- 你今天盐分摄入超标了吗? “减盐攻略”来啦!
- 苏富比因藏家开拍前反悔取消拍卖104枚CryptoPunks
- Invisible Friends最近24小时成交量6684 ETH,NFT市场全网排名第一
- 美赞臣入局羊奶粉市场,两次易主后能否真正“回血”?
- 爱茉莉太平洋关闭高端品牌门店,在中国市场上还有几分胜算?
- 多地发布自贸区任务清单 重大项目集中开工建设