VC++仿真

2024-10-24

VC++仿真(共5篇)

VC++仿真 篇1

1 六关节机械手的结构

六自由度结构示意图如图1所示, 机械手由机座、腰部、大臂、小臂、手腕及执行末端等组成, 它由6个转动关节组成, 关节1、2、3是用来定位手腕的, 关节4、5、6是用来定位方位的, 每一个关节都是由一个伺服电机驱动。

2 六关节机械手运动学分析

六关节机械手由转动关节和连杆组成, 由关节角度的转动而实现机械手的运动, 为了分析机械手的运动, 需要对机械手的各个机构之间的运动关系进行分析, 建立如图2所示的坐标系, 运用D-H方法可以确定机械手的各连杆D-H参数。

若机械手结构参数已知, 则当给出机械手各个运动关节变量时, 运用坐标变化的方法, 通过齐次坐标的平移和旋转变换就可以确定机械手部在机座标中所处的位置和姿态, 即可确定运动学方程中位姿矩阵的各元素, 设连杆i坐标系和i-1坐标系之间的齐次变换矩阵为i-1Ti, 以下各式sθ和cθ分别代表sinθ和cosθ, S12=sin (θ1+θ2) , C12=cos (θ1+θ2) 则机械手的各齐次变换矩阵如下:

根据多级坐标变换关系, 把以上各矩阵相乘就可以得到机械手末端执行器的位姿矩阵为:0T6=0T11T22T33T44T55T6=

3 仿真系统的设计

3.1 建立单文档程序

在VC++中建立单文档程序manipulator, 在FileView中找到manipuatorView.h, 在程序前面加上#include"glgl.h"和#include"glghu.h"2语句。添加库文件“OpenGL32.Lib glu32.lib”到Object/Library modules栏中, 这样可以把OpenGL的各种库函数调到VC++页面中来。在视图类中添加WM_TIMER定时器消息处理函数, 然后对其生成的OnTimer事件函数进行设计。

3.2 创建渲染描述表

OpenGL是以SGI为图形工作站, 它独立于操作系统, 而Windows应用程序是使用设备描述表 (DC) 进行绘图的, 而OpenGL是使用渲染描述表 (RC) 完成图像的映射的, 因而在Windows环境下绘制窗口要通过建立DC和RC的连接, 实现绘制的目标。RC的映射核心是像素格式的设置, 当OpenGL将数据转化为像素操作写入帧缓存中, OpenGL就要知道Windows的像素格式, 像素属性的设置需要初始化函数PIXELFORMATDE-SCRIPTOR来完成, 包括颜色模式、深度缓存位数等参数。

3.3 设置像素格式

设置像素格式时, ChoosePixelFormat函数是在系统中选取一个合适的像素格式, 它将pixelDesc描述的象素格式选择到系统中, ChoosePixelFormat接受2个参数:一个是hDC, 另一个是指向初始化函数结构的指针&pixelDesc;像素格式的工作函数由SetwindowPixelformat () 完成, 具体代码如下:

3.4 关联RC和DC

用OnCreate () 把DC和RC关联起来, 程序设计如下:

4 仿真原理及人机交互界面

本系统主要由控制界面完成各种运动的选择和控制, 控制界面包括正逆运动、各种轨迹插补、关节角度的输入和运动途经点等。各种运动的程序设计是仿真的核心, 由人机交互界面设计特定运动参数, VC++通过关联函数把设定的参数传输到运动源程序中, 利用Setimer函数设置定时器, 每一段时间就执行OnTimer函数, 然后把各关节变量信息发送出来, 然后通过On Draw函数把程序翻译出来, 在视窗中生成相应的动画。在仿真运动的过程中动画可能闪动, 可以利用OpenGL的SwapBuffers双缓存函数来实现。

用VC++设计的人机交互界面主要包括3部分, 即运动控制界面、运动显示界面和参数显示界面, 如图3所示。这个界面可以很方便地提供控制系统与仿真运动的沟通, 利用这种VC++开发的面板, 可以直观地看到机械手的运动及其轨迹, 同时用户可以很方便地改变机械手的参数进行其他的仿真。

5 结语

利用上述机械手运动学分析和仿真控制系统, 操作者在模拟的环境中能很清楚地观察到抛光机械手正逆运动学求解, 还可以清楚地看到三次多项式、五次多项式、直线插补和圆弧插补的轨迹, 并可以比较它们的差异。借助于计算机仿真技术, 不仅可以节省人力、物力, 也为以后一些不规则的轨迹规划设计的合理性、可行性、可靠性打下了基础。

参考文献

[1]和克智.OpenGL编程技术详解[M].北京:化学工业出版社, 2010

[2]李长春, 戴国洪.基于VC++与OpenGL的三维图形的构建[J].电脑开发与应用, 2004 (10)

VC++仿真 篇2

1 基于VC++的公路隧道交通诱导仿真软件总体分析

1.1 仿真软件的总体构成

一个完整的仿真系统由单片机硬件部分、上位机软件部分组成, 如图1所示。本文从上位机部分探讨了上位机软件的设计, 其结构包括:交通控制模块、交通预案模块、通风控制模块、照明控制模块、信息发布模块、通信模块。

1.2 仿真软件的总体流程

其交通诱导与控制的流程图如图2所示[4,5,6,7]。

2基于VC++的公路隧道交通诱导仿真软件的总体设计

本上位机界面程序采用Visual C++软件进行编写设计, 其操作界面如图3所示, 可以选择要演示的预案、车道、隧道的左右洞、设置或修改隧道内事件发生地点的精确位置、通风及照明控制策略, 通过仿真界面中参数设定, 与控制软件中的数据库进行知识匹配与学习, 利用专家系统的规则库及策略库针对不同的设定参数产生科学有效的控制策略, 并以动画的形式展现出来, 其效果如图3所示。

3 结语

论文从软件工程的角度简要介绍了公路隧道仿真软件的总体构成及流程, 并应用Visual C++软件对部分交通控制诱导策略进行了仿真实现。上位机软件采用中文界面, 用多种形式来设计界面, 体现出其友好性;可以通过鼠标或键盘进行人机交互, 软件易于公路隧道决策者操作;采用面向对象的设计方法进行设计, 软件易于维护、可扩展性好, 便于软件的升级。

摘要:首先分析了仿真软件的总体分析, 分析了其总体构成及流程, 在此基础上开展了仿真软件的设计, 最后以动画的形式演示了仿真软件的交通诱导效果。结果表明, 利用该软件可以优化隧道控制系统对设备单点的控制, 同时也可以验证不同控制策略的实际效果, 从而确定特定的控制模式和最优的控制策略。

关键词:VC++,公路隧道,交通诱导,仿真软件,设计

参考文献

[1]丁勇.光纤传感器隧道模型在本科教学中的应用分析[D].山西建筑, 2009 (4)

[2]王治, 李念恩.公路隧道照明节能控制系统模型的设计与实现[D].企业技术开发, 2009 (4)

[3]张利兵等.秦岭终南山特长公路隧道控制系统的构思和模型实现[D].公路, 2005 (5)

[4]赵忠杰.公路隧道机电工程[M].北京:人民交通出版社, 2007

[5]陈劲风.长大隧道交通诱导与控制研究[D].西安:长安大学, 2004

[6]韩直.公路隧道交通控制模式研究[J].公路交通技术, 2004

VC++仿真 篇3

虚拟制造以计算机为平台,在计算机仿真环境下进行加工而不消耗物理资源,对真实产品制造的动态进行描述[1]。现实的数控加工开始前需要检查NC代码是否有错,加工过程中需检验加工是否符合要求,通常需要试切检验,造成一些不必要的资源浪费和产品生产周期的加长。虚拟数控加工仿真技术在此背景下应运而生,在虚拟环境下用户可以实现对产品从设计、加工和装配、检验到使用整个生命周期的模拟和仿真。虚拟数控加工仿真系统的研究开发,不仅能节约资源、避免损失,而且可以通过模拟机床及加工过程来培训数控机床操作人员,也可以帮助机床制造商向远程客户演示其产品[2]。数控加工作为现代机械加工的主要方式,对其过程进行仿真具有重要的理论研究和实用价值[3,3]。本文以长征机床厂KV800型数控铣床为原型,在研究其操作手册的基础上,开发了虚拟数控铣削仿真系统,实时模拟数控铣孔的过程,通过控制面板实现人机交互操作功能。

1 虚拟数控加工系统的结构组成

系统包括三个模块:铣床场景模块、控制面板模块、铣孔加工模块。其中铣孔加工模块包括铣孔算法、刀具库、毛坯库和NC代码解析模块,如图1所示。各个模块的功能分别为:

a) 铣床场景模块:通过Pro/E等建模软件建立铣床的主要结构部件,转换为.3ds文件,导入到程序中。

b) 控制面板模块:人机交互界面的主要组成部分,通过点击操作面板上的按钮实现机床的各种功能以及创建、载入和保存NC代码等。

c) 铣孔加工模块:1) 铣孔算法:主要是实现铣孔过程中毛坯材料去除过程的模拟。2) 刀具库及毛坯库:根据不同的加工需求选择符合要求的刀具,设定毛坯参数,实时创建并安装毛坯。3) NC代码解析模块:通过对用户自定义的NC代码进行读取并编译,获得关键加工信息。

2 虚拟加工环境建模

虚拟数控加工仿真系统的基础是虚拟加工环境的模型建立。通过计算机图形处理技术构建物体的三维几何模型,对于所需要虚拟仿真的物体原型进行真实模拟,提供重要的几何信息和加工信息[2]。本系统采用Visual Studio 2010编译软件,以OpenGL底层库为基础。虚拟加工环境的建模方法主要有两种。1) 直接以OpenGL图形库为基础,通过VC++程序调用图形库的函数来完成建模。这种方法占用系统资源少、系统配置要求比较低,但模型建立比较复杂、难度比较高。2) 通过第三方建模软件,解决了复合模型建立的问题,造型比较美观,但占用系统资源比第一种方法大得多,对系统配置要求比较高[3,3]。

虚拟数控铣床是由许多零部件构成的装配体,结构复杂,选用OpenGL图形库进行造型非常困难。而第二种方法采用实体几何法建模思想,层次化、结构化构建机床模型,将机床的复杂建模转化为简单形体的建模活动的组合。本文选择三维建模软件Pro/E进行建模,建模思路为:采用实体几何建模思想,以实际数控铣床为对象,忽略机床伺服装置和内部传动装置,根据各零部件物理模型之间的装配关系装配成一台完整的虚拟机床。装配关系应当全面地表达零部件之间的连接性、层次性。

虚拟加工仿真的过程是在基于OpenGL底层图形库的VC++框架中进行的,由外部软件建立的机床模型必须导入到VC++框架中,方法有转换法和直接导入法。转换法由第三方软件(如Deep Exploration,3DExploration等)完成,具体步骤如下:将Pro/E模型文件保存为.obj的标准3D模型文件,导入Deep Exploration中,转存为.cpp文件。这些cpp文件可以在VC++框架中以头文件的形式导入整个机床模型[4]。此方法比较简单方便,但是数据都是包装在文件中的,不方便整改,而且尺寸多有变化,不方便进行装配。此处采用第二种方法,直接解析.3ds文件格式,编写相应的3DSLoader类将其模型数据读入内存进行绘制,方便装配。

人机交互控制系统是虚拟仿真系统的重要组成部分,采用MFC框架进行开发,三维图形界面如图2所示,包括主菜单、工具栏、图形显示区以及操作面板区和状态栏。通过菜单按钮和操作面板区按钮可以执行相应的命令,比如加载坯料、选择刀具等。在图形显示区可以通过鼠标的点击拖拽以及滚轮的滚动,方便的实现对模型的各视角的观察以及缩放。

3 毛坯库的建模

在毛坯的加工过程中伴随有物理变换和几何变换。物理变换主要有:刀具与坯料之间的作用力、热量的转换等。几何变换主要是坯料几何模型的变换。由于物理变换比较复杂、视觉效果不明显,在系统中只考虑几何变换。

由于毛坯在加工过程中几何形状时时改变,所以直接采用VC++程序调用OpenGL图形库进行毛坯的几何建模,满足虚拟加工的实时性、交互性的要求。毛坯几何建模的方法主要是:1) 离散化建模,这种实体造型方法所表达的几何模型,对实体造型要求高、计算量大,相当耗时。2) 单元体化建模,速度快,能够实现实时仿真,但由于单元体的模拟过程单一,不宜进行精确的加工仿真[5]。本系统针对的是铣孔加工,毛坯多为平面体,多用在平面上打孔,所以采用面片法建模。将毛坯分为六个面片,在需要开孔的面片上进行打孔。采用此方法数据存储量少,仿真效果精确。

4 加工仿真的实现

虚拟数控铣孔仿真是数控铣床在虚拟环境中的映射,它能实现功能特征、几何特征与实际铣床的一致性。真实的数控铣孔加工过程中,主要运动包括铣床的运动以及切削工件的运动。因此数控铣孔加工仿真主要分为铣床运动仿真和去除材料仿真两部分。

4.1 数控铣床运动仿真

机床运动仿真主要表现为卡盘随主轴的旋转运动、大拖板与导轨之间相对运动,小拖板与大拖板之间的相对运动,刀具架的转动等[6]。在OpenGL中利用OpenGL的双缓存技术,配合时间计时器与响应函数,改变结构间的相对坐标,完成加工中各项运动仿真的效果。时间计时器的设定是通过添加消息响应函数ON_WM_TIMER()来实现的。利用函数SetTimer(n,t,NULL)设定标号为n且每t μs发送一次WM_TIMER消息的时钟定时器。利用时间消息响应函数On Timer(UINT nIDEvent)设置每次刷新时变量改变值,即设定机床如何动作。利用KillTimer(n)关闭一个标号为n的定时器,该定时器不再发送WM_TIMER消息到程序,停止机床动作。

4.2 去除材料的仿真

数控铣床铣孔过程中最重要的仿真是对毛坯材料去除过程的仿真,毛坯材料的去除算法决定了加工过程的真实性。去除材料仿真过程是利用计算机图形技术,通过动画的形式,形象直观的模拟切削的过程[2]。本文设计了G代码实时编译模块。首先,读取NC代码进行解析,获得加工过程的关键数据,将数据传递给机床运动仿真模块,在虚拟环境中完成切削加工。G代码的读取与加载如图3所示。G代码可以手工点击面板上的字母按钮逐个逐行输入,同时也可以读取外部TXT文件格式的G代码,提高仿真效率。当代码被加载到系统中后, C++的读文件函数对其进行响应,读取关键字的值,将其赋给控制切削变化的变量,配合时间计时器的响应函数,完成加工仿真。

数控铣床铣孔过程是工件刀具做回转运动和z轴进给运动,因此可以通过设定孔类型、孔径大小、孔的深度、刀具位置来实现参数化、动态化的加工仿真。其过程及原理如图4所示。

具体算法为:用面片法建立立方体,其中孔所在面利用模板缓存,开启模板测试,以孔的半径r为半径画一个圆,在这个圆内所有点的模板缓存设置为1,孔以外的点模板缓存位置设置为0,模板缓存值为1的点通不过模板缓存测试,只画通过模板缓存测试的点。然后在圆心画一个半径为r的圆R。当刀具跟坯料发生干涉并向下移动H时,圆R向下移动H并产生一个高度为H的孔四周的圆柱面。整个铣孔的过程是对各个面的操作,通过对时间控制器的控制,完成整个工件毛坯的铣孔仿真。

在实时加工仿真中,刀具模型与坯料模型进行铣孔运算,根据运算结果更新工件实体库中的数据信息,调用实体显示函数,获取更新后的工件毛坯模型数据并将其显示在屏幕上。整个加工过程中,利用了OpenGL的双缓存技术,定时器技术以及界面刷新技术。由于数据更新的速度远远大于使用实体显示函数来更新造型的速度,因此可以获得平滑逼真的动画效果[7]。

5 结语

本文基于VC++与OpenGL开发了虚拟数控铣床铣孔加工仿真系统。加工环境以及加工模块的建模分别采用了外部建模然后导入和直接调用OpenGL底层图形库的方法,可以方便地模拟真实的机床,具有较好的可扩展性。系统的操作界面使用MFC编程设计,具有友好的人机交互性,用户可以便捷的对整个系统的加工过程进行多视角的局部或整体的观察。对G代码实时读取和自定义输入,实现了铣孔加工的参数化动态仿真。刀具和毛坯的选择设计完善了系统的仿真效果。切削加工的方针算法在一定程度上弥补了由外部模型导入带来的系统压力。实验表明,仿真效果达到了预期要求,具有较好的现实意义。

参考文献

[1]白广利,杨洪亮,纪彬,等.虚拟制造技术的初步研究[J].石油机械,2005,33(9):78-82.

[2]侯磊,王培俊,李国良,等.基于OpenGL与VC++的虚拟数控车床加工仿真研究[J].机械工程与自动化,2011(167):4-10.

[3]谷峰,李印结.国际先进制造技术的研究动态[J].制造技术与机床,2006(5):40-43.

[3]其木格,李强.基于UG的虚拟机床运动学建模与仿真[J].机械制造与自动化,2007(05):26-29.

[4]阳旭,王培俊,杨利明,等.滑动轴承三维油膜压力动态分布可视化研究[J].机械工程与自动化,2010(2):14-16.

[5]熊家伟,黄明吉,贾志新.虚拟数控车床仿真系统的研究与开发[J].机械制造与自动化,2006(03):95-96.

[6]陈云,杜齐明,董万福,等.现代金属切削刀具实用技术[M].北京:化学工业出版社,2008:200.

VC++仿真 篇4

数控机床加工各种形状的零件轮廓时,必须控制刀具相对于工件以给定的速度沿指定的路径运动,这一功能称为插补。绝大多数机床数控系统都具有平面直线和圆弧插补功能,很少具有三维空间插补功能。但在实际生产中,特别是在铣床、镗床等三坐标机床的加工中,经常要求加工空间图形,特别是空间直线,所以经济型数控机床的插补系统应具有空间直线插补等功能。

1 基于基础坐标空间直线插补算法

传统的逐点比较空间直线插补包括偏差判别、坐标进给、新点偏差计算和终点判别4个步骤,该算法在坐标进给时不考虑进给后插补误差的大小而直接决定进给坐标,致使插补误差比较大[1~4]。在前人研究的基础上,引进基础坐标[5]的概念,提出了一种基于基础坐标的逐点比较空间直线插补算法,以实现机床X、Y、Z三轴联动功能且有效地提高了空间直线插补速度与精度。

1.1 三维空间24区域划分

在三维空间中,第一象限划分为三个区域的方法[6]如下:利用过原点O的平面AOE,BOE,COE将第一象限空间为三个正四锥型的区域,即X≥Y、X≥Z区域1,Y>X、Y≥Z区域2,Z>X、Z>Y区域3,如图1所示。这三个平面中AOE垂直平面XOY并且与X轴、Y轴的夹角为45°,BOE垂直平面YOZ并且与Y轴、Z轴的夹角为45°,COE垂直平面XOZ并且与X轴、Z轴的夹角为45°。其他每个象限划分区域方法同第一象限相同,三维空间总共分割为24个区域。

1.2 插补公式推导

如图2(a)所示,设要加工区域1以O(0,0,0)为原点,以E(Xe,Ye,Ze)为终点的OE空间直线段,Xe≥Ye,Xe≥Ze,且Xe,Ye,Ze均为正值,X坐标为基础坐标。

通过文献[7]得知,每次单独进给X坐标、Y坐标或Z坐标叫做基础坐标进给,同时进给两个坐标或三个坐标及以上叫做联合坐标进给。图2(b)中的直线为OE在XOY坐标平面内的投影,当基础坐标+X进给时,得出新偏差值为:

(a) 直线在三维空间位置;(b) 直线在XOY平面投影;(c) 直线在XOZ平面投影

当联合坐标+X、+Y进给时,得出新偏差值为:

空间直线OE在XOZ坐标平面内投影如图2(c)所示,同样当基础坐标+X进给时,得出新偏差值为:

当联合坐标+X、+Z进给时,得出新偏差值为:

有了上述4个平面偏差计算公式,现在关键是如何将其运用到空间直线的偏差判别和计算,以决定下一步进给的走向。下面规定:

1)若|Fy|>|Fxy|,|Fz|>|Fxz|,则沿X轴、Y轴和Z轴方向进给脉冲,令Fxy值赋给Fv,Fxz值赋给Fz;

2)若|Fy|>|Fxy|,|Fz|≤|Fxz|,则沿X轴和Y轴方向进给脉冲,令Fxy值赋给Fy,Fz值赋给Fxz;

3)若|Fy|≤|Fxy|,|Fz|>|Fxz,则沿X轴和Z轴方向进给脉冲,令Fy值赋给Fxy,Fxy的值赋给Fz;

4)若|Fy|≤|Fxy|,|Fz|≤|Fxz|,则沿X轴方向进给脉冲,令Fy值赋给Fxy,Fz值赋给Fxz。

以上规定适用于xe≥ye且xe≥ze区域,三维空间插补偏差判别与计算如表1所示。

2 改进后空间直线插程序设计

空间直线插补程序设计的基本思想是:程序开始时,根据向量的坐标运算法[8]判断空间直线所在的象限,然后根据基础坐标判别进入各自的区域进行插补运算,最后进行判终处理及返回到相应的象限。空间直线插补程序中直线所在象限判别与基础坐标判别方法比较简单。下面对空间直线插补过程[9]进行详细介绍,以第一象限区域1为例,X为基础坐标,初始插补偏差均为0。插补流程图如图3所示,其他区域与此相似。

VC++6.0软件采用面向对象的机理设计程序,适用于开发各类应用系统。现在以VC++6.0软件为程序开发平台,对空间直线插补进行仿真[10]。

界面设计如图4所示。绘图区域尺寸为300×300,操作者可以在编辑框中设置直线坐标和步长的任意大小,单击绘制空间直线等按钮可实现相应功能。

VC++6.0软件设计程序需要大量映射函数,下面介绍实现各功能的函数。

void CBase Line Dlg::On Btn Drawzuobiao(),该函数实现绘制空间坐标系功能。

void CBase Line Dlg::On Btn Drawline(),该函数实现绘制空间直线功能。因为空间直线有X、Y、Z三个坐标值,但是该空间直线在VC++中要以二维平面的形式绘制出来,所以设计编写程序时运用到正等轴侧变换矩阵T=[0.7071,0,-0.4082,0;-0.7071,0,-0.4082,0;0,0,0.8165,0;0,0,0,1]。插补过程程序也运用正等轴测变换矩阵,下文不再详述。

该函数实现判别空间直线所在象限的功能,插补过程功能需调用Chabu1()等函数。

3 改进后空间直线插补实例与仿真

现加工区域1内以坐标原点O(0,0,0),E(6,5,3)为终点的空间直线段OE。利用改进后的插补算法进行插补计算如表2所示。

通过上述实例数据可以看出:优化后的逐点比较法空间直线插补的总步长插补次数为6,大大提高了插补速度;优化后的逐点比较法空间直线插补的最大偏差|F|=3,有效地提高了插补精度。

为了验证上述算法的正确性,利用VC++6.0软件编写插补程序源代码,模拟仿真空间直线插补过程,以实现空间直线插补功能如图5所示。

4 结束语

基于基础坐标概念的逐点比较空间直线插补方法运用了新的插补公式,插补思路更加清晰,插补信息清晰明了;该方法中避免了有关文献所述方法中涉及的导数计算、有可能出现斜率无穷大、计算麻烦等缺点;空间直线的插补步数等于其基础坐标的绝对值,终点判别一目了然且提高了插补速度;插补过程中的最大偏差大大减小了,有效地提高了逐点比较空间直线插补精度。该算法可以实现串联机床三轴联动、六轴并联机床六轴联动功能,进一步提高了数控系统的插补速度,有效地提高了逐点比较空间直线插补精度和刀具半径补偿精度。

摘要:针对传统逐点比较空间直线插补方法存在插补误差大、直线光滑性差等问题,提出了一种基于基础坐标概念的逐点比较空间直线插补算法。在三维空间划分为24个区域的基础上推导该算法的插补原理,得到了各区域的插补公式。基于VC++6.0软件进行了模拟仿真,该算法可以实现串联机床三轴联动、六轴并联机床六轴联动功能,进一步提高了数控系统的插补速度,有效地提高了逐点比较空间直线插补精度和刀具半径补偿精度。

VC++仿真 篇5

我国某新型水雷具有自动化程度高、战斗准备迅速和性能稳定可靠的特点。但由于装备结构复杂, 使用人员需要经过系统培训, 但由于训练用水雷数量有限, 配套训练条件不足, 导致快速提高训练、使用水平受到制约。三维仿真训练系统可以有效地解决训练过程中面临的困难。

本系统是在Visual C++6.0环境下, 利用MFC平台搭建OpenGL工程来实现的。OpenGL自从1992年诞生到现在, 已经成为业内最为广泛使用和支持的2D和3D图形应用程序接口, 被应用在不同的计算机平台上去开发各种各样的应用程序。OpenGL具有一套渲染、纹理贴图、特效和其他功能强大的显示函数, 加速了应用程序的开发。功能强大OpenGL可以在所有流行的个人计算机和工作站平台上开发和使用, 确保了程序有良好的可移植性。OpenGL的特点是可靠度高、可扩展、可伸缩、灵活、容易使用等。借助Windows编程环境及利用OpenGL的变换, 色彩处理, 光线处理, 动画及纹理影射等功能进行某型水雷三维仿真训练软件的开发可实现短小精悍、性能优异的三维仿真工具, 为武器使用训练提供一个专门的可交互的三维仿真手段。

2 系统总体设计与功能

系统在Windows XP平台上, 使用VC++6.0与OpenGL结合的编程仿真, 通过3DS MAX三维软件建立三维模型, 再将模型导入仿真系统中, 进行人机交互控制。通过对各个三维仿真部件和工具进行鼠标选取、平移、旋转操作, 结合系统预先设计的视点转换和安装、拆卸动画, 达到对某型水雷的各种技术准备操作进行三维仿真训练的目的。模拟训练过程中, 用户按操作步骤使用鼠标对零部件和相关工具进行选择, 并进行移动和旋转, 使其以规定姿态到达指定位置, 完成仿真训练。其系统总框架如图1所示。

3 系统关键技术

3.1 构建OpenGL开发环境

在所有的Windows应用程序开发工具当中, VC++6.0已经成为OpenGL图形应用的首选开发环境。由于OpenGL类似状态机, 它的各种状态 (或模式) 必须预先设置, 然后让这些状态一直生效, 直到再次修改它们, 所以必须对开发环境进行构建, 以初始化相关OpenGL状态, 并对程序相应的函数进行修改, 使OpenGL虚拟环境顺利显示。

(1) 创建M F C界面, 向工程中添加O p e n G L编译链接库o p e n g l 3 2.1 i b、glu32.1ib、glaux.1ib、glut32.1ib, 并确保在系统的system32目录下有下列动态链接库文件的存在:glu.dIl、glu32.dll、glut.dll、glut3.dll、opengl32.dll。

(2) 编写创建函数。因为OpenGL仅能在客户窗口中绘图而无法在该窗口的子窗口和兄弟窗口中绘图, 所以必须在客户区域中去除[1]。本程序在V I E W类的PreCreateWindow () 函数中添加下面语句来实现:

cs.style=WS_CLIPCHILDREN|WS_CLIPSIBLING;

(3) 设置像素格式, 创建绘制描述表。这一过程可利用视图类里的OnCreate () 函数通过用CreateOpenGL () 来实现。OpenGL依赖绘制描述表操作硬件, 因此调用OpenGL命令前, 必须创建绘制描述表并使其成为当前的绘制描述表, 即

m_hRC=wglCreateContext (hDC) ;wglMakeCurrent (hDC, m_hRC) ;

(4) 定义当前视区及投影模式等。这些操作在对W M_S I Z E消息的处理函数OnSize () 中体现, 在其中调用glViewport () 函数对创建的窗口变换进行更改以适应窗口大小的改变。还可以通过gluPerspective () 函数重新设置投影变换, 使得当窗口的大小发生改变时, 显示在窗口中的场景不会被扭曲。

(5) 填充背景色, 进行一些OpenGL绘制前的初始化工作。当需要重新设置窗口背景时, 产生WM_ERASEBKGND消息。处理该消息的缺省操作是用当前背景色填充整个窗口。OpenGL用glClear () 函数来执行类似操作, 所以要对W M ERASEBKGND的消息处理函数做适当改变:注释掉OnEraseBKgnd () 函数中所有的语句, 添加return TRUE语句, 使该函数不执行操作, 仅返回TRUE值。

(6) 绘制场景, 最后删除绘制描述表。所有的Open GL的绘制操作都必须放在OnDraw () 函数中。在窗口销毁时会触发WM_DESTROY消息的处理函数, 因此我们在该函数中删除绘制描述表。

3.2 对象模型的创建与显示

(1) 对象模型的创建

系统模型使用3DS MAX建立, 该软件建模精细、功能强大, 但是它不具备人机交互功能。在V i s u a l C++中利用OpenGL建立的模型可以进行人机交互, 但用OpenGL建模的缺点是无法表达复杂的物体和细节, 仿真效果差, 而且工作量繁杂。我们结合3DS MAX和OpenGL的建模特点, 用3DS MAX制作水雷各个组件和工具的三维模型, 并导出为3ds文件, 然后在Visual C++6.0环境下通过接口程序读取模型的数据源文件。

在3DS MAX中水雷各部分使用扩展几何体建模, 扩展几何体主要是一些较为复杂的几何体, 如倒角立方体、圆柱体等, 利用布尔运算初步建模后, 用bend等编辑修改其对模型进行修改和编辑, 实现模型的细节, 使用材质贴图模拟模型金属质感, 并利用UVW贴图修改器对材质贴图进行调整, 以求达到最佳效果。

(2) 3DS模型文件的读取与显示

3DS文件是由许多块 (chunk) 组成的 (大块中镶嵌子块) 。由于至今为止。没有一个官方的文献说明其格式, 所以还有很多未知的块。不过这并不影响我们读入3DS文件中的模型。因为我们在读人时。可以根据自己的需要选择性地读入需要的块, 而忽略掉那些不感兴趣或未知的块。这正是块结构给我们带来的好处。一个块由块信息和块数据组成。块信息又由块ID (两个字节长的标识, 如4D4D) 和块的长度 (四个字节, 其实也就是下一个块的偏移字节数) 组成。用VC++以十六进制方式打开3DS文件可以很清楚的看到其结构。在读入这种块结构 (大块中嵌套小块, 而块的结构固定) 的文件时, 完全可以用递归的方法实现, 返回上一级 (子块读完, 返回父块) 的条件则是当前已经读入的块的字节数是否等于块的长度。从父块转向读入其子块, 则可用switch语句实现, 通过子块的ID判断进入哪个分支[2]。程序流程图如图2所示。

读入3 D S文件通过定义一个CLoad3DS类来处理, 其实现的关键代码为:

在OpenGL中实现图形绘制, 是通过将物体抽象为笛卡尔坐标系下点, 线段, 多边形等多种形状的集合, 再通过函数gl Begin () 与gl End () 这两个函数中一系列的顶点数据来还原物体的。线的绘制包括了线段, 折线和闭和曲线的绘制。对于面的绘制, 也是通过glBegin () 与glEnd () 这两个函数来实现的, 所不同的是采用不同的状态参数。如三角形片状态参数GL_TRIANGLE_STRIP, 体的绘制是通过几个四边形GL_QUAD来实现的。读入某部件和工具模型如图3所示。

3.3 模型的鼠标选取与操纵

由于水雷仿真训练操作需要用户对屏幕上的部件和工具进行选择, 并且移动、旋转这些部件。支持这类交互操作是OpenGL的设计目标之一。由于屏幕上绘制的物体一般经历多次旋转、移动和透视变换, 因此在三维场景中判断用户所选择的是哪个物体会比较困难。为实现这个目的, 我们使用OpenGL的选择机制[3]。在进入选择模式时, 整个场景都将重绘到帧缓冲区, 调用绘制图元函数进行重绘时, 图元名称将加载到名字堆栈中, 完成名字堆栈的创建。然后确定特殊的挑选矩阵, 并协同使用投影矩阵, 把绘图限制在视口内靠近鼠标双击位置的一个小区域内, 当退出选择模式时, OpenGL以点击记录的形式返回靠近鼠标双击位置的图元列表。点击记录包含的信息, 对应名字堆栈中当前的内容。因此, 当点击记录返回时, 我们可以用它来确定屏幕上的那些图元被用户选择。鼠标选取模型过程中使用glSelectBuffer () 函数制定返回点击记录的数组, glRenderMode () 函数进入选择或渲染模式, g l I n i t N a m e s () 和glPushName () 函数对名字堆栈进行初始化, glPickMatrix () 函数确定挑选矩阵[3]。鼠标选取程序流程如图4所示。

选取部件后还必须对所选部件实现平移变换, 旋转变换。模型是相对原点来定义绘制, 移动坐标原点就能实现平移, 其函数为glTranslatef (x, y, z) , 该函数用指定对象坐标x, y, z沿着x, y, z三轴移动。旋转变换是模型所在的坐标系发生旋转变换, 即坐标系的变化将直接导致物体的变化, 函数为glRotatef (angle, x, y, z) , 该函数中第一个变量a n g l e为模型旋转的角度, 单位为度, 后3个变量表示以原点 (0, 0, 0) 到点 (x, y, z) 的连线为轴线逆时针旋转物体[4]。

用户可以通过菜单选择变换操作, 如旋转操作、XY平面和XZ平面平移, 在旋转操作中, 三维模型置于预先定义的虚拟球中, 按下鼠标按键, 在虚拟球上确定了一点, 拖动鼠标就是移动该点, 就实现了旋转模型的目的。在平移操作中, 将鼠标移动转换为X轴、Y轴或X轴、Z轴的平移量, 从而实现模型平移。下面步骤实现了对导入3ds模型的旋转和平移变换:

(1) 定义虚拟球类和鼠标平移坐标转换算法。

(2) 把鼠标坐标变换映射为虚拟球上和三维空间相应轴上的坐标变换。

(3) 定义变量, 如旋转矩阵、平移矩阵及鼠标各个状态的定义, 包括按下, 点击, 拖动等。

(4) 根据各变量的变化来更新旋转矩阵和平移矩阵。

(5) 将变化的结果应用于选定的模型。

4 结语

本文给出了一种构建三维仿真系统的基本过程和实现方法。Open GL和3DS M A X结合实现三维仿真既利用了3 D S MAX建立模型方便快捷的特点, 又利用了OpenGL容易实现交互性的特点, 将平移、旋转以及三维模型之间的层次关系和相对运动等运动信息进行集成, 在此基础上开发模型的运动仿真功能。三维仿真操作时, 模型之间相互独立, 省去了大量的实时的逻辑和参数计算, 提高了仿真的实时性流畅性。本软件可以方便地在不同平台和系统间移植。利用本文所述方法构建三维仿真系统, 简单方便, 通用性好, 这对于快速开发可视化模拟训练系统具有实际意义。

参考文献

[1]夏艳, 过仲阳, 章伟伟.基于OpenGL的虚拟现实关键技术研究[J].计算机时代.2008, 7:46—50.

[2]林培炎, 冯开平.采用VC++与OpenGL的三维场景编辑系统的研究与设计[J].工程图学学报.2009, 5:58-62.

【VC++仿真】推荐阅读:

合成仿真07-21

通信仿真10-15

实时仿真10-16

交通仿真10-19

硬件仿真10-19

模拟仿真05-09

仿真结构05-15

轮机仿真05-24

仿真约束05-26

仿真应用05-26

上一篇:财务业务与财务风险下一篇:历史学习兴趣