动力学仿真引擎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文件夹下面就生成了一个文件夹,vs2010,打开vs2010文件夹,里面就生成了demo的项目文件和解决方案文件,打开ode.sln编译就可以了。
生成的demo例程,共有40个,不过都是C++写的,你得确保你的vs2010安装有C++哦.
如果不想看c++代码也没关系,因为笔者主要的任务就是能让这些代码能在C#里面跑起来.各位C#的同志可以很容易派生继承.^_^
笔者跑几个demo,截图给大家欣赏一下,看到效果确实让人有那么一点小激动,让我想起了3dsmax中的rector(反应堆动力学).
这是刚体碰撞,大大小小的球随机落下来,因为质量不同,砸下来时,球与球之间的受到的力不同.地板上还有摩擦力,因此球最终会静止.
三个轮子的小车,轮子还可以转方向,还可以爬坡.这让我想起了3dsmax中rector中的toyCar,两者模拟的都是可以跑动的小车.我记得当时最喜欢做的事,就是让小车爬坡和撞墙,或者尾巴上拉根线,绑定一个茶壶拖着跑,呵呵.
其它的还需要下载一个C#用的OpenGL库:
http://www.opengl.org/resources/bindings/ 选择The Tao Framework+.net 2.0
前面我提过,这个库主要的功能是让C#支持OpenGl, 另外它还带有一些非常有用的库,除了ODE,还有一个支持大部分图片格式的处理纹理的库.
还有一个C#用的OpenGL库,叫SharpGL,它做为我们以后教程中主要的OpenGL开发环境来使用,我们会把ODE中的3D绘图环境库drawstuff的功能移值到SharpGL中去.
http://www.oschina.net/p/sharpgl
总结一下: ODE源代码,仅供参考,以及观看下demo的效果
The Tao Framework+.net 2.0 我们只是用它里面的ODE库,和其它的一些辅助库
SharpGL + Vs2010 C# 构成我们的 3D绘图与语言开发环境
未完待续.....
原创文章,出处 : http://www.cnblogs.com/hackpig/
动力学仿真引擎ODE的学习笔记,C#演示(一)的更多相关文章
- html5游戏引擎-Pharse.js学习笔记(一)
1.前言 前几天随着flappy bird这样的小游戏的火爆,使我这种也曾了解过html5技术的js业余爱好者也开始关注游戏开发.研究过两个个比较成熟的html5游戏引擎,感觉用引擎还是要方便一些.所 ...
- Java模板引擎之Freemarker 学习笔记 一
什么是Freemarker Freemarker是模板引擎,不是Web框架,只是视图层的组件,官网是 https://freemarker.apache.org/ Freemarker原理 数据模型+ ...
- javascript模板引擎之artTemplate 学习笔记
<div id="content"></div><div id="content1"></div><h1& ...
- 系列文章--Node.js学习笔记系列
Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- 简介及安装Node.js开发环境 Nodejs学习笔记(二)--- 事件模块 Nodejs学习笔记(三)--- 模块 Nodejs学 ...
- JVM学习笔记:字节码执行引擎
JVM学习笔记:字节码执行引擎 移步大神贴:http://rednaxelafx.iteye.com/blog/492667
- Apache OFBiz 学习笔记 之 服务引擎 二
加载服务定义文件 ofbiz-component.xml:所有的服务定义文件在每个组件的ofbi-component.xml文件中 加载服务定义 例:framework/common/ofbi ...
- [Firefly引擎][学习笔记一][已完结]带用户验证的聊天室
原地址:http://bbs.9miao.com/thread-44571-1-1.html 前言:早在群里看到大鸡蛋分享他们团队的Firefly引擎,但一直没有时间去仔细看看,恰好最近需要开发一个棋 ...
- NVelocity模板引擎学习笔记
NVelocity模板引擎学习笔记 学习模板引擎有一段时间现在做一些总结
- cocos2d-x入门学习笔记,主要介绍cocos2d-x的基本结构,并且介绍引擎自带的示例
cocos2d-x 3.0 制作横版格斗游戏 http://philon.cn/post/cocos2d-x-3.0-zhi-zuo-heng-ban-ge-dou-you-xi http://blo ...
随机推荐
- linux升级php至5.6
1 查看终端当前php版本 php -v 会反馈以下信息: PHP 5.4.35 (cli) (built: Nov 14 2014 07:04:10) Copyright (c) 1997-2014 ...
- spring 配置 Java配置类装配bean
https://www.cnblogs.com/chenbenbuyi/p/8457700.html 自动化装配的确有很大的便利性,但是却并不能适用在所有的应用场景,比如需要装配的组件类不是由自己的应 ...
- sqoop定时增量导入导出
sqoop定时增量导入 2013-11-06 14:23 4553人阅读 评论(0) 收藏 举报 sqoop使用hsql来存储job信息,开启metastor service将job信息共享,所有no ...
- Activity优化几个结束的方法
package com.itau.jingdong; import java.util.Stack; import android.app.Activity; import android.app.A ...
- jquery绑定事件的坑,重复绑定问题
我实现点击table表格中的删除按钮,找到当前按钮的祖先元素tr 然后删除该行,但是我首先点击删除的时候要先弹出提示框,是否要下载,这时在点击删除按钮删除,之前没有考虑到事件重复绑定问题,所以每次点击 ...
- scala中获取Map中key和value的方法
val scores=Map("Alice"->10,"Bob"->3,"Cindy"->8) // 获取所有的key v ...
- 【转】ZooKeeper学习第二期--Zookeeper命令操作
一.Zookeeper的四字命令 Zookeeper支持某些特定的四字命令字母与其的交互.他们大多数是查询命令,用来获取Zookeeper服务的当前状态及相关信息.用户在客户端可以通过telnet或n ...
- 阿里云的云虚拟主机安装dede提示数据库连接失败的解决办法
问题描述 阿里云的云虚拟主机安装dede提示数据库连接失败 问题分析 连接数据库失败,可能数据库密码不对或数据库服务器出错! 解决方案 1.通过ftp软件查看htdocs/data/common.in ...
- python中,获取字符串的长度
说明: 与其他的语言一样,有时候需要查看或者说计算字符串的长度.在此记录下python中通过哪个函数实现. 操作过程: 1.通过len()函数返回字符串的长度 >>> text='p ...
- python中,如何将多行进行输出,同时将行尾的换行符去掉
需求说明: 比如我要输出字符串的常量,字符串常量要输出多行,该怎么解决呢 操作过程: 1.可以通过三引号(""" .... """)将要输出 ...