实验内容或任务: o 将已建立的三维实体模型转换成OSG文件; o 创建虚拟现实场景,调用OSG文件; o 通用程序中修改拆装规则(比如某螺栓不拆,箱盖拿不下来;轴系不拆,齿轮拆不出来等规则),实现虚拟装拆。 实验效果: 


图1 掘进过程仿真 
图2 工作过程性能额仿真  
图3 某速度时值面图 
图4 学生所做减速器虚拟现实拆装仿真系统 1、将三维模型转换成OSG文件
由于OSG中没有支持solidworks文件的插件,首先在solidworks中将F:\CADCAM实验\虚拟现实认知与场景创建实验\一级减速器\减速器装配体.SLDASM导出wrl文件;然后用3DMAX将文件打开,对模型进行材质设置,图片的渲染,模型坐标的调整以及模型各个节点的命名;3DMAX不能直接导出OSG格式,需要安装一个插件OSGExp1.2.1Install_x64,安装完成后会自动挂在3DMAX上,导出时选中该格式即可,最后导出格式为OSG格式。 2、创建虚拟现实场景 创建虚拟场景通过CCoreOSG::InitManipulators(void)方法来实现,方法中使用了OSG标准的漫游器创建方法,OSG中代码格式为:操作器名称 = new osgGA::创建操作器的方法,如:trackball = new osgGA::TrackballManipulator(); 3、初始化虚拟现实场景 通过CCoreOSG::InitSceneGraph(void)方法来实现,其中包含了模型的优化以及把模型加入到场景的操作。 其中优化的代码如下: osgUtil::Optimizer optimizer; optimizer.optimize(asmSwitch.get()); 初始化相机:通过CCoreOSG::InitCameraConfig(void)方法实现,其中包含了读取窗口,创建相机等操作。 帧前操作:通过CCoreOSG::PreFrameUpdate()方法实现 帧后操作:通过CCoreOSG::PostFrameUpdate()方法实现 4、调用OSG文件 然后通过程序调用OSG文件,把模型读到我们的虚拟环境中去,这就需要我们通过Visual Stduio 2010来实现这个目标。模型的导入主要是读入模型,其核心代码参考如下: pats = new PositionAttitudeTransform; pats -> addChild ( chipan6.get() ); pats -> setPosition ( Vec3(0 ,0 , 0) ); ref_ptr<CPnoInfo> pno = new CPnoInfo; pno->pos_ori = Vec3(0 ,0 , 0 ); pno->quat_ori = Quat(0,Y_AXIS); pno->pos_obj = Vec3(0 ,0 , 0.3); pno->quat_obj = Quat(0,Y_AXIS); pats->setUserData( pno.get() ); |