Bullet2.8手册翻译(2)

来源:互联网 发布:windows.h x86 x64 编辑:程序博客网 时间:2024/06/05 17:15

基本数据类型和线性代数


基本数据结构、内存管理、容器在Bullet/src/LinearMath目录中

  • btScalar

btScalar对浮点数来说是一个给力的词。为了让库可以编译成单精度和双精度,我们在整个库中使用了btScalar。默认的btScalarfloattypedef。你可以在你的系统中或者Bullet/src/LinearMath/btScalar.h开始处定义BT_USE_DOUBLE_PRECISION来使用双精度。


  • btVector3

3D位置和向量可以使用btVector3来表示。BtVector33个维度x,y,z。然而由于齐次和SIMD(单指令多数据流)的兼容问题,第四个分量w没有使用。很多操作可以用在btVector3上,比如减和取向量的长度。


  • btQuaternionbtMatrix3x3

3D方位和旋转可以用btQuaternionbtMatrix3x3来表示


  • btTransform

btTransform是位置和方位的联合。它可以在从一个坐标系到另一个坐标系变换一个点和向量的时候使用。缩放和剪切不被允许。


Bullet使用右手系坐标系统



btTransformUtil,btAabbUtil为变换和AABB提供了公共的辅助函数。

内存管理、分配、容器

通常数据以16位分配很重要。比如当使用SIMDDMA(直接内存读取)在SPUCell(协同处理单元)中传输时。Bullet提供默认的内存分配,开发者也可以提供自己的内存分配器。在Bullet中内存分配使用:

  • btAlignedAlloc,允许指定大小和分配

  • btAlignedFree,释放被btAlignedAlloc分配的内存


重写默认的内存分配器,你可以选择:

  • btAlignedAllocSetCustom可以被客制化但不支持分配

  • btAlignedAllocSetCustomAligned支持客制化并支持分配


使用以下宏可确保一个机构体或类可以自动被分配

  • ATTRIBUTE_ALIGNED16(type)variablename创建了16位分配的变量


通常很必要维护一个数列的对象。开始Bullet使用了STLvector容器,但由于移动性和兼容性的原因,我们最后使用了自己的数列类。


  • BtAlignedObjectArray很类似与std::vector。它使用顺序分配器来分配内存。它有基于快速排序和堆排序的方法。


为了在MSVisual Studio Debugger中开启可视化btAlignedObjectArraybtVector3,请查阅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树的快速动态包围体积层次

  • btAxisSweep3bt32BitAxisSweep3实现了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。这个碰撞形体从btTriangleMeshbtStridingMeshInterface构建了内部加速结构。除了可以在运行时构建树结构,它还可以序列化到磁盘中。查看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允许使用不同的非统一缩放因子实例化btBvhTriangleMeshShapeBtUniformScalingShape允许实例化不同缩放的凸面形体以减少内存使用。


碰撞边缘


Bullet为碰撞形体使用小段碰撞边缘来提高碰撞检测的性能和可靠性。最好不要更改默认的碰撞边缘值,并且如果你没有使用正数,0边缘会引起麻烦。默认的碰撞边缘值是0.04,如果你的单位是以米(推荐)计算的也就是说是4厘米。

针对不同的碰撞形体,边缘值有不同的含义。通常,碰撞边缘会扩展物体。这会导致小的间隙。作为折衷,一些形体会从实际大小减去边缘值。比如,btBoxShape从半边长减去碰撞边缘值。对于btSphereShape,整个半径就是碰撞边缘,所以不会有间隙发生。不要为球体重写碰撞边缘值!对于凸面壳体、圆柱体和椎体,边缘被扩展到了物体上,所以存在间隙,除非你调整图形网格体或碰撞大小。对于凸面壳物体,有一个方法可以移除边缘产生的间隙,

那就是缩进物体。高级用法参考Demos/BspDemo


碰撞矩阵


对于每个配对形体类型,通过使用调度器Bullet会调度特定的碰撞算法。默认整个矩阵使用如下算法填充。注意凸面体代表凸多面体、圆柱体、椎体、胶囊体以及其他GJK兼容的元体。GJK代表Gilbert,JohnsonKeerthi,他们是发明凸面距离计算算法的人。它可以融合EPA来计算穿透深度计算。EPA代表ExpandingPolythope Algorithm,由Ginovan den Bergen发明。Bullet有自己的GJKEPA实现。




注册客制化碰撞检测形体和算法


用户可以注册客制化的碰撞检测算法并通过使用btDispatcher::registerCollisionAlgorithm.重写任何碰撞矩阵的入口。查看Demos/UserCollisionAlgorithm,里面有注册球体和球体的碰撞算法的演示

0 0
原创粉丝点击