GEOLO的专栏

专注于android开发

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来表示是否防止旋转,支持方法:

阅读更多
想对作者说点什么? 我来说一句

CSS那些事儿.pdf 高清下载

2013年04月03日 34.76MB 下载

明朝那些事儿.mobi

2017年05月31日 4.34MB 下载

IT项目管理那些事儿.pdf

2015年01月29日 68.12MB 下载

黑金 FPGA那些事儿 (系列)

2018年03月17日 8.31MB 下载

UML那些事儿.pdf

2013年06月17日 29.62MB 下载

CSS那些事儿.pdf

2018年01月15日 71.44MB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭