bullet物理引擎教程 hello world

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

bullet物理引擎教程 hello world【译】

2008年10月28日星期二 09:51

教程: Hello World 实例

水平原因不足之处还望指出

更多信息请关注物理引擎中文社区

欢迎加qq群 52821727讨论更多关于Bullet的东西

这篇文章里我们将尽可能简单的向你展示怎么使用Bullet, 怎样初始化Bullet, 设置一个动力学世界, 还有一个球落向地表这个对鉴别你的build是否成功非常有用并且也能够让你快速的学习到Bullet的API. 首先,我们假设你的Bullet已经正确安装并且正确设置了Bullet的include路径(例如.

/usr/local/include/bullet) 确保能连接到正确的lib. 否则请参阅Installation安装. 如果你用的是gcc来编译,请确保你的静态库反序,就是说. dynamics, collision, math.

在本页底部给出了所有的源代码

[edit]

初始化程序

以一个标准的hello world程序开始:

#include

int main ()

{

std::cout << "Hello World!" << std::endl;

return 0;

}

[edit]

创建世界

现在我们要添加一个子弹(Bullet)模拟. 首先写入以下语句:

#include

我们想把btDiscreteDynamicsWorld 实例化但是在做此之前我们还需要解决一

些其他事情. 对于一个“hello world”例子来说它太复杂我们并不需要. 但是,为了能更符合我们自己的工程, 他们可以用来微调(fine-tuning)模拟环境.

我们需要指出使用什么样的Broadphase algorithm(宽相算法). 选择什么样的泛型算法很总要,如果有许多刚体在绘制场景里, since it has to somehow check every pair which when implemented naively(天真) is an O(n^2) problem.

宽相(broadphase)使用传统的近似物体形状并且被称之为代理.我们需要提前告诉子弹最大的代理数, 所以才能很好的分配内存避免浪费. 下面就是世界里任何时候的最大刚体数.

int maxProxies = 1024;

一些 broadphases 使用特殊的结构要求世界的尺度提前被告知, 就像我们现在遇到的情况一样. 该broadphase可能开始严重故障,如果离开这个物体体积. 因为 the AxisSweep broadphase quantizes 空间基于我们使用的整个空间的大小, 您想这差不多等于你的世界.

使它小于你的世界将导致重大问题, 使它大于你的世界将导致低劣的性能.这是你程序调整的一个简单部分, 所以为了确保数字的正确多花点时间也不防.

在这个例子中,世界从起点开始延伸10公里远。

.

btVector3 worldAabbMin(-10000,-10000,-10000);

btVector3 worldAabbMax(10000,10000,10000);

这个broadphase是我们将要使用的, 这个执行的是扫描和裁剪, 这里可以看到更多解释Broadphase .

btAxisSweep3* broadphase = new

btAxisSweep3(worldAabbMin,worldAabbMax,maxProxies);

该broadphase是一个极好的空间以消除不应碰撞的成队物体. 这是为了提高运行效率.

您可以使用碰撞调度注册一个回调,过滤器重置broadphase代理,使碰撞系统不处理系统的其它无用部分

. 更多信息请看Collision Things.

碰撞配置可以让你微调算法用于全部(而不是不是broadphase )碰撞检测。这

个方面现在还属于研究阶段

!

btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();

btCollisionDispatcher* dispatcher = new

btCollisionDispatcher(collisionConfiguration);

我们还需要一个"solver". 这是什么原因导致物体进行互动得当,考虑到重力,游戏逻辑等的影响,碰撞,会被制约.

它工作的很好,只要你不把它推向极端,对于在任何高性能仿真都有瓶颈

. 有一些相似的可以线程模型:.

btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver;

终于我们可以初始化了世界了:

btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase,solver,collisionConfigu ration);

很明显我们把重力方向设置成了Y轴的负方向,即Y轴是像上的

dynamicsWorld->setGravity(btVector3(0,-10,0));

子弹的政策是“谁分配,也删除” 记住,必须符合这样的结果

在main()后记的删除.

我们提供了一个通用的结果. 代码如下:

#include

#include

int main () {

std::cout << "Hello World!" << std::endl;

// Build the broadphase

int maxProxies = 1024;

btVector3 worldAabbMin(-10000,-10000,-10000);

btVector3 worldAabbMax(10000,10000,10000);

相关文档
最新文档