Bullet2.8手册翻译(2)
来源:互联网 发布:windows.h x86 x64 编辑:程序博客网 时间:2024/06/05 17:15
基本数据类型和线性代数
基本数据结构、内存管理、容器在Bullet/src/LinearMath目录中
btScalar
btScalar对浮点数来说是一个给力的词。为了让库可以编译成单精度和双精度,我们在整个库中使用了btScalar。默认的btScalar是float的typedef。你可以在你的系统中或者Bullet/src/LinearMath/btScalar.h开始处定义BT_USE_DOUBLE_PRECISION来使用双精度。
btVector3
3D位置和向量可以使用btVector3来表示。BtVector3有3个维度x,y,z。然而由于齐次和SIMD(单指令多数据流)的兼容问题,第四个分量w没有使用。很多操作可以用在btVector3上,比如减和取向量的长度。
btQuaternion和btMatrix3x3
3D方位和旋转可以用btQuaternion或btMatrix3x3来表示
btTransform
btTransform是位置和方位的联合。它可以在从一个坐标系到另一个坐标系变换一个点和向量的时候使用。缩放和剪切不被允许。
Bullet使用右手系坐标系统
btTransformUtil,btAabbUtil为变换和AABB提供了公共的辅助函数。
内存管理、分配、容器
通常数据以16位分配很重要。比如当使用SIMD或DMA(直接内存读取)在SPUCell(协同处理单元)中传输时。Bullet提供默认的内存分配,开发者也可以提供自己的内存分配器。在Bullet中内存分配使用:
btAlignedAlloc,允许指定大小和分配
btAlignedFree,释放被btAlignedAlloc分配的内存
重写默认的内存分配器,你可以选择:
btAlignedAllocSetCustom可以被客制化但不支持分配
btAlignedAllocSetCustomAligned支持客制化并支持分配
使用以下宏可确保一个机构体或类可以自动被分配
ATTRIBUTE_ALIGNED16(type)variablename创建了16位分配的变量
通常很必要维护一个数列的对象。开始Bullet使用了STL的vector容器,但由于移动性和兼容性的原因,我们最后使用了自己的数列类。
BtAlignedObjectArray很类似与std::vector。它使用顺序分配器来分配内存。它有基于快速排序和堆排序的方法。
为了在MSVisual Studio Debugger中开启可视化btAlignedObjectArray和btVector3,请查阅Bullet/msvc/autoexp_ext.txt
时间和性能分析
为了定位性能瓶颈,Bullet使用宏来分层性能测量
btClock测量时间(微秒级精度)
BT_PROFILE(section_name)标志分析开始位置
CprofileManager::dumpAll()在控制台中清除一层性能输出。在模拟步进后调用。
CprofileIterator是一个可以迭代分析树的类
性能分析可以在Bullet/src/LinearMath/btQuickProf.h中使用#defineBT_NO_PROFILE 1关闭
调试绘制
可视化调试模拟数据是很有用的。比如,它可以让你确认物理模拟数据和图形数据是匹配的。而且缩放问题、不好的约束帧以及限制都会显示出来。
BtIDebugDraw是使用debugdrawing的接口类。继承它并实现虚函数'drawLine'以及其他函数。
使用setDebugDrawer方法调用你自己的调试绘制方法。
然后你可以通过如下代码开启调试绘制:
dynamicsWorld->getDebugDrawer()->setDebugMode(debugMode);
在每帧你可以调用world->debugDrawWorld()来调试绘制
下面是一些调试模式:
btIDebugDraw::DBG_DrawWireframe
btIDebugDraw::DBG_DrawAabb
btIDebugDraw::DBG_DrawConstraints
btIDebugDraw::DBG_DrawConstraintLimits
默认所有调试模式都是开启的,但当有很多物体时场景就会很混乱。你可以使用如下代码使指定物体的调试绘制失效:
intf = objects->getCollisionFlags();
ob->setCollisionFlags(f|btCollisionObject::CF_DISABLE_VISUALIZE_OBJECT);
5.Bullet碰撞检测
碰撞检测为最近点(距离和穿透)查询(同时也是射线和凸清扫测试)提供了算法和加速结构。主要的数据结构有:
btCollisionObject是有世界变换和碰撞形体的物体
btCollisionShape描述了碰撞物体的形体,比如方体、球体、凸壳或三角面体。一个碰撞形体可以被多个碰撞物体共享。
btGhostObject是个特殊的btCollisionObject,在快速的本地碰撞查询很有用
btCollisionWorld存储了所有的btCollisionObject并提供了查询的接口
宽相碰撞检测为快速排除基于包围盒(AABB)的物体对提供了加速结构。有好几种不同的宽相加速结构可以使用:
btDbvtBroadphase使用基于AABB树的快速动态包围体积层次
btAxisSweep3和bt32BitAxisSweep3实现了3D增长清扫和裁剪
btCudaBroadphase实现了GPU图形硬件下的快速统一网格
broadphase从配对缓存中增加或移除重叠的配对。开发者可以配对缓存的类型。
碰撞调度迭代器遍历每个配对,通过匹配各个类型物体的碰撞算法然后执行算法计算出联系点。
BtPersistentManifold是一个为给定配对物体存储联系点的缓存
碰撞形体
Bullet支持大量不同的碰撞形体,并且你可以添加你自己的形体。最好是使用你想要的碰撞形体来提高性能和碰撞质量,下面的图表可以帮助你做决定:
凸面元体
大多数元体形状都是以本地坐标原点为中心的
btBoxShape:使用半边长(边长的一半)来定义方体
btSphereShape:使用半径定义球体
btCapsuleShape:胶囊体以Y为对称轴。也有btCapsuleShapeX/Z
btCylinderShape:圆柱体以Y为对称轴。也有btCylinderShapeX/Z
btConeShape:圆锥体以Y为对称轴.也有btConeShapeX/Z.
btMultiSphereShape:多个球体的凸面体,可以创建胶囊体(使用2个球体)或其他凸面形体。
复合形体
通过使用btCompoundShape多个凸面体可以被联合成组合或复合形体。它是由许多凸面子部分组成的凹面形体,称为子形体。每个子形体有相对于btCompoundShape自己的本地变换偏移量
凸面壳形体
Bullet支持多种表示凸三角面体的方法。最简单的是创建btConvexHullShape然后传入顶点数组。有些时候图形物体有太多的顶点不能使用btConvexHullShape,那么试着减少顶点的数量。
凹三角面体
对于静态的世界,一个高效地表示静态三角面的方法是使用btBvhTriangleMeshShape。这个碰撞形体从btTriangleMesh或btStridingMeshInterface构建了内部加速结构。除了可以在运行时构建树结构,它还可以序列化到磁盘中。查看Demos/ConcaveDemo是如何保存和载入btOptimizedBvh树加速结构的。当你有多个三角面实体但每个缩放不一样时,你可以使用btScaledBvhTriangleMeshShape实例化btBvhTriangleMeshShape多次
凸面体分解
理想地,凹面体应该仅用于静态模型。否则的话,它的凸面壳应该用于btConvexHullShape.
如何单个凸面形体不够精细,多个凸面体可以被组合成复合形体,叫做btCompoundShape。凸面体分解可以用来把凹面体分解为多个凸面体。查看Demos/ConvexDecompositionDemo是如何自动分解凸面体的。
高度场
Bullet使用btHeightfieldTerrainShape提供扁平2D凹面地形的特殊支持。查看Demos/TerrainDemo来了解它的使用
btStaticPlaneShape
从名字可以知道,btStaticPlaneShape可以被用来表示无限平面或半空间。这个形体只能被用于静态、非移动物体上。这个形体主要被用来做演示用。
碰撞形体的缩放
一些碰撞形体可以本地缩放。使用btCollisionShape::setScaling(vector3)。非统一缩放(也就是每个轴都有缩放值)可以用于btBoxShape,btMultiSphereShape, btConvexShape,
btTriangleMeshShape。统一缩放,比如每个轴都用x值,可以用于btSphereShape。注意,可以创建只有一个球体的btMultiSphereShape来创建非统一缩放的球体。前面说过,btScaledBvhTriangleMeshShape允许使用不同的非统一缩放因子实例化btBvhTriangleMeshShape。BtUniformScalingShape允许实例化不同缩放的凸面形体以减少内存使用。
碰撞边缘
Bullet为碰撞形体使用小段碰撞边缘来提高碰撞检测的性能和可靠性。最好不要更改默认的碰撞边缘值,并且如果你没有使用正数,0边缘会引起麻烦。默认的碰撞边缘值是0.04,如果你的单位是以米(推荐)计算的也就是说是4厘米。
针对不同的碰撞形体,边缘值有不同的含义。通常,碰撞边缘会扩展物体。这会导致小的间隙。作为折衷,一些形体会从实际大小减去边缘值。比如,btBoxShape从半边长减去碰撞边缘值。对于btSphereShape,整个半径就是碰撞边缘,所以不会有间隙发生。不要为球体重写碰撞边缘值!对于凸面壳体、圆柱体和椎体,边缘被扩展到了物体上,所以存在间隙,除非你调整图形网格体或碰撞大小。对于凸面壳物体,有一个方法可以移除边缘产生的间隙,
那就是缩进物体。高级用法参考Demos/BspDemo
碰撞矩阵
对于每个配对形体类型,通过使用调度器Bullet会调度特定的碰撞算法。默认整个矩阵使用如下算法填充。注意凸面体代表凸多面体、圆柱体、椎体、胶囊体以及其他GJK兼容的元体。GJK代表Gilbert,Johnson和Keerthi,他们是发明凸面距离计算算法的人。它可以融合EPA来计算穿透深度计算。EPA代表ExpandingPolythope Algorithm,由Ginovan den Bergen发明。Bullet有自己的GJK和EPA实现。
注册客制化碰撞检测形体和算法
用户可以注册客制化的碰撞检测算法并通过使用btDispatcher::registerCollisionAlgorithm.重写任何碰撞矩阵的入口。查看Demos/UserCollisionAlgorithm,里面有注册球体和球体的碰撞算法的演示
- Bullet2.8手册翻译(2)
- ICEFaces 开发手册翻译 (2)
- PHP手册翻译日记[2]
- bash手册翻译#2 定义
- 我翻译的ServerXMLHttp中文手册(8)
- GNU Autoconf手册翻译(2)
- 我翻译的ServerXMLHttp中文手册(2)
- 最近翻译的ISAPI_Rewrite中文手册2
- 最近翻译的ISAPI_Rewrite中文手册2
- 翻译ecos 手册----HAL架构2
- Xdebug 2中文手册翻译CHM版
- llvm之IR手册翻译(2)
- Shodan完全手册部分翻译(2)
- mod_python官方手册翻译
- [翻译]JConsole手册
- PhysX官方手册翻译
- LDAP管理员手册翻译
- privoxy3.0.17手册翻译
- 命令行添加删除tomcat服务
- chilkat破解
- Web开发中20个很有用的CSS库
- android -- 蓝牙 bluetooth (一) 入门
- 电视端屏幕适配
- Bullet2.8手册翻译(2)
- 适合自学的C语言基础视频教程
- 浅谈Java中的hashcode方法
- 在Ubuntu上安装Tegra Android Development Pack,一键安装ubuntu 上的eclipse opencv4android的开发环境
- SparseArray<E>来替代HashMap,获取更好性能
- Linux查看每个CPU负载及进程IO
- Intent复习回顾
- 关于IOS滚动视图
- JVM类加载机制