前言:最近在接触OpenGl和DX11的时候,顺便学习了Bullet这个3D物理引擎的基本使用,记录一下。
|BulletPhysics介绍
BulletPhysics是一个跨平台的开源物理引擎,也是三大主流3D物理引擎之一,支持三维碰撞检测、柔体动力学和刚体动力学,多用于游戏开发和电影制作中。(GTA5,荒野大嫖客也使用了这个物理引擎)
为了更容易使用物理引擎,我们必须掌握它里面的几个基本概念。
物理世界:
用来模拟各种刚体的运动。
物理世界有个重要的函数——stepSimulation模拟步长函数,它通过传入的时间大小(float deltaTime),
来给世界里所有刚体进行一段时间(deltaTime长的时间)流逝的模拟。
刚体:
参与物理模拟的物体,例如一个球体,一个长方体,或者由多个复杂形状组合成的物体。
包含形状,摩擦系数,阻尼系数,弹性系数等属性。
基本使用原理:
每帧调用物理世界的模拟步长函数,来使物理世界中模拟时间流逝。
每次模拟之后,每个刚体都会更新自己的位置及旋转角度。
然后在模拟之后根据每个刚体更新后的相应位置及旋转角度,来用图形表现方法来绘制表现。
|1、下载Bullet库,编译,配置项目
可参考该篇博客: http://www.cnblogs.com/liangliangh/p/3575590.html
|2、初始化物理世界
Broadphase(粗测阶段):
我们需要提前设置好世界大小和最大刚体数等参数传递用于构造BroadPhase。
BroadPhase的作用是在碰撞检测的初测阶段,通过基于重叠包围盒的加速结构的三维扫描和裁剪,快速并粗略筛选掉许多不会发生碰撞的对象对。
tip:另外还有NarrowPhase(细测阶段),只不过它不需要参数初始化,它负责碰撞检测的最后一步测试,也是详细的碰撞测试,比较耗费性能,所以才需要一个粗测阶段粗略过滤掉大部分不会碰撞的形状对。
CollisionConfiguration(碰撞配置):
则是规定哪些物体能和哪些物体碰撞的设置(例如一些多人射击游戏中,队友之间不会发生碰撞,但是和其他物体都能发生碰撞)
默认值是均能互相发生碰撞,本文使用了默认值。
创建并初始化物理世界代码:
//设置世界的空间大小,限定刚体运动的空间范围 btVector3 worldAabbMin(-10000, -10000, -10000); btVector3 worldAabbMax(10000, 10000, 10000); //设置最大刚体数 int maxProxies = 1024; //利用以上配置创建粗测阶段所需参数 btAxisSweep3* broadphase = new btAxisSweep3(worldAabbMin, worldAabbMax, maxProxies); //创建好碰撞配置 btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration(); btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration); //