Box2d那些事儿(1)

转自:http://hi.baidu.com/goodlad/blog/item/80e8613680381acba2cc2beb.html


一、 HelloWorld

  开始之前,我假想你已经看过了HelloWorld的源代码,并看了用户手册中关于HelloWorld的相关说明,而且已经大致明白了大多数内容。

  其实HelloWorld已经用极其简单的语言向你描述了Box2D物理引擎的运作机制,我们可以归纳一下步骤:

  1、 建立一个世界,这个世界基于一个b2AABB框,并设立了一个g值和一个是否允许休眠的bool型变量。

  2、 建立一个静态刚体地表,这里讲述了定义Box2D物理引擎中最为重要的一个东西——刚体的详细过程:首先是定义一个形状(可以是复合形状,这个在第二部分讲述),然后把形状通过AddShape添加进刚体定义,创建这个刚体。

  3、 重复创建刚体这个过程,直至你没有需求了。

  4、 在你的循环中加入世界的更新函数。

  其实上面的步骤也是众多物理引擎甚至于其他引擎采用的方式。

  HelloWorld教程是相当简单的,这个时候你甚至都不用去想世界是怎么运作的,你可以利用相关函数取得刚体的位置和旋转角度,然后在游戏的渲染部分去更新渲染你的角色对象。

  看完HelloWorld,你可以不去想整个世界是怎样的,因为这个世界相对这时的你来说,确实是太复杂了,而你静下心来时,不妨回头看看我们用到的概念和数据类型,来温顾一下。

  概念

  在这一个例子中有几个概念,

  世界(b2World):世界就是一个环境,所有物理运算都在这个里面进行。

  形状定义(b2ShapeDef):形状定义是什么?说简单点形状定义就是定义你这个对象的样子,它用来做什么?就是用来确定你的碰撞。

  刚体定义(b2BodyDef):刚体定义就是设定刚体的初始具体,在目前来说,最大的功能就是把你定义好的形状加到你想到的刚体上。

  刚体(b2Body):刚体就是物理引擎里面的东西(对象),它可以受力的作用进行当前位置的变化旋转等。你要在世界中使用的所有物体目前来说都是刚体。

  类型定义

  几个类型定义(熟悉Box2D里面的类型定义可以对我们将来正确赋值运算有着很大的帮助):

  typedef signed char int8;

  typedef signed short int16;

  typedef signed int int32;

  typedef unsigned char uint8;

  typedef unsigned short uint16;

  typedef unsigned int uint32;

  typedef float float32;

  const float32 b2_pi = 3.14159265359f;

  数据类型

  1、 b2Vec2

  就像在3D中Vector3类的使用一样,b2Vec2在Box2D中也应用广泛,你几乎在每个时刻都用到它,比如说定义坐标位置,定义Box大小等

  b2Vec2是由float32类型的x,y组成,支持负向量,+=,-=,*=操作符,

  支持的方法有

  Void SetZero();设置x,y为0

  Void Set(float32 x_, float32 y_);设置x,y为指定值

  b2Vec2 Make(float32 x_, float32 y_),生成一个值指定的b2Vec2

  float32 Length()取得向量的长度或模

  float32 Normalize()标准化向量

  bool IsValid()检查是否有效

  如果在这里你并不了解我在这里所提到的一些数学概念,比如说标准化向量,模,可以参照b2Math.h文件,或者直接找本数学书来看。

  2、b2Mat22

  在HelloWorld教程中,b2Mat22虽然没有被使用到,我们这里先提出这个概念,以便于在下一节中讨论。

  其实b2Mat22一个由两个b2Vec2组成的2*2方阵,你可以直接由两个b2Vec2(col1、col2)构造或者由一个角度值构造。

  他的主要方法有:

  void Set(const b2Vec2& c1, const b2Vec2& c2)

  void Set(float32 angle),

  提供两种方式赋值方法

  void SetIdentity(),设定恒等式

  void SetZero(),把col1、col2的x,y都清为0

  b2Mat22 Invert(),转换相关数据

  b2Vec2 Solve(const b2Vec2& b),解决A * x = b

  3、b2AABB

  b2AABB就是一个盒子,是由两个向量组成,一个为minVertex是最小顶点,另一个为maxVertex是最大顶点,通过这两个顶点来表示最为普通的AABB框。

  4、b2ShapeDef

  b2ShapeDef直翻为形状定义,它用一个b2ShapeType型量type来表示形状类型,用函数指针来表示用户数据(userdata),用一个b2Vec2向量localPosition来表示当前位置,用float32的localRotation来表示当前角度,用float32的 friction、density、restitution来表示摩擦力、密度、弹性系数,用uint16的categoryBits和maskBits 来表示碰撞位及位标识(可以用来过滤一些碰撞),用int16的groupIndex来表示组号,这个组号可以用来过滤还比位标识优先。

  相关常量

  enum b2ShapeType

  {

  e_unknownShape = -1,

  e_circleShape,

  e_boxShape,

  e_polyShape,

  e_meshShape,

  e_shapeTypeCount,

  };

  相关形状定义

  b2CircleDef继承于b2ShapeDef,type 为 e_circleShape,另外带有一个类型为float32的量radius来表示半径值。

  b2BoxDef继承于b2ShapeDef,type 为 e_ boxShape,另外带有一个类型为b2Vec2的量extents来表示区域值。

  b2PolyDef继承于b2ShapeDef,type 为 e_ polyShape,另外带有一个类型为b2Vec2的数组vertices来表示顶点,并带有一个int32型的量vertexCount来表示顶点数,目前顶点数最多支持8个。

  5、b2BodyDef

  b2BodyDef是刚体定义结构,由一个函数指针userData来表示用户数据,一组类型为b2ShapeDef*指针数组shapes来表示形状队列,目前形状数最大支持64个,用一个b2Vec2向量position来表示当前位置,用类型为float32的量rotation来表示当前角度,用类型为b2Vec2的量linearVelocity表示线速度,用类型为float32的angularVelocity来表示角速度,用类型为 float32的量linearDamping来表示线性阻尼,用类型为float32的量angularDamping来表示角阻抗,用类型为bool 的allowSleep 来表示是否可以允许休眠,用一个类型为bool的isSleeping来表示是否正在休眠,用一个类型为bool的量preventRotation来表示是否防止旋转,支持方法:

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值