技术创新《微计算机信息》2012年第28卷第10期120元/年邮局订阅号:82-946《现场总线技术应用200例》博士论坛基于虚拟现实技术的虚拟农场的研究和实现Research and Implementation of Virtual Farm Based on Virtual Technology(南京农业大学工学院)李东阳LI Dong-yang摘要:本系统基于虚拟现实在农业方面的应用,在VC++6.0的软件平台、在Win32框架下,使用C 语言和行业领域中最为广泛接纳的2D/3D 图形API---OpenGL,创建一个以真实农场为模板的虚拟农场,通过DirectInput 接口实现逻辑方向盘与计算机的交互性,并通过Socket 编程使系统具有网络传输信息的功能,从而实现相应的远程控制,和现实的农场进行交互。
实验系统成功创建了一个三维果园、仓房场景、漫游小车及附属设施,可以根据应用的侧重不同进行改善,从而实现虚拟现实技术在农业方面的相应应用。
关键字:虚拟现实;OpenGL;虚拟农场;交互性;网络通信中图分类号:TP311文献标识码:AAbstract:A system that a virtual farm based on virtual reality technology is created using C language and OpenGL-most widely ac -cepted 2D/3D API,in VC++6.0platform and Win32framework ,is introduced in this paper.This system realizes the interaction be -tween computer and logic steering wheel through the DirectInput interfaces,and it has the function of the transmission of information online to communicate with the reality farm so as to achieve remote control,with the method of Socket programming.This trail sys -tem consists of a 3D orchard,warehouse,a small card wandering in the farm and so on,and it can be improved according to differ -ent application to realize all kind of application in agriculture based on virtual reality technology.Key Words:Virtual reality;OpenGL;Virtual farm;Interactivity;Network communication文章编号:1008-0570(2012)10-0010-021引文虚拟现实(VR)技术最早在20世纪中期由美国VPL 探索公司和它的创始人Jamn IJaIlier 提出这一概念,后来美国宇航局(NASA)的艾姆斯空间中心利用流行的液晶显示电视和其它设备,开始研制低成本的虚拟现实系统,推动了该技术硬件的进步。
虚拟现实,又称灵境技术,是以沉浸性、交互性和构想性为基本特征的计算机高级人机界面。
他综合利用了计算机图形学、仿真技术、多媒体技术、人工智能技术、计算机网络技术、并行处理技术和多传感器技术,模拟人的视觉、听觉、触觉等感觉器官功能,使人能够沉浸在计算机生成的虚拟境界中,并能够通过语言、手势等自然的方式与之进行实时交互,创建了一种适人化的多维信息空间。
虚拟现实具有多感知性、浸没感(Immersion)、交互性(Interactivity)、构想性(Imagination)。
在医学、娱乐、教育、科研、军事、航天、城市规划、工业仿真等很多方面都有广泛而重要的应用。
但在农业方面却是空白,因此本文就虚拟现实在农业方面的应用进行了研究和探讨。
图1、图2、和图3展示了虚拟现实的应用例子及本文所研究的虚拟农场场景图。
图1模拟天宫一号图2城市规划图图3虚拟农场本文研究了基于虚拟现实技术思想的三维虚拟农场的系统的创建,借助于OpenGL 和C/C++语言在VC++6.0的开发环境下、在Win32程序框架下实现系统的搭建。
系统可分为三个部分:三维场景、人机交互、数据通信。
系统的三维场景通过创建天空盒、地面、纹理贴图和导入3D Max 创建的3D 模型;人机交互主要是通过Direct SDK 里提供的DirectInput 实现;数据通信则是通过套接字网络编程接口创建C/S 模式的通信连接,实现数据的传输。
研究结果表明通过创建农场的三维场景确实能够给农业装备的研发和测试提供一个非常真实的平台,解决农业装备研发和测试所需的环境的季节性弊端。
2虚拟现实OpenGL 遵循C 语言的调用约定,可以与Visual C++紧密接口。
有七大功能:建模、变换、颜色模式设置、光照和材质设置、:纹理映射、位图显示和图象增强、双缓存动画。
OpenGL 还能实现深度暗示、运动模糊等特殊效果。
本文将利用这些功能来搭建虚拟农场场景并且实现控制。
OpenGL 被设计成独立于硬件、以流水线的方式工作,其工作流程和绘图的流程如图4和图5所示。
图4OpenGL 工作流程图5OpenGL 绘图流程因此首先当系统收到WM_CREATE 消息后,要首先对OpenGL 进行设置李东阳:学生10--技术创新case WM_CREATE://建立窗口m_OpenGL->SetupPixelFormat(hDC);//调用显示模式m_OpenGL 是专门针对OpenGL 而创建的一个类的实例。
类OpenGL 的定义中有三个主要的函数SetupPixelFormat(HDC hDC);void Init(int Width,int Height);void Render();BOOL OpenGL::SetupPixelFormat (HDC hDC0)//检测安装OpenGL{……PIXELFORMATDESCRIPTOR pfd ={sizeof (PIXELFOR -MATDESCRIPTOR),,,,,};if (!(nPixelFormat =ChoosePixelFormat(hDC,&pfd))){…..;return FALSE;}SetPixelFormat(hDC,nPixelFormat,&pfd);hRC =wglCreateContext(hDC);wglMakeCurrent(hDC,hRC);……}函数SetupPixelFormat(HDC hDC0)定义并填充PIXELFOR -MATDESCRIPTOR 类型的结构体变量pdf ,然后调用函数ChoosePixelFormat(hDC,&pfd)在硬件所支持的像素格式里选择与所要求的像素格式最匹配的一个。
然后调用SetPixelFormat (hDC,nPixelFormat,&pfd);将设备描述表的像素格式设置成由索引值为nPixelFormat 所指的像素格式,调用hRC =wglCreate -Context(hDC);创建着色描述表,最后调用wglMakeCurrent(hDC,hRC);使着色描述表当前化,至此OpenGL 像素格式设置完毕。
Init()函数调用以下几个函数实现视口、透视图的设置。
glViewport(0,0,Width,Height);//设置OpenGL 视口大小。
glMatrixMode (GL_PROJECTION);//设置当前矩阵为投影矩阵。
gluPerspective (54.0f,(GLfloat)Width/(GLfloat)Height,0.1f,3000.0f );/*设置透视图:透视角设置为45度,窗口的宽与高比,视野透视深度:近点1.0f,远点3000.0f*/glMatrixMode(GL_MODELVIEW);//设置当前矩阵为模型视图矩阵Render()函数主要是实现图形的显示和渲染。
其编写模式如下:glMatrixMode(GL_MODELVIEW);glLoadIdentity();glPushMatrix();glTranslatef(0.0,0.0,-4.5);glRotatef(m_fAngleX,1.0f,0.0f,0.0f);//平移、旋转glColor3f(1.0,0.0,0.0);glBegin(GL_LINES);//绘图glVertex2f(-0.8,0.8);……glEnd();glPopMatrix();这部分体现了OpenGL 的函数语法、状态变量、模型创建、模型变换等等,如这里函数尾部的2代表是二维的,如果是3就是三维坐标了,而f 则表示坐标的值是浮点数等等,图6是通过OpenGL 创建的虚拟农场实验系统的启动画面。
图6虚拟农场实验系统启动画面场景里成功创建地面、天空盒,创建了苹果树、花,导入了房子、小车等三D 模型,可以根据创建场景的不同,使用3D Max 软件或其他的三维软件创建所需的立体模型,贴上纹理,再导入到场景里,从而构建出满足不同需求的农场场景。
3DirectInput 接口实现人机交互DirectInput 是有关鼠标、键盘、游戏杆和其他游戏控制设备,以及力回馈设备的一组API 。
DirectInput 允许程序从输入设备中获取数据,即使当程序是在后台运行。
它同时提供了对所有输入设备的全面支持,包括力回馈设备。
通过操作映射(Action Mapping),程序可以获取输入数据,而不需要了解什么样的设备在运行,产生这些数据。
DirectInput 是Windows 平台下游戏、模拟设备和其他实时交互程序的有力工具。
其编程步骤如下:(1)创建DirectInput 对象;通过DirectInput8Create()创建接口。
(2)枚举相关类型的设备。
DirectInput 库为创建DirectIn -putDevice 对象预定义了两个GUID:GUID_SysKeyboard 和GUID_SysMouse 。
将两者之一直接传递给CreateDevice 函数,就会得到相应设备的DirectInputDevice 对象。
但是没有游戏杆的预定义GUID 。