logo资料库

Bullet 物理引擎中文文档.pdf

第1页 / 共21页
第2页 / 共21页
第3页 / 共21页
第4页 / 共21页
第5页 / 共21页
第6页 / 共21页
第7页 / 共21页
第8页 / 共21页
资料共21页,剩余部分请下载后查看
Bullet 物理引擎中文文档 英文文档正在更新中 详情查看 Wiki 和论坛(http://bulletphysics.com) © 2009 Erwin Coumans All Rights Reserved. 翻译:五行谦饼 Email:cqw1022@gmail.com
目录 1. 简介...........................................................................................................................................4 1.1. 类库描述.......................................................................................................................4 1.2. 2.74 版新添加的元素...................................................................................................4 1.3. 计划...............................................................................................................................4 1.4. 主要特性.......................................................................................................................4 1.5. 联系和支持...................................................................................................................4 2. 快速入门...................................................................................................................................4 3. 类库概述...................................................................................................................................5 3.1. 简介...............................................................................................................................5 3.2. 软件设计.......................................................................................................................5 3.3. 刚体物理管线...............................................................................................................5 3.4. 整体概貌.......................................................................................................................6 3.5. 基本数据类型和数学类库...........................................................................................6 3.6. 内存管理、分配和容器...............................................................................................7 3.7. 时间和性能分析...........................................................................................................8 3.8. 调试画图.......................................................................................................................8 4. Bullet 的碰撞检测....................................................................................................................8 4.1. 碰撞检测.......................................................................................................................8 4.2. 碰撞图形.......................................................................................................................9 4.3. 凸原始图元.................................................................................................................10 4.4. 复合图形.....................................................................................................................10 4.5. 凸核图形.....................................................................................................................10 4.6. 凹三角网格.................................................................................................................10 4.7. 凸分解.........................................................................................................................10 4.8. 高度场.........................................................................................................................10 4.9. Buttle 的静态平面(btStaticPlane)图形 .................................................................10 4.10. 碰撞图形缩放.........................................................................................................10 4.11. 碰撞边框.....................................................................................................................10 5. 碰撞过滤(选择碰撞).........................................................................................................11 5.1. 用掩码来过滤碰撞.....................................................................................................11 5.2. 用初测阶段的回调过滤器来过滤碰撞.....................................................................12 5.3. 用细测阶段的 NearCallBack 来过滤碰撞 ................................................................13 5.4. 从 btCollisionDispatcher 派生你自己的类................................................................13 6. 刚体动力学.............................................................................................................................13 6.1. 简介.............................................................................................................................13 6.2. 静态、动态和运动学上的刚体.................................................................................13 6.3. 质心在虚拟世界中的变换.........................................................................................14 6.4. 什么是运动状态(MotionStates)............................................................................14 6.5. 插值.............................................................................................................................14 6.6. 如何使用 MothonStates..............................................................................................14 6.7. DefaultMotionState 介绍............................................................................................15 6.8. Ogre3D 的 MotionState 示例 .....................................................................................15 6.9. 运动体.........................................................................................................................16
6.10. 仿真帧和插值帧.....................................................................................................16 7. 约束.........................................................................................................................................17 7.1. 点对点约束.................................................................................................................17 7.2. 铰链约束.....................................................................................................................17 7.3. 滑动约束.....................................................................................................................18 7.4. 锥扭约束.....................................................................................................................18 7.5. 通用 6 自由度约束.....................................................................................................18 8.1. Action 接口.................................................................................................................19 8.2. 车辆投射.....................................................................................................................19 8.3. 角色控制器.................................................................................................................19 9. 软体动力学.............................................................................................................................19 9.1. 简介.............................................................................................................................19 9.2. 从三角网格创建软体.................................................................................................19 9.3. 碰撞集群.....................................................................................................................20 9.4. 给软体添加作用力.....................................................................................................20 9.5. 软体约束.....................................................................................................................20
1. 简介 1.1. 类库描述 Bullet 物理引擎是开源的,专业的集刚体、软体和碰撞检测于一身的动力学类库。在 Zlib 授权下用户可以免费用于商业开发。 1.2. 2.74 版新添加的元素 1.3. 计划 1.4. 主要特性 1) 在 Zlib 授权中使用开源的 C++代码,可免费用于包括 PLAYSTATION 3, XBox 360, Wii, PC, Linux, Mac OSX and iPhone 平台的商业开发。 2) 包括射线和凸扫测试在内的离散和连续碰撞检测,可检测的碰撞物体形状包括凹凸 网格和所有的基本形状。 3) 快速和稳定的刚体动力约束和求解、动态车辆、人物控制和滑动器、铰链、普通的 6 自由度和针对碎布木偶的圆锥和扭曲约束。 4) 软体动力学方面可用于布料、绳子和双向变容的刚体,包括约束支持。 5) Maya 动态插件,集成 Blender 渲染器,支持 COLLADA 格式导入导出。 1.5. 联系和支持 1) 公开的帮助和回馈论坛 http://bulletphysics.com 2) PS3 合法的开发用户可以从 https://ps3.scedev.net/projects/spubullet 下载到用于 Cell SPU 的优化版本 2. 快速入门 1) 下载 Windows 平台的开发者可以从 http://bulletphysics.com 下载到 BulletZIPPED 格式的 源代码。 MacOSX、Linux 和其他平台的开发者可以下载到 GZIPPED TAR 格式的压缩包。 2) 生成 Bullet 能在所有的平台编译,并且包含了所有的依赖项。 Windows Visual Studio 平台的所有项目文件都在 Bullet/msvc 文件夹中,主要的解决 方案在 Bullet/msvc/8/wksbullet.sln 中。 3) 测试示例 可以尝试着以运行体验 Demos/AllBulletDemos 来作为学习使用 Bullet 的起点。Bullet 可以用于一下几个方面,完整刚体模拟,碰撞检测类库和(low level snippets such as GJK closest point calculation. )。 这 方 面 的 帮 助 支 持 可 以 在 Directories 下 的 doxygen documentation 中找到。 4) 集成到应用程序 仔细研究 CcdPhysicsDemo 项目中是如何创建一个 btDiscreteDynamicsWorld, btCollisionShape,btMotionState 和 btRigidBody。在动态世界中每帧调用 stepSimulation, 同时动态世界能转换你的图形对象。前提条件: #include “btBulletDynamicsCommon.h “ 添加头文件路径 Bullet/Src 添加类库 libbulletdynamics, libbulletcollision, libbulletmath 5) 只整合碰撞检测类库 Bullet 的碰撞检测也可以脱离 Dynamics/Extras 而单独使用,仔细研究起步的碰撞
接口示例,尤其是 CollisionWorld 这个课程。前提条件: #include “btBulletCollisionCommon.h” 添加路径 Bullet/src 添加类库 libbulletcollision, libbulletmath 6) 只用切片? 3. 类库概述 3.1. 简介 物理引擎的主要任务是碰撞检测,解决碰撞和其他约束,更新虚拟世界中所有物体在世 界中的变换。本章将会大体上介绍一下所有部分中共享的刚体动力学管道、基本数据类型和 数学类序 3.2. 软件设计 Bullet 是定制式和模块化开发的。开发者可以按如下方式自由使用 1) 只使用碰撞检测组件 2) 使用刚体动力学组件而不使用软体动力学组件 3) 以众多方式使用类库的一部分和扩展类库 4) 选个单精度或者双精度版本的类库 5) use a custom memory allocator, hook up own performance profiler or debug drawer 主要组件的机构如下: 3.3. 刚体物理管线 在介绍细节前,下图展示了在 Bullet 引擎动态管线中的主要的数据结构和计算阶段。管 线从左到右执行,以接受重力作用开始,位置整合结束,然后更新物体在世界中的变换。
整个物理管线的计算过程和它的数据结构在 Bullet 的动态世界中完全展现出来。当在动 态世界中执行 stepSimulation 时,所有上面的阶段都会执行。默认的动态世界实现是 btDiscreteDynamicsWorld。 Bullet 让开发者明确地选择动态世界的几个部分,如初测阶段(broadphase)碰撞检测, 细测阶段(narrowphase)碰撞检测(分配器)和约束解决程序。 3.4. 整体概貌 如果你想在你自己的 3D 程序中使用 Bullet,你最好按照 Bullet/Demos/HelloWorld 文件 夹中 HelloWorld 中的步骤来。简单地说: 创建一个 btDiscreteDynamicsWorld 或者 btSoftRigidDynamicsWorld 这写来自 btDynamicsWorld 的类提供了一个高水平管理动态物体和约束的接口,也实现 了每帧更新所有物体状态的功能。 创建 btRigidBody 然后添加到 btDynamicsWorld 要创建 btRigidBody 或者 btCollisionObject,你还要提供: 1) 质量,动态移动的物体质量为正数,静态物体则为 0; 2) 碰撞形状,想盒子、球体、圆锥体、三角网格、凸壳 3) 材料的属性如摩擦系数和 restitution 每帧更新仿真情况 stepSimulation 在动态世界中调用 stepSimulation,btDiscreteDynamicsWorld 会自动通过插值取代小仿 真 stepSimulation 来计算 timestep 变量,btDiscreteDynamicsWorld 使用内置的大小有 60Hertz 的 timestep 。stepSimulation 会 进 行 碰 撞 检 测 和 物 理 仿 真 , 通 过 调 用 btMotionState 的 setWorldTransform 来更新主动物体在世界中的变换。 下一章将提到更多关于碰撞检测和刚体运动学的内容。许许多多的细节在 Bullet/Demos 都展示出来。如果你不能找到某个函数,请去 http://bulletphysics.com 论坛查询。 3.5. 基本数据类型和数学类库 基本数据类型,内存管理和内存容器都保存在 Bullet/src/LinearMath 文件中。 btScalar btScalar 是 Bullet 中用来表示浮点数类型的词。为了能用当精度浮点数和双精度浮点数
编译类库,Bullet 在类库中使用 btScalar 数据类型代替浮点数类型。默认的 btScalar 是定义 为 float,用户可以在自己创建的系统中或者在 Bullet/src/LinearMath/btScalar.h 文件头部定义 BT_USE_DOUBLE_PRECISION 来更改 btScalar 表示的类型。 btVector3 3D 的位置和向量都可以用 btVector3 来表示。btVector3 有 3 个 btScalar 类型的数据 x,y,z 变量组成。实际上它也有第四个因为定向和 SIMD 兼容的原因没有使用的变量 w。很多操作 都很用在 btVector3 上,比如加法、减法和或获取向量长度。 btQuaternion 和 btMatrix3x3 btQuaternion 和 btMatrix3x3 都可以用来 3D 定向和旋转。 btTransform btTransform 是位置和方向的组合,点和方向可以用它进行坐标系转换。不允许进行裁 剪和放大缩小。 Bullet 采用的是右手系坐标轴,如图: btTransformUtil 和 btAabbUtil 提供常用的函数来进行转换和 AABBs 3.6. 内存管理、分配和容器 很多情况下数据是按 16 位分配的,比如在 CellSPU 中使用用 SIMD 或者 DMA 传输的时 候。Bullet 提供默认的内存分配器来处理内存分配,用户也可以自由使用其他的内存分配器。 Bullet 中使用以下方法来分配内存: btAlignedAlloc,允许指定分配内存的大小并且和分配内存 btAlignedFree,释放由 btAlignedAlloc 分配的内存 btAlignedAllocSetCustom 当用户的分配器不支持内存分配的时候调用 btAligneAllocSetCustomAligned 可以用来设置用户自己的内存分配器 用户可以选择下面的两个方法之一来覆盖默认的内存分配器: 用户可以使用下面的宏来确保结构和类对象内存的自动分配: 很多情况下我们都需要维护数组对象,开始的时候 Bullet 类库是用 STL std::vector 数据 ATTRIBUTE_ALIGNED16(type) variablename 创建一个 16 位的变量
结构给数组,但是为了可移植性和兼容性作者已经更换为使用自己的数组类了 供数组排序、快速排序、堆排序的接口。 btAlignedObjectArray 和 std::vector 非常相似,它使用对齐分配器来保证分配,它还提 为了使得微软的 Visual Studio 的调式器能监视到 btAlignedObjectArray 和 btVector3,请 按照 Bullet/msvc/autoexp_ext.txt 中的指示去做。 3.7. 时间和性能分析 为了找出性能瓶颈,Bullte 使用宏来进行分级性能测量 1)btClock 用微秒的精度来计算时间 2)BT_PROFILE(section_name)标识一个分析的开始 3)CProfileManager::dumpAll(); 将一个分级性能完全输出在控制台中,并调用后面的仿 真步骤 4)CProfileIterator 遍历性能分析树的类 当然也可以通过在 Bullet/src/LinearMath/btQuickProf.h 中定义#define BT_NO_PROFILE 1 来取消性能分析 3.8. 调试画图 视觉调试仿真数据结构相当有用,例如它可以让你验证物理仿真数据和图形数据的吻合 程度,也可以现实缩放比例问题,错误的约束帧和限制问题。 btIDebugDraw 是用于调试画图的接口,来源于用户实现的 drawLine 等其他方法。 4. Bullet 的碰撞检测 4.1. 碰撞检测 Bullet 的碰撞检测系统提供的算法和加速结构来进行最近点(距离和渗透)查询、射线 检测和凸扫面检测,主要的数据结构如下: btCollisionObject:包含对象在世界中的变换情况和碰撞图形的对象 btCollisionShape: 描述碰撞图形和碰撞对象,如盒子、球体、凸壳或者三角网格。一 个简单的碰撞图形可以在很多的碰撞对象中共享使用 btGhostObject:一个特殊的 btCollisionObject,用来进行局部快速碰撞查询 btCollisionWorld:保存所有的 btCollisionObject 并且提供接口来进行查询碰撞图形 在碰撞检测的初测阶段,Bullte 提供了基于重叠包围盒的加速结构去快速排除对象对 (pairs of object)。Bullte 有几个不同的初测阶段的加速结构可以好使用:
分享到:
收藏