你的位置:首页 > ASP.net教程

[ASP.net教程]动力学仿真引擎ODE的学习笔记,C#演示(一)


®版权声明:本文为博主原创文章,未经博主允许不得转载。

 

一.ODE介绍与平台搭建.

 

接触到动力学仿真引擎, 是因为笔者的一款PLC仿真软件需要3D仿真.我需要达到的效果是,以3D方式构建出工控行业中常见的元件,比如感应器,气缸,机械手,拉带.这些元件在场景中通过用户的组合摆放,设置好相关的属性后,可以通过我的PLC仿真器程序的输入输出与其进行交互,产生机器动作的3D仿真效果.

比如这样一个场景:

机械手把产品放置在拉带上,PLC输出信号让拉带正方向转动,拉带带动产品移动,如果产品类型为NG,PLC在指定位置会输出信号让气缸推出,把产品推到NG盒子里.如果为OK品,产品走到拉带尾部,自由落体到OK盒子里.

 

笔者参考了一些3d仿真软件,在处理上面场景的时候,是使用的固定算法处理产品和机器机构动作间的交互,也就是说,并非是基于真实物理上的模拟.这样编程比较容易,缺点是,每一种场景都要编写固定的交互代码.如果需要增加新的场景,就必须编写配套的场景交互代码,通用性差.

我设想中的效果应该是像组态软件一样,每种元件,都可以设置自己的属性和事件,甚至是脚本代码.用户只需要把这些元件组合起来,就能生成自己想要的场景,再用PLC的程序对这个场景加以控制.只是目前见过的组态软件的元件都是2D的,不是我设想的3D效果.实际上我设想的效果其实是一种3D效果的组态软件.

如果要让这些3D元件任意组合后,也可以相互作用,就必须引入动力学仿真引擎.回到上面笔者设想的场景.机器手把产品放置到拉带上,这是一种关节运动.产品跟随着拉带一起走,这个可以通过向产品施加固定的力来实现.产品在拉带上不会因为引力穿透拉带往下沉,是因为产品与拉带都是刚体,它们之间有相互力的作用的原因.产品走到拉带尾部,应该是以自由落体方式掉下去.当掉到OK产品盒子里时,因为盒子是个凹体的刚性容器,两者产生碰撞,产品不会穿透盒子沉下去.

 

动力学仿真引擎比较有名气的是ODE(Open Dynamics Engine) ,貌似是款日本人的开源且免费的仿真引擎.听说有几款游戏也使用它做物理仿真.

当然这个不是笔者关注它的主要原因.由于笔者使用的开发语言是C#,而其名的C#的 OPENGL框架taoframework里面是刚好有一个ODE的库.因此才正中重笔者下怀,决定开始研究ODE,至于其它的动力学引擎,再优秀也不予考虑了.

OpenGL和动力学仿真方面的应用,果真不是C#善长的东西,百度一下这方面的资料,都是C++的天下,基本上没太多C#相关的代码供参考,你能做的,就是把C++的东西转换过来,对于我来说,c++就是恶梦.笔者是从事工业控制行业的软件工程师,前几年,手里有一款激光测厚仪的代码,因为是前任工程师的产物,我维护了它几年,毛病不断.可怜啊,因为它往珠海那家工厂跑了无数次,做梦都诅咒那破代码,说起来都是泪呀.

对于工控行业来说,对比诸多语言,c#开发效率算是不错的,能让你能愉快的玩耍,还有一点很重要,就是它能装B,因为它是门语法优雅的语言.^_^

笔者计划把ODE的研究结果,写成一个系列的教程,心里面感觉也算是给使用C#做同样工作的朋友的做了点小小的贡献吧.

 

接下来说下平台的搭建:

首先下载最新的ode,地址为 :http://ode.org/download.html

解压,打开ode根目录下的build文件夹,里面有个premake4.exe.

打开命令行,在命令行中打开至build文件夹,输入:premake4 --help,可以查看premake4的一些可选参数,

此处我只需要带demo编译,于是输入 premake4 --with-demos vs2010

这样,在build文件夹下面就生成了一个文件夹,vs2005,打开vs2010文件夹,里面就生成了demo的项目文件和解决方案文件,打开ode.sln编译就可以了。

生成的demo例程,共有40个,不过都是C++写的,你得确保你的vs2010安装有C++哦.

如果不想看c++代码也没关系,因为笔者主要的任务就是能让这些代码能在C#里面跑起来.各位C#的同志可以很容易派生继承.^_^

笔者跑几个demo,截图给大家欣赏一下,看到效果确实让人有那么一点小激动,让我想起了3dsmax中的rector(反应堆动力学).

这是刚体碰撞,大大小小的球随机落下来,因为质量不同,砸下来时,球与球之间的受到的力不同.地板上还有摩擦力,因此球最终会静止.

 

三个轮子的小车,轮子还可以转方向,还可以爬坡.这让我想起了3dsmax中rector中的toyCar,两者模拟的都是可以跑动的小车.我记得当时最喜欢做的事,就是让小车爬坡和撞墙,或者尾巴上拉根线,绑定一个茶壶拖着跑,呵呵.

 

未完待续.....