




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ODE物理引擎在Space操作系统中的应用论文 摘要:Space是计算机科学联合研究院自主研发的三维操作系统碰撞检测子系统是三维桌面环境中最重要的模块是系统中所有对象处理过程的基础必须达到、实时ODE开源物理引擎是一个专为模拟刚性物体高质量函数库,由于其快速、健壮已经被许多开源游戏引擎使用所以将其移植到Space中是一个非常有意义的工作可以满足系统对碰撞检测的要求 关键词:物理引擎;碰撞检测;ODE 1.Space操作系统简介 Space三维操作系统是基于虚拟现实提出的提出设计理念以房间(room)为分割单位使得用户凭借日常生活常识即可轻松操控计算机例如用户如果想看书可以进入“图书馆房间”去浏览书籍;如果想写文档可以进入”办公室房间“使用Office等各种软件;如果想上网查资料可以进入”网络房间”,使用IEFireFox等浏览器 如图1所示碰撞检测模块是Space三维桌面环境中最重要的模块是系统中所有对象处理过程的基础大部分的人机交互过程都要依靠此模块所以它必须达到、实时才能使整个系统更能吸引用户使用 图1Space中的碰撞检测模块 2.ODE物理引擎的特点 ODE是由RusselSmith开发的一款开源物理引擎擅长模拟带铰链关节的刚性体结构该引擎是快速、健壮和稳定的可以进行交互式或者实时模拟尤其擅长模拟运动的物体该引擎使用了高度稳定的积分器使得模拟错误不会变得失控下面通过一些具体概念来具体说明: 1)刚性体(RigidBody)的属性 从模拟的观点来看,刚性体有多种属性,一些随时间可变: *物体引用点的位置矢量(x,y,z)通常,引用点对应着物体的质心 *参考引用点的线速度矢量(vx,vy,vz) *物体的朝向使用四元数(qs,qx,qy,qz)或者一个3x3旋转矩阵来表示 *角速度矢量(wx,wy,wz)它是用来描述物体随时间旋转的物理量 其他属性不随时间变化: *物体的质量 *质心相对于参考引用点的位置 *惯性矩阵一个3x3矩阵它描述了物体的质量是如何围绕着质心分布的 2)岛屿和失效体 物体之间使用“关节”相互连接一个“岛屿”就是一组不能分离的物体在模拟时单独处理每个世界中的每个岛屿会提高效率 每个物体可能处于有效状态或者失效状态在模拟时可以关掉失效体不做更新这样就可以节省计算时间要使物体的岛屿失效必须让其上的所有物体失效如果一个失效的岛屿与另一个有效体接触则整个岛屿变为有效同时一个接触关节被加入到岛屿中 3)积分器 模拟刚性体系统随时间变化的过程称之为“积分器”:随着时间的移动调整所有刚性体的状态其中有两个重点考虑的问题: *精度如何?即模拟系统应该在多大程度上接近生活? *稳定性如何?即计算错误会不会模拟系统产生完全的非物理行为(如引起系统“爆炸”) 现在ODE的积分器非常稳定但是只是在步长非常小的情况下才特别精确 4)蓄力器 在积分过程的每一步中可以调用函数给刚性体施加力这些力被增加到“蓄力器”中当进入下一步时所有的力施加到物体上每一步之后蓄力器中的力归零 5)关节和约束 “关节”是类似于铰链用来连接两个物体这样两个物体之间有相对的位置和方向这种关系也可称之为“约束”每次积分器应用约束力到所有关节和物体上每个关节有一些参数来控制它的几何体 6)关节组. 关节组是一种特殊的约束能控制一个世界中的多个关节关节可以添加到一个组中并且当这些关节都不再需要的时候可以快速销毁一个组中的所有关节但是在整个组变为空之前不能销毁单个关节 7)关节错误和误差降低参数(ERP) 当用一个关节连接两个物体的时候这些物体要求有确定的位置和相对朝向然而对某些物体有可能处于关节约束不满足的位置有一种机制可降低关节错误:在仿真的每一步每个关节使用一个力将物体矫正回正确的位置这个力由误差降低系数(ERP)来控制误差降低系数的取值在0到1之间 ERP声明了在下一步的仿真中要修正关节错误的比例数如果ERP为0不使用矫正力并且物体最终会漂移开如果ERP为1仿真在进行下一步之前会矫正所有的关节错误然而不推荐将ERP设置为1由于各种内部的近似处理关节错误不会被完全修正通常设为0.1到0.8之间(默认为0.2) 一个全局的ERP值能够影响大多数关节然而许多关节有局部的ERP值控制该关节 3.在Space中使用ODE 如前所述在Space中是以房间(room)为空间分割单位因为两个房间内的物体不会发生碰撞所以我们可以分别模拟每个房间可以形成一个世界(world)在其中建立一个空间(space)里面可以包含很多物体(body)这样物体与物体之间或者物体与场景(不可移动的物体)之间就会发生碰撞我们做如下处理: 1)在每一个模拟开始前调用碰撞检测函数来决定是否发生碰撞这些函数返回一个接触点(contact)的列表每个接触点都声明一个在空间中的位置一个表面法线矢量一个传统深度 2)为每一个接触点创建一个特定的接触关节这个关节给出了接触点的额外信息例如接触面的摩擦系数弹性或者柔软程度还有其它的属性 3)将所有接触关节放到一个关节组里面接触点过多模拟速度会下降可以使用不同的策略来限制接触点的数量 4)进行一步模拟 5)从系统中移除所有的接触点关节 下面以办公室(officeroom)为例说明代码的结构其余房间类似 简化需求: 场景:一个桌子和六个墙壁 物体:四台笔记本电脑 初始时:电脑都置于桌子上只于桌面发生碰撞不至于下落可以使用鼠标选中某台电脑横向拖动使其与其余电脑发生碰撞这样电脑会与桌面发生摩擦或者移开位置或者掉落至墙面(包括地面)发生反弹 模拟代码如下: 1)创建一个动态的世界(world) dWorldIDofficeWorld=dWorldCreate(); 2)创建动态世界中的物体(bodies) /以创建桌子为例其余物体类似 dBodyIDdeskBody=dBodyCreate(officeWorld); 3)设置所有物体的状态(质量位置受力等) /以桌子为例其余物体类似 dBodySetPosition(deskBody,x,y,z); 4)创建关节组容纳关节 dJointGroupIDcontactgroup=dJointGroupCreate(0); 5)进入循环执行如下操作 a)给物体施加力 b)调整关节参数 c)调用碰撞检测函数 d)为每一个碰撞点创建一个接触关节并放置到接触关节组中 e)进行一步仿真 f)移除在接触关节组中的关节 具体示例代码如下: /注册回调函数:nearCallback dSpaceCollide(officeSpace,0,nearCallback); /设置模拟步长进行模拟 dWorldQuickStep(officeWorld,0.01); /每次模拟后都要清空关节组 dJointGroupEmpty(contactgroup); 在模拟过程中当两个物体存在潜在碰撞时执行回调函数处理碰撞检测: voidnearCallback(void*data,dGeomIDo1,dGeomIDo2) inti; /取得可能发生碰撞的两个物体 dBodyIDb1=dGeomGetBody(o1); dBodyIDb2=dGeomGetBody(o2); /如果这两个物件已经通过关节相连则不再处理 if(b1b2 dAreConnectedExc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 六一游戏活动策划方案
- 六一玩水活动方案
- 六一节工会线上活动方案
- 六一英语线上活动方案
- 六二六禁毒活动方案
- 六人宿舍团建活动方案
- 六年级班会活动方案
- 云计算安全题库及答案
- 雷诺试题及答案
- 安全生产测评试题及答案
- 数控系统外文翻译外文文献英文文献
- 环境科学与工程-专业英语词汇必备
- SPIN销售巨人(讲解)
- YY/T 1164-2021人绒毛膜促性腺激素(HCG)检测试剂盒(胶体金免疫层析法)
- 公安派出所日常消防监督检查记录模板
- GB/T 3197-2001焊条用铝及铝合金线材
- GB/T 22073-2008工业用途热力涡轮机(汽轮机、气体膨胀涡轮机)一般要求
- GB 13561.1-2009港口连续装卸设备安全规程第1部分:散粮筒仓系统
- 可编程控制器应用实训形考任务五
- 公共文化服务体系建设专项资金一般项目、绩效奖励绩效目标自评表
- 燃气蒸汽锅炉拆除施工组织方案
评论
0/150
提交评论