Bullet教程:HelloWorld实例
欢迎加 52821727 讨论更多关于Bullet的东西
这篇⽂章⾥我们将尽可能简单的向你展⽰怎么使⽤Bullet, 怎样初始化Bullet, 设置⼀个动⼒学世界, 还有⼀个球落向地表 这个对鉴别你的build是否成功⾮常有⽤并且也能够让你快速的学习到Bullet的API. ⾸先,我们假设你的Bullet已经正确安装并且正确设置了Bullet的include路径(例如. /usr/local/include/bullet) 确保能连接到正确的lib. 否则请参阅. 如果你⽤的是gcc来编译,请确保你的静态库反序,就是说. dynamics, collision, math.
初始化程序
以⼀个标准的hello world程序开始:
[cpp]
旋风少女第二季大结局1. #include <iostream>
2. int main ()
3. {
4. std::cout << "Hello World!" << std::endl;
5. return 0;
6. }
#include <iostream>
int main ()去医院英语
{
std::cout << "Hello World!" << std::endl;
return 0;
}
创建世界
现在我们要添加⼀个⼦弹(Bullet)模拟. ⾸先写⼊以下语句:
#include <btBulletDynamicsCommon.h>
我们想把btDiscreteDynamicsWorld 实例化但是在做此之前我们还需要解决⼀些其他事情. 对于⼀个“hello world”例⼦来说它太复杂我们并不需要. 但是,为了能更符合我们⾃⼰的⼯程, 他们可以⽤来微调(fine-tuning)模拟环境.
我们需要指出使⽤什么样的 algorithm(宽相算法). 选择什么样的泛型算法很总要,如果有许多刚体在绘制场景⾥, since it has to somehow check every pair which when implemented naively(天真) is an O(n^2) problem.
宽相(broadpha)使⽤ 传统的近似物体形状并且被称之为代理.我们需要提前告诉⼦弹最⼤的代理数, 所以才能很好的分配内存避免浪费.下⾯就是世界⾥任何时候的最⼤刚体数.
int maxProxies = 1024;
⼀些 broadphas 使⽤特殊的结构要求世界的尺度提前被告知, 就像我们现在遇到的情况⼀样. 该broadpha可能开始严重故障,如果离开这个物体体积. 因为 the AxisSweep broadpha quantizes 空间基于我们使⽤的整个空间的⼤⼩, 您想这差不多等于你的世界.
使它⼩于你的世界将导致重⼤问题, 使它⼤于你的世界将导致低劣的性能.这是你程序调整的⼀个简单
部分, 所以为了确保数字的正确多花点时间也不防.
在这个例⼦中,世界从起点开始延伸10公⾥远。
btVector3 worldAabbMin(-10000,-10000,-10000);
btVector3 worldAabbMax(10000,10000,10000);
这个broadpha是我们将要使⽤的, 这个执⾏的是扫描和裁剪, 这⾥可以看到更多解释 .
btAxisSweep3* broadpha = new btAxisSweep3(worldAabbMin,worldAabbMax,maxProxies);
该broadpha是⼀个极好的空间以消除不应碰撞的成队物体. 这是为了提⾼运⾏效率.
您可以使⽤碰撞调度注册⼀个回调,过滤器重置broadpha代理,使碰撞系统不处理系统的其它⽆⽤部分
. 更多信息请看 .
碰撞配置可以让你微调算法⽤于全部(⽽不是不是broadpha )碰撞检测。这个⽅⾯现在还属于研究阶段
btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();
btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);
我们还需要⼀个"solver". 这是什么原因导致物体进⾏互动得当,考虑到重⼒,游戏逻辑等的影响,碰撞,会被制约。
它⼯作的很好,只要你不把它推向极端,对于在任何⾼性能仿真都有瓶颈有⼀些相似的可以线程模型:
btSequentialImpulConstraintSolver* solver = new btSequentialImpulConstraintSolver;
终于我们可以初始化了世界了:
btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadpha,solver,collisionConfiguration);
很明显我们把重⼒⽅向设置成了Y轴的负⽅向,即Y轴是像上的
1. btVector3 worldAabbMin(-10000,-10000,-10000);
年会贺词
2. btVector3 worldAabbMax(10000,10000,10000);
[cpp]
1. btAxisSweep3* broadpha = new btAxisSweep3(worldAabbMin,worldAabbMax,maxProxies);
[cpp]
1. btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();
2. btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);
[cpp]
1.
btSequentialImpulConstraintSolver* solver = new btSequentialImpulConstraintSolver;
[cpp]
1. btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadpha,solver,collisionConfigurati
1. dynamicsWorld->tGravity(btVector3(0,-10,0)); dynamicsWorld->tGravity(btVector3(0,-10,0));
⼦弹的政策是“谁分配,也删除” 记住,必须符合这样的结果在main()后记的删除.
我们提供了⼀个通⽤的结果. 代码如下:
1. #include <btBulletDynamicsCommon.h>
2. #include <iostream>
3.
4. int main () {
5. std::cout << "Hello World!" << std::endl;
6.
摩西的故事7. // Build the broadpha
就这样长大了8. int maxProxies = 1024;
9. btVector3 worldAabbMin(-10000,-10000,-10000);
10. btVector3 worldAabbMax(10000,10000,10000);
11. btAxisSweep3* broadpha = new btAxisSweep3(worldAabbMin,worldAabbMax,maxProxies);
12.
13. // 设置好碰撞属性 和调度
14. btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();太阳龟
15. btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);
16.
17. // 实际上的物理模拟器
18. btSequentialImpulConstraintSolver* solver = new btSequentialImpulConstraintSolver;
19.
20. // 世界.
21. btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadpha,solver,collisionConfigur
22.
23. // 这⾥做⼀些你想做的事
24.
25. // 作为⼀个好的编程习惯 做好删除⼯作
26. delete dynamicsWorld;
27. delete solver;
感恩母亲的诗句古诗28. delete dispatcher;
29. delete collisionConfiguration;
30. delete broadpha;
31.
32. return 0;
33. }
#include <btBulletDynamicsCommon.h>
#include <iostream>
int main () {
std::cout << "Hello World!" << std::endl;
// Build the broadpha
int maxProxies = 1024;
btVector3 worldAabbMin(-10000,-10000,-10000);
btVector3 worldAabbMax(10000,10000,10000);
btAxisSweep3* broadpha = new btAxisSweep3(worldAabbMin,worldAabbMax,maxProxies);
// 设置好碰撞属性和调度
btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();
btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);
// 实际上的物理模拟器
btSequentialImpulConstraintSolver* solver = new btSequentialImpulConstraintSolver;
// 世界.
btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadpha,solver,collisionConfiguration);
// 这⾥做⼀些你想做的事
杨绛名言
// 作为⼀个好的编程习惯做好删除⼯作
delete dynamicsWorld;
delete solver;
delete dispatcher;
delete collisionConfiguration;
delete broadpha;
return 0;
}
碰撞包围体
我们将创造⼀个接地平⾯[静态刚体] ,和⼀个球体,将属于在地上[动态刚体] 。每个刚体需要参考碰撞包围体. 碰撞包围体只解决碰撞检测问题, 因此没有质量,惯性,恢复原状等概念. 如果您有许多代理,使⽤相同的碰撞形状[例如每飞船模拟是⼀个5单元半径范围]。这是个好做法,只有⼀个⼦弹形状
的碰撞,并分享它在所有这些代理. 但是我们这⾥的两个刚体形状都不⼀样,所以他们需要各⾃的shape.
地⾯通常是向上的并且⾥原始点1⽶的样⼦. 地⾯会和远点交叉,但⼦弹不允许这样做,
因此,我们将抵消它的1⽶和⽤来弥补,当我们把刚体设置好以后。
[cpp]
1. btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),1);
btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),1);
我们将让它从天上掉下来,它是⼀个球体,半径为1⽶.
[cpp]
1. btCollisionShape* fallShape = new btSphereShape(1);