bullet物理引擎教程 hello world
- 格式:docx
- 大小:30.14 KB
- 文档页数:10
使用Pygame实现简单的物理引擎Pygame是一款基于Python的开源游戏开发库,可以用于创建2D游戏和图形应用程序。
虽然Pygame并没有提供内置的物理引擎,但我们可以使用其提供的功能来实现一个简单的物理引擎。
在本文中,我们将介绍如何使用Pygame来模拟物理效果,包括重力、碰撞和弹力等。
首先,我们需要准备好Pygame库。
可以通过在终端中运行以下命令来安装Pygame:```pip install pygame```安装完成后,我们可以开始编写代码。
首先,我们需要导入Pygame库并初始化。
在主函数中,我们可以创建一个窗口来显示游戏界面,并设置窗口的大小和标题。
```pythonimport pygamedef main():pygame.init()width = 800height = 600screen = pygame.display.set_mode((width, height)) pygame.display.set_caption("简单物理引擎")#游戏循环running = Truewhile running:for event in pygame.event.get():if event.type == pygame.QUIT:running = Falsepygame.quit()if __name__ == "__main__":main()```这里我们定义了窗口大小为800x600,并且使用一个循环来处理游戏事件。
在每次事件循环中,我们检查是否有退出事件(点击窗口的关闭按钮),如果有则将`running`设置为False,退出游戏。
接下来,我们可以定义一个简单的物体类来表示游戏中的物体。
每个物体都有一个位置、速度和加速度。
我们还可以为物体添加重力和碰撞效果。
```pythonclass GameObject:def __init__(self, x, y, width, height, color):self.x = xself.y = yself.width = widthself.height = heightself.color = colorself.velocity = 0self.acceleration = 0self.gravity = 0.5def update(self):self.velocity += self.accelerationself.y += self.velocityif self.y + self.height >= height:self.y = height - self.heightself.velocity = -self.velocity * 0.8def draw(self):pygame.draw.rect(screen, self.color, (self.x, self.y, self.width, self.height))```在这个类中,我们首先定义了物体的位置(x, y),宽度和高度(width, height)以及颜色(color)。
Bullet3⼊门Bullet3 ⼊门Bullet3 简介是⼀个开源免费(Zlib)的物理引擎,⼴泛应⽤于游戏、动画、电影和机器⼈仿真等领域。
Blender、Maya、Unity3D 插件、gazebo、V-rep、Roboschool 等都使⽤了这个物理引擎。
其他的物理引擎还有、Havok 等。
物理引擎的主要功能1. 连续和离散物体的碰撞检测,物体形状包括⽹格和基本⼏何体的。
2. 快速稳定的刚体约束求解器,包括车辆动⼒学、⼈体、直线约束、铰链约束等等。
3. 软体物体动⼒学,包括⾐服、绳⼦、可变形体等,同时⽀持约束。
4. ⾃定义格式.bullet,⽀持 URDF 格式,和 bsp 格式。
整体架构呈分层结构,每个模块都可以单独拿来使⽤。
下图展⽰了引擎运⾏的流程图引擎从左向右执⾏,从施加重⼒开始,到位置改变,坐标系变换结束。
数据结构⼏何模型形状: shape 类抽象出了⼏何形状的特征, ⽐如长⽅体, 球, 四⾯体,凸包. bullet 中的形状类型⾮常丰富,有⼏⼗种之多. 由于⼏何形状的特征是和具体对象⽆关的,所以⼀种形状只要维持⼀个实例即可, 所有映射到该 shape 的对象可以共享这个实例.包围体(BVH): 采⽤的是 AABB, ⼀般有 AABB, OBB, K-Dop, Convex Hull.空间划分:主要是 Dynamic AABB Tree (刚体,曼哈顿距离) 和 Sweep and Prune (soft body)碰撞检测算法:GJK ,sweep prune,box2box, shpere2shpere 等接触点:约束: 六种约束类型,见⽂档motion state: 对渲染引擎提供的⼀个接⼝, 便于渲染引擎更新渲染对象的位置完成⼏何基础构建后,在⼀个场景(collision world)内加⼊各个被模拟的物理对象(collision object)每个物理对象被映射到对映的 shape, 空间划分数据结构节点. 如果再在这些对象⾝上附加例如速度,⾓速度,转动惯量等物理特征,就演化为 rigid object. Soft body 情况复杂⼀些, ⼀般由 mesh 构成物理仿真Broad Phase: ⾸先进⾏远距碰撞检测, 利⽤空间分割结构,如果不在同⼀个⼦树内的物体不可能相交不⽤去计算, 在同⼀个⼦树内的物体被放⼊ overlapping pair, 再进⼀步由对应的算法来计算出接触点等信息. 采⽤哪⼀种算法取决于算法配置矩阵(见 bullet ⼿册)Narrow Phase: 根据 overlapping pairs 的分布情况计算出碰撞对象岛(collision Island).⽽后依次对各个岛进⾏约束分析. 亦即碰撞响应. Bullet 采⽤的是 Sequential Impulse ConstraintSolver( ) 约束分析是⼀个⾮常复杂的话题,涉及到 PGS 算法的简化,后⽂会有介绍. 约束分析会根据所设定的约束类型来计算碰撞后各个对象所对应的位置,速度等,然后与渲染引擎同步 motion state.碰撞响应相关资料⽹页1. Bullet HelloWorld2. 不完全指南3. ⼯作流程简析,推荐了相应书⽬4. 内容⽐较多的介绍5. 创建世界(场景)及常见函数6. 常见物体和初始化7. 物体碰撞与属性简单实例8. 三种碰撞检测及实现9. 刚体与软体的碰撞10. Bullet 约束的使⽤11. Bullet 通过⾼度图数据创建 3D 地形12. Bullet 3D Max 插件13. 在 OpenGL 中的应⽤教材包含了各种物理引擎的资料快速⼊门教程《游戏物理引擎开发》: 讲述了物理引擎的设计⽅法,实现了⼀个简单的物理引擎 cyclone.物理建模和仿真的⼤学课程,只有演⽰⽂稿和参考⽂献《Learning Game Physics with Bullet Physics and OpenGL》视频在 Maya 中使⽤ Bullet 引擎如何从头实现⼀个物理引擎Date: [2018-10-25 Thu 14:05]Author: fhlnCreated: 2018-10-25 Thu 19:02。
Bullet核⼼类介绍(Bullet2.82HelloWorld程序及其详解,附程序代码)实验平台:win7,VS2010先上结果截图:⽂章最后附有⽣成该图的程序。
1. 刚体模拟原理Bullet作为⼀个物理引擎,其任务就是刚体模拟(还有可变形体模拟)。
刚体模拟,就是要计算预测物体的运动,举个例⼦,我抛⼀块砖头,砖头砸在地上翻了⼏圈最后停下来,刚体模拟就是要⽤计算机把这⼀切虚拟化(给定砖头形状质量等属性及砖头初始运动状态,还要给定地⾯的信息,预测砖头未来任意时刻状态)。
刚体模拟的主要理论基础是⽜顿⼒学(⾼中物理⽔平)。
可以想见,如果刚体之间没有碰撞,刚体模拟很简单,就是⾃由落体计算。
复杂性存在于碰撞的处理,⽽处理碰撞⾸先要检测到碰撞。
碰撞检测最基本的⽅法就是两两刚体测试看其是否碰撞,这是不能满⾜效率要求的,因为每个刚体可能形状很复杂。
为了进⾏快速碰撞检测,⼀般使⽤包围盒(Bounding Box,如AABB:Axis-Aligned Bounding Box、OBB:Oriented Bounding Box)技术,包围盒是⼀种简单⼏何体(长⽅体或球),刚体完全被其包含在⾥边。
⼀般将碰撞检测分为两步:1. Broadphase Collision Detection:两两刚体,测试其包围盒是否重叠(即包围盒的碰撞检测,因为包围盒是⼀种简单⼏何体,存在快速算法处理包围盒的碰撞检测)。
2. Narrowphase collision detection (dispatcher):对于Broadphase检测出的刚体对,进⾏刚体碰撞检测,任务为⼆,检测刚体之间是否碰撞,如果碰撞,计算出接触点(contact point)。
这样,我们总结出,物理引擎要进⾏刚体模拟所要做的事(每⼀时间步要做的事):1. Broadphase Collision Detection;2. Narrowphase collision detection;3. 碰撞处理,由接触点及刚体属性根据物理⽅程计算刚体的新状态(新速度等);4. 更新刚体位置并输出给3D图形接⼝,以显⽰动画。
Bullet学习笔记之软体仿真流程(⼀)下⾯梳理软体对象的仿真过程。
在例程 VolumetricDeformable 中,使⽤了btDeformableMultiBodyDynamicsWrold类以及btDeformableBodySolver类,因此,该仿真流程即为对btDeformableMultiBodyDynamicsWrold和btDeformableBodySolver的梳理。
1、仿真主流程仿真主要流程,由btDeformableMultiBodyDynamicsWrold类控制,细节部分则由btDeformableBodySolver类控制。
主要有以下⼏个步骤:初始化⼯作计算⽆约束运动碰撞检测求解约束位移积分(1)初始化⼯作细节略(2)计算⽆约束运动这部分内容由函数btDeformableRigidDynamicsWorld::predictUnconstraintMotion(..)完成。
是计算场景中的物体(软体/刚体)仅在重⼒和弹性⼒作⽤下的运动,不考虑约束、接触等。
具体来说,这部分⼯作包含了以下内容:btDiscreteDynamicsWorld::predictUnconstraintMotion(timeStep);btDeformableBodySolver::predictMotion(timeStep);在btDeformableBodySolver::predictMotion(..)中,计算软体在重⼒、弹性⼒作⽤下的运动,得到了⼀个临时位置(a temporary position),存放在node.m_q中,在此后的仿真步骤中,是基于这个临时位置做碰撞检测。
具体内容参考⽂章:(3) 碰撞检测这部分内容由函数btDiscreteDynamicsWorld::performDiscreteCollisionDetection()和函数btDeformableRigidDynamicsWorld::softBodySelfCollision()完成。
第一步,当然是搜索bulletphysics,经过筛选,会得到如下有用信息:百度百科:开源物理引擎一堆套话,忽略不计;Bullet官方:/wordpress/balabala 挑选有用的。
左上角特别小的icon第二步,当然是Download。
选择尽量比较新的版本,当然如果有特殊需求,选择自己需要的版本即可。
这个是我下载的版本。
打开看看list:自己觉得英文比较好的话,就可以开始看Bullet_User_Manual.pdf。
目录简单介绍:Demos 演示例子。
Extras 兼容库Glut 界面渲染库Lib 暂时是空的Msvc 各种显卡和VS版本的项目文件Src 源码UniteTests 测试用例子这个版本是已经编译好的Window版本。
接着进入Msvc 目录选择自己合适的项目打开,因为我用的是VS2010,所以选择进入该文件夹,打开解决方案.sln. 即可进入学习。
当然还有获得代码的SVN checkout途径:/svn/trunk(this is read only)此版本需要配合cmake,编译使用,checkout完毕以后,需要安装cmake详细参见/mediawiki-1.5.8/index.php/Installation图文教程/mediawiki-1.5.8/index.php/Creating_a_project_from_scratch Cmake 图标在线文档:/Bullet/BulletFull/index.html国人写的入门教程:/vagrxie/article/details/5952310正题:BulletPhysics DemosApp_BasicDemo1.入口函数,不解释。
int main(int argc,char** argv){BasicDemo ccdDemo; 建立了一个类ccdDemo.initPhysics();初始化ccdDemo.getDynamicsWorld()->setDebugDrawer(&sDebugDraw);#ifdef CHECK_MEMORY_LEAKSccdDemo.exitPhysics();#elsereturn glutmain(argc, argv,1024,600,"Bullet Physics Demo. ",&ccdDemo);//gultmain 函数界面入口;注册回调,按键响应等功能#endif//default glut doesn't return from mainloopreturn 0;}接着来看 BasicDemo.h#define PlatformDemoApplication GlutDemoApplicationclass BasicDemo : public PlatformDemoApplication{BasicDemo(){}virtual ~BasicDemo(){exitPhysics();}//万恶的少年,你发现了,框架函数void initPhysics();void exitPhysics();virtual void clientMoveAndDisplay();virtual void displayCallback();virtual void clientResetScene();//所有demo的基类函数static DemoApplication* Create(){BasicDemo* demo = new BasicDemo;demo->myinit();demo->initPhysics();return demo;}}所以当你需要了解这个流程的时候请参看DemoApplication类。
【Unity3D⼊门教程】物理引擎之碰撞解析Unity3D内置物理引擎,可以模拟物理效果。
典型的⼀个物理效果就是碰撞。
本⽂将会针对最简单的案例讲述Unity3D的碰撞规律。
1 碰撞规律⾸先在场景中创建⼀个Sphere和⼀个Cube,它们都是默认带有碰撞器的。
如果要让物体受到物理控制,需要给它添加⼀个刚体组件。
这时,物体将会受到重⼒影响,并且能够与其他物体碰撞。
碰撞器的分类碰撞器按外形可以分为BoxCollider、SphereCollider、CapsuleCollider、WheelCollider、MeshCollider等。
这⾥我们以Box和Sphere 的Collider作为实例来展开叙述。
刚体只带有碰撞器⽽没有刚体的物体,⾃⼰是不能响应物体⾏为的。
这类成为静态碰撞器,适合作为墙体、地⾯和其他不动的物体。
当给物体添加了刚体后,物体就可以接受⼒和⼒矩,产⽣接近真实物体的表现。
需要注意的是,如果要让两个物体发⽣碰撞,⾄少有⼀个物体要带有刚体组件。
刚体组件中的Mass是质量,Drag和Angular Drag是阻⼒和⾓阻⼒,这些数值都是可以影响碰撞效果的。
UseGravity是重⼒开关,打开就会响应重⼒,关闭则不响应。
IsKinematic是运动学开关,如果启⽤,物体将不受物理引擎驱动,只能通过Transform来操作。
下⾯的CollisionDetection默认是Discrete(不连续检测)。
最下⾯是Constraints,可以设置限制刚体的运动。
2 碰撞实例为了检测碰撞和物体开关,需要把下⾯的collider.cs脚本绑定到Cube上。
using UnityEngine;using System.Collections;public class collider : MonoBehaviour {// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {}//碰撞检测void OnCollisionEnter(Collision colliderInfo){Debug.Log(+"撞过来了!");}void OnCollisionExit(Collision colliderInfo){Debug.Log( + "结束碰撞!");}void OnCollisionStay(Collision colliderInfo){Debug.Log( + "处于碰撞中!");}//物理开关void OnTriggerEnter(Collider collider){Debug.Log("Trigger: "+ +"进⼊!");}void OnTriggerExit(Collider collider){Debug.Log("Trigger: " + + "离开!");}void OnTriggerStay(Collider collider){Debug.Log("Trigger: " + + "触发中!");}}对于已经创建好的Cube和Sphere,它们⾃⾝就是带有碰撞器的,我们给这两个物体加上刚体。
Bullet物理引擎中文文档英文文档正在更新中详情查看Wiki和论坛()© 2009 Erwin CoumansAll Rights Reserved.翻译:五行谦饼Email:cqw1022@目录1. 简介 (3)1.1. 类库描述 (3)1.2. 2.74版新添加的元素 (3)1.3. 计划 (3)1.4. 主要特性 (3)1.5. 联系和支持 (3)2. 快速入门 (3)3. 类库概述 (4)3.1. 简介 (4)3.2. 软件设计 (4)3.3. 刚体物理管线 (4)3.4. 整体概貌 (5)3.5. 基本数据类型和数学类库 (5)3.6. 内存管理、分配和容器 (6)3.7. 时间和性能分析 (7)3.8. 调试画图 (7)4. Bullet的碰撞检测 (7)4.1. 碰撞检测 (7)4.2. 碰撞图形 (8)4.3. 凸原始图元 (9)4.4. 复合图形 (9)4.5. 凸核图形 (9)4.6. 凹三角网格 (9)4.7. 凸分解 (9)4.8. 高度场 (9)4.9. Buttle的静态平面(btStaticPlane)图形 (9)4.10. 碰撞图形缩放 (9)4.11. 碰撞边框 (9)1.简介1.1.类库描述Bullet物理引擎是开源的,专业的集刚体、软体和碰撞检测于一身的动力学类库。
在Zlib授权下用户可以免费用于商业开发。
1.2. 2.74版新添加的元素1.3.计划1.4.主要特性1)在Zlib授权中使用开源的C++代码,可免费用于包括PLAYSTATION 3, XBox 360, Wii, PC, Linux, Mac OSX and iPhone平台的商业开发。
2)包括射线和凸扫测试在内的离散和连续碰撞检测,可检测的碰撞物体形状包括凹凸网格和所有的基本形状。
3)快速和稳定的刚体动力约束和求解、动态车辆、人物控制和滑动器、铰链、普通的6自由度和针对碎布木偶的圆锥和扭曲约束。
ammo物理引擎用法什么是ammo物理引擎?ammo物理引擎是一种基于开放源代码的物理引擎,开发者可将其用于创建真实的物理效果,从而增强3D图形应用程序的交互性。
ammo物理引擎最初是由Bullet物理引擎的开发团队创建的,目的是将Bullet引擎移植到Web平台上。
目前,ammo物理引擎已成为游戏开发和模拟器应用程序中广泛使用的物理引擎之一。
安装ammo物理引擎要使用ammo物理引擎,首先需要安装它。
以下是在Web平台上安装ammo物理引擎的步骤:1. 下载ammo物理引擎源代码:访问ammo.js的GitHub仓库(2. 创建一个HTML文件:在你喜欢的编辑器中,创建一个新的HTML文件,并将其保存为.html文件。
3. 引入ammo物理引擎:在HTML文件的头部部分,使用`<script>`标签引入ammo物理引擎代码。
在此之前,你需要在相同的文件夹中创建一个名为`build`的文件夹,并将下载的ammo物理引擎源代码中的`ammo.js`和`ammo.wasm.js`文件放入其中。
接下来,你需要设置ammo物理引擎的运行环境。
可以将下面的代码复制粘贴到你的HTML文件中:html<script>let Ammo;let Module;创建一个全局变量"Module",该变量存储ammo物理引擎的所有功能Module = {onRuntimeInitialized: function() {Ammo = self.Ammo;}};</script><! 引入ammo物理引擎的必要文件><script src="build/ammo.js"></script><script src="build/ammo.wasm.js"></script>创建应用程序现在,你已经成功安装了ammo物理引擎,并为其设置了运行环境。
虚拟现实技术中的模拟物理引擎指南虚拟现实(Virtual Reality,简称VR)技术在近年来得到了广泛的应用和发展。
通过模拟环境和交互系统,VR技术能够让用户感受到身临其境的虚拟世界,为娱乐、教育、医疗等领域带来了新的可能性。
在虚拟现实技术中,模拟物理引擎是至关重要的组成部分,它能够模拟物体的运动、碰撞、重力等物理现象,为虚拟世界的真实感和交互性提供了基础。
本文将介绍虚拟现实技术中的模拟物理引擎的基本原理和常见的应用,以及一些开发者可能会遇到的挑战和解决方案。
模拟物理引擎的基本原理模拟物理引擎是一种软件工具,用于模拟和计算虚拟世界中物体的运动和相互作用。
它基于牛顿力学和其他物理学原理,通过数学模型和算法来模拟物体的运动轨迹、碰撞效果、重力影响等。
常见的物理引擎包括Unity中的PhysX、Unreal Engine中的NVIDIA PhysX等。
这些物理引擎能够让开发者在虚拟现实应用中轻松实现真实感十足的物理效果。
在模拟物理引擎中,物体的运动可以通过牛顿第二定律来描述,即F=ma,力等于质量乘以加速度。
物理引擎会根据这个原理计算物体在空间中的位置和速度,以及它与其他物体之间的相互作用。
此外,模拟物理引擎还会考虑空气阻力、摩擦力、弹性碰撞等因素,从而实现更加真实的物理效果。
常见的应用场景模拟物理引擎在虚拟现实技术中有着广泛的应用。
在虚拟游戏中,物理引擎能够让游戏角色和物体的运动更加真实,增强游戏的沉浸感和代入感。
此外,模拟物理引擎还可以应用在虚拟培训、医疗模拟、建筑设计等领域,为用户提供更加逼真的体验和交互。
在虚拟现实游戏中,模拟物理引擎能够实现各种引人入胜的物理效果。
比如,可以模拟不同材质的表面摩擦力,让角色在不同地形上的移动更加真实。
此外,还可以模拟不同质量和形状的物体之间的碰撞和互动,为玩家带来更加丰富的游戏体验。
在虚拟培训和医疗模拟中,模拟物理引擎可以模拟真实世界中的物理现象,让学习者和医生能够在虚拟环境中进行实践和培训。
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 <iostream>int main (){std::cout << "Hello World!" << std::endl;return 0;}[edit]创建世界现在我们要添加一个子弹(Bullet)模拟. 首先写入以下语句:#include <btBulletDynamicsCommon.h>我们想把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 = newbtAxisSweep3(worldAabbMin,worldAabbMax,maxProxies);该broadphase是一个极好的空间以消除不应碰撞的成队物体. 这是为了提高运行效率.您可以使用碰撞调度注册一个回调,过滤器重置broadphase代理,使碰撞系统不处理系统的其它无用部分. 更多信息请看Collision Things.碰撞配置可以让你微调算法用于全部(而不是不是broadphase )碰撞检测。
这个方面现在还属于研究阶段!btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();btCollisionDispatcher* dispatcher = newbtCollisionDispatcher(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 <btBulletDynamicsCommon.h>#include <iostream>int main () {std::cout << "Hello World!" << std::endl;// Build the broadphaseint maxProxies = 1024;btVector3 worldAabbMin(-10000,-10000,-10000);btVector3 worldAabbMax(10000,10000,10000);btAxisSweep3* broadphase = newbtAxisSweep3(worldAabbMin,worldAabbMax,maxProxies);// 设置好碰撞属性和调度btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();btCollisionDispatcher* dispatcher = newbtCollisionDispatcher(collisionConfiguration);// 实际上的物理模拟器btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver;// 世界.btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase,solver,collisionConfigu ration);// 这里做一些你想做的事// 作为一个好的编程习惯做好删除工作delete dynamicsWorld;delete solver;delete dispatcher;delete collisionConfiguration;delete broadphase;return 0;}[edit]碰撞包围体我们将创造一个接地平面[静态刚体] ,和一个球体,将属于在地上[动态刚体] 。
每个刚体需要参考碰撞包围体. 碰撞包围体只解决碰撞检测问题, 因此没有质量,惯性,恢复原状等概念. 如果您有许多代理,使用相同的碰撞形状[例如每飞船模拟是一个5单元半径范围]。
这是个好做法,只有一个子弹形状的碰撞,并分享它在所有这些代理. 但是我们这里的两个刚体形状都不一样,所以他们需要各自的shape.地面通常是向上的并且里原始点1米的样子. 地面会和远点交叉,但子弹不允许这样做,因此,我们将抵消它的1米和用来弥补,当我们把刚体设置好以后。
.btCollisionShape* groundShape = newbtStaticPlaneShape(btVector3(0,1,0),1);我们将让它从天上掉下来,它是一个球体,半径为1米.btCollisionShape* fallShape = new btSphereShape(1);这里需要做碰撞形状的清理工作.[edit]刚体在,我们可以添加形状的碰撞到我们的现场,并将它们定位.让我们先初始化地面. 它的方向是特定的, 子弹的四元数形式 x,y,z,w . 位置在地面下一米, 将要补充一米我们不得不做的. 运动状态在这里可以得到详细的说明: MotionStatesbtDefaultMotionState* groundMotionState =newbtDefaultMotionState(btTransform(btQuaternion(0,0,0,1),btVector3(0,-1 ,0)));在第一个和最后一个参数,在下面的构造函数中是质量和地表的惯性. 由于地面是静止的所以我们把它设置成0. 固定不动的物体,质量为0 -他是固定的.btRigidBody::btRigidBodyConstructionInfogroundRigidBodyCI(0,groundMotionState,groundShape,btVector3(0,0,0)); btRigidBody* groundRigidBody = newbtRigidBody(groundRigidBodyCI);最后我们把地面加到世界中:dynamicsWorld->addRigidBody(groundRigidBody);新增下跌领域非常相似。
我们将其置于50米以上的地面.btDefaultMotionState* fallMotionState =newbtDefaultMotionState(btTransform(btQuaternion(0,0,0,1),btVector3(0,50 ,0)));由于它是动态刚体,我们将给予质量1公斤。